-
-
Notifications
You must be signed in to change notification settings - Fork 328
Expand file tree
/
Copy pathLanguageHelper.vb
More file actions
144 lines (112 loc) · 4.83 KB
/
Copy pathLanguageHelper.vb
File metadata and controls
144 lines (112 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
Imports System.ComponentModel
Imports System.Globalization
Imports System.Resources
Imports System.Threading
Imports System.Windows.Markup
Imports CompactGUI.Core.Settings
Public Class LanguageItem
Public Property Name As String
Public Property ISOCountryCode As String
Public Property CultureCode As String
End Class
Public Class LanguageHelper
' Supported language list
' @i18n
Private Shared ReadOnly SupportedCultures As String() = {"en-US", "ru-RU", "zh-CN", "es-ES", "tr-TR"}
Private Shared resourceManager As ResourceManager = i18n.i18n.ResourceManager
Private Shared currentCulture As CultureInfo = Nothing
Private Shared _applicationSettings As Settings
Public Shared Event LanguageChanged As EventHandler
Public Shared Function GetText(key As String) As String
Return GetString(key)
End Function
Public Shared Sub Initialize(applicationSettings As Settings)
_applicationSettings = applicationSettings
Dim savedLanguage = _applicationSettings.Language
If Not String.IsNullOrEmpty(savedLanguage) AndAlso SupportedCultures.Contains(savedLanguage) Then
ApplyCulture(savedLanguage)
Else
SetDefaultLanguage()
End If
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
_applicationSettings.Language = cultureName
Application.GetService(Of ISettingsService).SaveSettings()
RaiseEvent LanguageChanged(Nothing, EventArgs.Empty)
Catch ex As Exception
Debug.WriteLine($"Application language failure:{cultureName},Error:{ex.Message}")
SetDefaultLanguage()
End Try
End Sub
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"},
{"es", "es-ES"},
{"tr", "tr-TR"}
}
Dim systemLang As String = Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName.ToLower()
Dim defaultLang As String = If(langMapping.ContainsKey(systemLang), langMapping(systemLang), "en-US")
ApplyCulture(defaultLang)
End Sub
Public Shared Function GetCurrentLanguage() As String
Return If(currentCulture, Thread.CurrentThread.CurrentUICulture).Name
End Function
End Class
<MarkupExtensionReturnType(GetType(Object))>
Public Class LocalizeExtension
Inherits MarkupExtension
Implements INotifyPropertyChanged
Private ReadOnly _key As String
Public Sub New(key As String)
_key = key
AddHandler LanguageHelper.LanguageChanged, AddressOf OnLanguageChanged
End Sub
Public ReadOnly Property Value As String
Get
Return LanguageHelper.GetString(_key)
End Get
End Property
Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
Dim provideValueTarget = TryCast(serviceProvider.GetService(GetType(IProvideValueTarget)), IProvideValueTarget)
Dim targetProperty = provideValueTarget?.TargetProperty
' If target is not a DependencyProperty (e.g. Binding.StringFormat), return plain string.
If Not TypeOf targetProperty Is DependencyProperty Then
Return Value
End If
Dim binding As New Binding(NameOf(Value)) With {
.Source = Me,
.Mode = BindingMode.OneWay
}
Return binding.ProvideValue(serviceProvider)
End Function
Private Sub OnLanguageChanged(sender As Object, e As EventArgs)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Value)))
End Sub
'Future me: don't try to replace this with ObservableObject. It's cursed
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
End Class