Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
4564e21
NuGet
XTsat Dec 29, 2025
f30d368
i18n support
XTsat Dec 29, 2025
bb402f1
i18n optimize
XTsat Dec 30, 2025
d7fc933
i18n optimize
XTsat Dec 30, 2025
c08025b
i18n optimize
XTsat Dec 30, 2025
aa49e47
Optimize key value
XTsat Jan 1, 2026
0afd917
i18n Complete
XTsat Jan 1, 2026
cff4d19
i18n Complete
XTsat Jan 1, 2026
1e3be73
Merge branch 'master' of https://github.com/XTsat/CompactGUI
XTsat Jan 1, 2026
0717dd8
bug fix
XTsat Jan 1, 2026
e71cdc9
Update Readme
XTsat Jan 1, 2026
a2efa4d
Version bump
XTsat Jan 20, 2026
3ed6d65
Use LocalData
XTsat Jan 20, 2026
e8b6e8b
Merge pull request #1 from XTsat/UpDate-Readme
XTsat Jan 20, 2026
15c42bb
Merge branch 'master' into AppFolder
XTsat Jan 20, 2026
b736063
Merge pull request #2 from XTsat/AppFolder
XTsat Jan 20, 2026
57fae52
add russian translation file
Blueberryy Mar 24, 2026
d5c6dbe
add russian language
Blueberryy Mar 24, 2026
709fd8a
remove language from readme urls to auto-detect user language
Blueberryy Mar 24, 2026
8b143c8
add russian readme
Blueberryy Mar 24, 2026
4117484
Update README_ru.md
Blueberryy Mar 24, 2026
9464a65
add link to ru readme
Blueberryy Mar 24, 2026
4321f3c
add link to ru readme
Blueberryy Mar 24, 2026
4cfcb98
add link to ru readme
Blueberryy Mar 24, 2026
58bb415
Merge pull request #3 from Blueberryy/master
XTsat Mar 30, 2026
c0a03a0
i18n russian
XTsat Mar 30, 2026
9656aee
Merge branch 'master' of https://github.com/XTsat/CompactGUI_i18n
XTsat Mar 30, 2026
2b3290a
v4.0.0-beta.9
XTsat Mar 30, 2026
44aa15c
i18n SizeUnit
XTsat Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -367,3 +367,4 @@ FodyWeavers.xsd
# IntelliJ
.idea/
/CompactGUI.WatcherCS
/.history
14 changes: 12 additions & 2 deletions CompactGUI/Application.xaml.vb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Imports System.IO
Imports System.IO
Imports System.IO.Pipes
Imports System.Threading
Imports System.Windows.Threading
Expand All @@ -17,7 +17,13 @@ Imports Coravel.Scheduling.Schedule

Partial Public Class Application

Public Shared ReadOnly AppVersion As New SemVersion(4, 0, 0, "beta", 6)
Public Shared ReadOnly AppVersion As New SemVersion(4, 0, 0, "beta", 9)

Public Shared ReadOnly Property AppVersionText As String
Get
Return AppVersion.ToString()
End Get
End Property

Private Shared _host As IHost

Expand All @@ -31,7 +37,11 @@ Partial Public Class Application

End Sub

Private Sub Application_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
' Call the language configuration at startup
LanguageHelper.Initialize()

End Sub
Private Shared Sub InitializeHost()

_host = Host.CreateDefaultBuilder() _
Expand Down
26 changes: 24 additions & 2 deletions CompactGUI/CompactGUI.vbproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,13 @@
<Copyright>Copyright © 2025</Copyright>
<PackageProjectUrl>https://github.com/IridiumIO/CompactGUI/</PackageProjectUrl>
<ApplicationIcon>icon.ico</ApplicationIcon>


<EnableCompressionInSingleFile>false</EnableCompressionInSingleFile>

<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
Expand All @@ -29,7 +35,6 @@
<DebugType>none</DebugType>
</PropertyGroup>


<ItemGroup>
<Import Include="System.Windows" />
<Import Include="System.Windows.Controls" />
Expand All @@ -46,6 +51,7 @@
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Coravel" Version="6.0.2" />
<PackageReference Include="diskdetector-net" Version="0.3.2" />
<PackageReference Include="FunctionalConverters" Version="0.1.0" />
<PackageReference Include="Gameloop.Vdf" Version="0.6.2" />
<PackageReference Include="IridiumIO.MVVM.VBSourceGenerators" Version="0.6.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.7" />
Expand All @@ -71,6 +77,22 @@
</Reference>
</ItemGroup>

<ItemGroup>
<Compile Update="i18n\i18n.Designer.vb">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>i18n.resx</DependentUpon>
</Compile>
</ItemGroup>

