From 51a232ab3dd46fb5b0151d69a0f5316d50108bc0 Mon Sep 17 00:00:00 2001 From: "Daniel S. Billing" Date: Mon, 12 Apr 2021 21:30:40 +0200 Subject: [PATCH] Reworked the Localization to support JSON format --- P3D/HelperClasses/Localization.vb | 130 +++++++++++++++++------------- P3D/packages.config | 1 + 2 files changed, 77 insertions(+), 54 deletions(-) diff --git a/P3D/HelperClasses/Localization.vb b/P3D/HelperClasses/Localization.vb index 580a5042d..4dd5f449a 100644 --- a/P3D/HelperClasses/Localization.vb +++ b/P3D/HelperClasses/Localization.vb @@ -1,14 +1,15 @@ -Public Class Localization +Imports Newtonsoft.Json.Linq - Public Shared LanguageSuffix As String = "en" +Public Class Localization + Public Shared CurrentLanguage As String = "en" Public Shared LocalizationTokens As Dictionary(Of String, Token) = New Dictionary(Of String, Token) - Public Shared Sub Load(ByVal LanguageSuffix As String) + Public Shared Sub Load(ByVal CurrentLanguage As String) LocalizationTokens.Clear() - Localization.LanguageSuffix = LanguageSuffix + Localization.CurrentLanguage = CurrentLanguage - Logger.Debug("Loaded language [" & LanguageSuffix & "]") + Logger.Debug("Loaded language [" & CurrentLanguage & "]") LoadTokenFile(GameMode.DefaultLocalizationsPath, False) @@ -43,66 +44,75 @@ End Sub Private Shared Sub LoadTokenFile(ByVal path As String, ByVal IsGameModeFile As Boolean) - Dim fullpath As String = GameController.GamePath & path - Dim tokenFullpath As String = fullpath & "Tokens_" & LanguageSuffix & ".dat" + Dim FullPath As String = GameController.GamePath & path + Dim LocaleFilePath As String = FullPath & CurrentLanguage & ".json" + Dim DefaultLanguagePath As String = FullPath & "en.json" - Logger.Debug("Token filepath: " & tokenFullpath) + Logger.Debug("Token filepath: " & LocaleFilePath) - If System.IO.Directory.GetFiles(fullpath).Count > 0 Then - If System.IO.File.Exists(tokenFullpath) = False Then - Logger.Debug("Did NOT find token file for suffix: " & LanguageSuffix) - LanguageSuffix = "en" + If System.IO.Directory.GetFiles(FullPath).Count > 0 Then + If System.IO.File.Exists(LocaleFilePath) = False Then + Logger.Debug("Did NOT find token file for suffix: " & CurrentLanguage) + CurrentLanguage = "en" End If - If System.IO.File.Exists(tokenFullpath) = True Then - Logger.Debug("Found token file for suffix: " & LanguageSuffix) - Dim TokensFile() As String = System.IO.File.ReadAllLines(fullpath & "Tokens_" & LanguageSuffix & ".dat") - Dim splitIdx As Integer = 0 - For Each TokenLine As String In TokensFile - If TokenLine.Contains(",") = True Then - splitIdx = TokenLine.IndexOf(",") - - Dim TokenName As String = TokenLine.Substring(0, splitIdx) - Dim TokenContent As String = "" - If TokenLine.Length > TokenName.Length + 1 Then - TokenContent = TokenLine.Substring(splitIdx + 1, TokenLine.Length - splitIdx - 1) - End If - - If LocalizationTokens.ContainsKey(TokenName) = False Then - LocalizationTokens.Add(TokenName, New Token(TokenContent, LanguageSuffix, IsGameModeFile)) - End If + If System.IO.File.Exists(LocaleFilePath) = True Then + Logger.Debug("Found token file for suffix: " & CurrentLanguage) + Dim TokensFile As JObject = JObject.Parse(System.IO.File.ReadAllText(DefaultLanguagePath)) + Dim SelectedLanguage As String = TokensFile.SelectToken("language_name").ToString + Logger.Debug("Loaded Language file and its name is: " & SelectedLanguage) + For Each tokens In TokensFile.SelectToken("tokens").Values + If tokens.HasValues Then + For Each token In tokens + If token.HasValues Then + For Each subtoken In token + AddToken(token.Path, token.First.ToString, SelectedLanguage, IsGameModeFile) + Next + End If + AddToken(token.Path, token.First.ToString, SelectedLanguage, IsGameModeFile) + Next + Else + AddToken(tokens.Path, tokens.First.ToString, SelectedLanguage, IsGameModeFile) End If Next End If - If Not LanguageSuffix = "en" Then - If System.IO.File.Exists(fullpath & "Tokens_en.dat") Then - Dim FallbackTokensFile() As String = System.IO.File.ReadAllLines(fullpath & "Tokens_en.dat") - Dim splitIdx As Integer = 0 - For Each TokenLine As String In FallbackTokensFile - If TokenLine.Contains(",") = True Then - splitIdx = TokenLine.IndexOf(",") - - Dim TokenName As String = TokenLine.Substring(0, splitIdx) - Dim TokenContent As String = "" - If TokenLine.Length > TokenName.Length + 1 Then - TokenContent = TokenLine.Substring(splitIdx + 1, TokenLine.Length - splitIdx - 1) - End If - - If LocalizationTokens.ContainsKey(TokenName) = False Then - LocalizationTokens.Add(TokenName, New Token(TokenContent, "en", IsGameModeFile)) - End If + If CurrentLanguage IsNot "en" Then + If System.IO.File.Exists(DefaultLanguagePath) Then + Dim FallbackTokensFile As JObject = JObject.Parse(System.IO.File.ReadAllText(DefaultLanguagePath)) + Dim SelectedLanguage As String = FallbackTokensFile.SelectToken("language_name").ToString + Logger.Debug("Loaded Fallback Language file and its name is: " & SelectedLanguage) + For Each tokens In FallbackTokensFile.SelectToken("tokens").Values + If tokens.HasValues Then + For Each token In tokens + If token.HasValues Then + For Each subtoken In token + AddToken(token.Path, token.First.ToString, SelectedLanguage, IsGameModeFile) + Next + End If + AddToken(token.Path, token.First.ToString, SelectedLanguage, IsGameModeFile) + Next + Else + AddToken(tokens.Path, tokens.First.ToString, SelectedLanguage, IsGameModeFile) End If Next End If End If End If + + For Each lt In LocalizationTokens + If lt.Key.StartsWith("press_start") Then + Logger.Debug(lt.Key.ToString) + End If + Next + End Sub Public Shared Function GetString(ByVal s As String, Optional ByVal DefaultValue As String = "") As String Dim resultToken As Token = Nothing - s = s.Replace(" ", "_").Replace(".", "").Replace("'", "").ToLower() ' Lets format the string before finding it + s = s.Replace(" ", "_").Replace("'", "").ToLower() ' Lets format the string before finding it If LocalizationTokens.ContainsKey(s) = True Then + Logger.Debug("GetString: " + s) If LocalizationTokens.TryGetValue(s, resultToken) = False Then Return s Else @@ -122,6 +132,18 @@ End If End Function + Private Shared Function GetTokenName(ByVal s As String) As String + s = s.Replace("tokens.", "").ToLower() ' Lets format the string before finding it + Return s + End Function + + Private Shared Function AddToken(ByVal key As String, ByVal value As String, ByVal lang As String, ByVal gmfile As Boolean) As String + key = GetTokenName(key) + If LocalizationTokens.ContainsKey(key) = False Then + LocalizationTokens.Add(key, New Token(value, lang, gmfile)) + End If + End Function + Public Shared Function TokenExists(ByVal TokenName As String) As Boolean Return LocalizationTokens.ContainsKey(TokenName) End Function @@ -131,13 +153,13 @@ End Class Public Class Token Private _TokenContent As String = "" - Private _TokenLanguageSuffix As String = "en" + Private _TokenCurrentLanguage As String = "en" Private _IsGameModeToken As Boolean = False - Public Sub New(ByVal TokenContent As String, ByVal TokenLanguageSuffix As String, ByVal IsGameModeToken As Boolean) + Public Sub New(ByVal TokenContent As String, ByVal TokenCurrentLanguage As String, ByVal IsGameModeToken As Boolean) Me._IsGameModeToken = IsGameModeToken Me._TokenContent = TokenContent - Me._TokenLanguageSuffix = TokenLanguageSuffix + Me._TokenCurrentLanguage = TokenCurrentLanguage End Sub Public Property TokenContent() As String @@ -149,12 +171,12 @@ Public Class Token End Set End Property - Public Property TokenLanguageSuffix() As String + Public Property TokenCurrentLanguage() As String Get - Return Me._TokenLanguageSuffix + Return Me._TokenCurrentLanguage End Get Set(value As String) - Me._TokenLanguageSuffix = value + Me._TokenCurrentLanguage = value End Set End Property @@ -167,4 +189,4 @@ Public Class Token End Set End Property -End Class \ No newline at end of file +End Class diff --git a/P3D/packages.config b/P3D/packages.config index 7c4b6e4e6..388ebce3f 100644 --- a/P3D/packages.config +++ b/P3D/packages.config @@ -3,6 +3,7 @@ +