<ItemGroup>
<EmbeddedResource Update="i18n\i18n.resx">
<CustomToolNamespace>i18n</CustomToolNamespace>
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>i18n.Designer.vb</LastGenOutput>
</EmbeddedResource>
</ItemGroup>

<Target Name="RenamePublishedExe" AfterTargets="Publish" Condition="'$(IsMonolithic)' == 'true'">
<Move SourceFiles="$(PublishDir)CompactGUI.exe" DestinationFiles="$(PublishDir)CompactGUI.mono.exe" />

Expand Down
34 changes: 22 additions & 12 deletions CompactGUI/Components/Converters/IValueConverters.vb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Imports System.Globalization
Imports System.Globalization

Public Class DecimalToPercentageConverter : Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
Expand All @@ -16,7 +16,16 @@ End Class

Public Class BytesToReadableConverter : Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
Dim suf As String() = {" B", " KB", " MB", " GB", " TB", " PB", " EB"}

Dim suf As String() = {
LanguageHelper.GetString("SizeUnit_B"),
LanguageHelper.GetString("SizeUnit_KB"),
LanguageHelper.GetString("SizeUnit_MB"),
LanguageHelper.GetString("SizeUnit_GB"),
LanguageHelper.GetString("SizeUnit_TB"),
LanguageHelper.GetString("SizeUnit_PB"),
LanguageHelper.GetString("SizeUnit_EB")
}

If value = 1010101010101010 Then Return "?"

Expand Down Expand Up @@ -88,20 +97,21 @@ End Class

Public Class RelativeDateConverter : Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert

Dim dt = CType(value, DateTime)
Dim ts As TimeSpan = DateTime.Now - dt

If ts > TimeSpan.FromDays(19000) Then
Return String.Format("Unknown")
Return LanguageHelper.GetString("Time_Unknown")
End If
If ts > TimeSpan.FromDays(2) Then
Return String.Format("{0:0} days ago", ts.TotalDays)
Return String.Format(LanguageHelper.GetString("Time_DaysAgo"), ts.TotalDays)
ElseIf ts > TimeSpan.FromHours(2) Then
Return String.Format("{0:0} hours ago", ts.TotalHours)
Return String.Format(LanguageHelper.GetString("Time_HoursAgo"), ts.TotalHours)
ElseIf ts > TimeSpan.FromMinutes(2) Then
Return String.Format("{0:0} minutes ago", ts.TotalMinutes)
Return String.Format(LanguageHelper.GetString("Time_MinutesAgo"), ts.TotalMinutes)
Else
Return "just now"
Return LanguageHelper.GetString("Time_Now")
End If
End Function

Expand Down Expand Up @@ -290,15 +300,15 @@ Public Class FolderStatusToStringConverter : Implements IValueConverter
Dim status = CType(value, ActionState)
Select Case status
Case ActionState.Idle
Return "Awaiting Compression"
Return LanguageHelper.GetString("Status_AwaitingCompression")
Case ActionState.Analysing
Return "Analysing"
Return LanguageHelper.GetString("Status_Analysing")
Case ActionState.Working, ActionState.Paused
Return "Working"
Return LanguageHelper.GetString("Status_Working")
Case ActionState.Results
Return "Compressed"
Return LanguageHelper.GetString("Status_Compressed")
Case Else
Return "Unknown"
Return LanguageHelper.GetString("Status_Unknown")
End Select
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
Expand Down
11 changes: 7 additions & 4 deletions CompactGUI/Components/Settings/Settings_skiplistflyout.xaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<ui:FluentWindow x:Class="Settings_skiplistflyout"
<ui:FluentWindow x:Class="Settings_skiplistflyout"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Expand Down Expand Up @@ -45,7 +45,8 @@
<Grid x:Name="MainGrid">
<ui:TitleBar Panel.ZIndex="10"
ShowMaximize="False" ShowMinimize="False" />
<TextBlock Text="edit skipped filetypes"
<TextBlock Text="{local:Localize SetFiletypeManagement_LocalSkipFiletypesEdit}"
d:Text="edit skipped filetypes"
Margin="10"
FontSize="22" FontWeight="SemiBold" />
<local:TokenizedTextBox x:Name="UiTokenizedText"
Expand All @@ -64,12 +65,14 @@
</local:TokenizedTextBox>

<Button x:Name="UiSave"
Content="Save"
Content="{local:Localize UniSave}"
d:Content="Save"
Width="100"
Margin="0,0,130,20" HorizontalAlignment="Right" VerticalAlignment="Bottom"
Click="UISave_Click" />
<Button x:Name="UiReset"
Content="Reset"
Content="{local:Localize UniReset}"
d:Content="Reset"
Width="100"
Margin="0,0,10,20" HorizontalAlignment="Right" VerticalAlignment="Bottom"
Click="UIReset_Click" />
Expand Down
140 changes: 140 additions & 0 deletions CompactGUI/LanguageHelper.vb
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
Imports System.Globalization
Imports System.Resources
Imports System.Threading
Imports System.Windows.Markup
Imports System.Windows.Data
Imports System.Reflection

Public Class LanguageHelper
' Supported language list
' @i18n
Private Shared ReadOnly SupportedCultures As String() = {"en-US", "ru-RU", "zh-CN"}
Private Shared resourceManager As ResourceManager = i18n.i18n.ResourceManager
Private Shared currentCulture As CultureInfo = Nothing

Public Shared Function GetText(key As String) As String
Return GetString(key)
End Function

Public Shared Sub Initialize()
Dim savedLanguage As String = ReadAppConfig("language")
If Not String.IsNullOrEmpty(savedLanguage) AndAlso SupportedCultures.Contains(savedLanguage) Then
ApplyCulture(savedLanguage)
Else
SetDefaultLanguage()
End If
End Sub

Public Shared Sub ChangeLanguage()
If currentCulture Is Nothing Then
currentCulture = Thread.CurrentThread.CurrentUICulture
End If
Dim currentLang As String = currentCulture.Name
Dim nextLang As String = GetNextLanguage(currentLang)

ApplyCulture(nextLang)
WriteAppConfig("language", nextLang)
End Sub

Public Shared Function GetString(key As String, ParamArray args As Object()) As String
Try
Dim cultureToUse = If(currentCulture, Thread.CurrentThread.CurrentUICulture)
Dim rawValue As String = resourceManager.GetString(key, cultureToUse)

If String.IsNullOrEmpty(rawValue) Then
Return key
ElseIf args IsNot Nothing AndAlso args.Length > 0 Then
Return String.Format(cultureToUse, rawValue, args)
Else
Return rawValue
End If
Catch ex As Exception
Debug.WriteLine($"Failed to get multilingual text:{key},Error:{ex.Message}")
Return key
End Try
End Function

Public Shared Sub ApplyCulture(cultureName As String)
Try
Dim culture As New CultureInfo(cultureName)
Thread.CurrentThread.CurrentUICulture = culture
Thread.CurrentThread.CurrentCulture = culture
currentCulture = culture

Catch ex As Exception
Debug.WriteLine($"Application language failure:{cultureName},Error:{ex.Message}")
SetDefaultLanguage()
End Try
End Sub

Private Shared Function GetNextLanguage(currentLanguage As String) As String
Dim currentTwoLetter = New CultureInfo(currentLanguage).TwoLetterISOLanguageName
For i As Integer = 0 To SupportedCultures.Length - 1
Dim langTwoLetter = New CultureInfo(SupportedCultures(i)).TwoLetterISOLanguageName
If langTwoLetter = currentTwoLetter Then
Return SupportedCultures((i + 1) Mod SupportedCultures.Length)
End If
Next
Return SupportedCultures(0)
End Function

Private Shared Sub SetDefaultLanguage()
' Set the default language according to the system language.
'@i18n
Dim langMapping As New Dictionary(Of String, String) From {
{"en", "en-US"},
{"ru", "ru-RU"},
{"zh", "zh-CN"}
}

Dim systemLang As String = Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName.ToLower()
Dim defaultLang As String = If(langMapping.ContainsKey(systemLang), langMapping(systemLang), "en-US")

ApplyCulture(defaultLang)
WriteAppConfig("language", defaultLang)
End Sub

Public Shared Function GetCurrentLanguage() As String
Return If(currentCulture, Thread.CurrentThread.CurrentUICulture).Name
End Function

Public Shared Function ReadAppConfig(key As String) As String
Try
Dim config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None)
Return If(config.AppSettings.Settings(key)?.Value, String.Empty)
Catch ex As Exception
Debug.WriteLine($"Read configuration failed:{key},Error:{ex.Message}")
Return String.Empty
End Try
End Function

Public Shared Sub WriteAppConfig(key As String, value As String)
Try
Dim config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None)
If config.AppSettings.Settings(key) IsNot Nothing Then
config.AppSettings.Settings(key).Value = value
Else
config.AppSettings.Settings.Add(key, value)
End If
config.Save(System.Configuration.ConfigurationSaveMode.Modified)
System.Configuration.ConfigurationManager.RefreshSection("appSettings")
Catch ex As Exception
Debug.WriteLine($"Write configuration failed:{key},Error:{ex.Message}")
End Try
End Sub
End Class

<MarkupExtensionReturnType(GetType(String))>
Public Class LocalizeExtension
Inherits MarkupExtension

Private _key As String

Public Sub New(key As String)
_key = key
End Sub

Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
Return LanguageHelper.GetString(_key)
End Function
End Class
Loading