Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq ''' ''' TODO: ''' - Test and check if all screens has been passed thru this class ''' - Do a QA build for the QA team and check over everything before translation team gets the files ''' - Future todo: Pass dialog thru the localization class ''' 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 CurrentLanguage As String) LocalizationTokens.Clear() Localization.CurrentLanguage = CurrentLanguage Logger.Debug("Loaded language [" & CurrentLanguage & "]") LoadTokenFile(GameMode.DefaultLocalizationsPath, False) If GameModeManager.GameModeCount > 0 Then Dim GameModeLocalizationPath As String = GameModeManager.ActiveGameMode.LocalizationsPath If GameModeLocalizationPath <> GameMode.DefaultLocalizationsPath Then LoadTokenFile(GameModeLocalizationPath, True) End If End If End Sub Public Shared Sub ReloadGameModeTokens() For i = 0 To LocalizationTokens.Count - 1 If i <= LocalizationTokens.Count - 1 Then Dim Token As Token = LocalizationTokens.Values(i) If Token.IsGameModeToken = True Then LocalizationTokens.Remove(LocalizationTokens.Keys(i)) i -= 1 End If End If Next If GameModeManager.GameModeCount > 0 Then Dim GameModeLocalizationPath As String = GameModeManager.ActiveGameMode.LocalizationsPath If GameModeLocalizationPath <> GameMode.DefaultLocalizationsPath Then LoadTokenFile(GameModeLocalizationPath, True) End If End If Logger.Debug("---Reloaded GameMode Tokens---") End Sub Private Shared Sub LoadTokenFile(ByVal path As String, ByVal IsGameModeFile As Boolean) Dim FullPath As String = GameController.GamePath & path Dim LocaleFilePath As String = FullPath & CurrentLanguage & ".json" Dim DefaultLanguagePath As String = FullPath & "en.json" Logger.Debug("Localization.vb: LocaleFilePath: " & LocaleFilePath) If Directory.GetFiles(FullPath).Count > 0 Then If File.Exists(LocaleFilePath) = False Then Logger.Debug("Localization.vb: Could not find file for: " & CurrentLanguage) CurrentLanguage = "en" End If If File.Exists(LocaleFilePath) = True Then Logger.Debug("Localization.vb: Found file for suffix: " & CurrentLanguage) Dim TokensFile As JObject = JObject.Parse(File.ReadAllText(LocaleFilePath)) Dim SelectedLanguage As String = TokensFile.SelectToken("language_name").ToString Logger.Debug("Localization.vb: Loaded Language file and its name is: " & SelectedLanguage) For Each tokens In TokensFile.SelectToken("p3d").Values ParseTokens(tokens, SelectedLanguage, IsGameModeFile) Next End If If CurrentLanguage IsNot "en" Then If File.Exists(DefaultLanguagePath) Then Dim FallbackTokensFile As JObject = JObject.Parse(File.ReadAllText(DefaultLanguagePath)) Dim SelectedLanguage As String = FallbackTokensFile.SelectToken("language_name").ToString Logger.Debug("Localization.vb: Loaded Fallback Language file and its name is: " & SelectedLanguage) For Each tokens In FallbackTokensFile.SelectToken("p3d").Values ParseTokens(tokens, SelectedLanguage, IsGameModeFile) Next End If End If End If End Sub Private Shared Sub ParseTokens(ByVal token As JToken, ByVal SelectedLanguage As String, ByVal IsGameModeFile As Boolean) If token.HasValues = True Then For Each child In token.Values ParseTokens(child, SelectedLanguage, IsGameModeFile) Next Else Dim key As String = token.Path.ToLower().Replace("p3d.", "") Dim value As String = token.Parent.First.ToString If LocalizationTokens.ContainsKey(key) = False Then LocalizationTokens.Add(key, New Token(value, SelectedLanguage, IsGameModeFile)) End If End If End Sub Public Shared Function Translate(ByVal tokenInput As String, Optional ByVal DefaultValue As String = "", Optional ByVal type As Type = Nothing) As String Dim resultToken As Token = Nothing Dim CurrentScreen As String = GetCurrentScreen() tokenInput = tokenInput.ToLower().Replace(" ", "_").Replace("'", "").Replace("p3d.", "").Replace("._", "_") ' Lets format the string before finding it Dim prefix As String = "" If type Is Nothing Then prefix = CurrentScreen Else prefix = type.Name.ToString.ToLower End If Dim NewTokenName As String = prefix & "." & tokenInput If tokenInput.Contains(".") = False Then 'Logger.Debug("Localization.vb: tokenInput.Contains: " & tokenInput) tokenInput = NewTokenName End If If LocalizationTokens.ContainsKey(tokenInput) = True Then If LocalizationTokens.TryGetValue(tokenInput, resultToken) = False Then Return tokenInput Else Dim result As String = resultToken.TokenContent If Core.Player IsNot Nothing Then result = result.Replace("", Core.Player.Name) result = result.Replace("", Core.Player.RivalName) End If If result.Contains("~") Then result = result.Replace("~", Environment.NewLine) End If Return result End If Else Dim FullPath As String = GameController.GamePath & GameMode.DefaultLocalizationsPath Dim LocaleFilePath As String = FullPath & "missing_tokens.json" Dim TokensFile As JObject = JObject.Parse(File.ReadAllText(LocaleFilePath)) If TokensFile.ContainsKey(tokenInput) = False Then TokensFile.Add(tokenInput, tokenInput) End If File.WriteAllText(LocaleFilePath, JsonConvert.SerializeObject(TokensFile, Formatting.Indented)) If DefaultValue = "" Then Return tokenInput Else Return DefaultValue End If End If End Function Public Shared Function TokenExists(ByVal TokenName As String) As Boolean Return LocalizationTokens.ContainsKey(TokenName) End Function Public Shared Function GetCurrentScreen() As String Dim CurrentScreen As String = Core.CurrentScreen.ToString.ToLower() If CurrentScreen.Contains("+") Then CurrentScreen = CurrentScreen.Split("+").Last.ToString End If Return CurrentScreen.Replace("p3d.", "") End Function Public Shared Function GetAvailableLanguagesList() As Dictionary(Of Integer, String) Dim FullPath As String = GameController.GamePath & GameMode.DefaultLocalizationsPath Dim AvailableLanguages As New Dictionary(Of Integer, String) Dim i As Integer = 0 For Each TokenFile In IO.Directory.GetFiles(FullPath).Where(Function(f) Not IO.Path.GetFileName(f).Equals("missing_tokens.json")) Dim json As JObject = JObject.Parse(File.ReadAllText(TokenFile)) Dim SelectedLanguage As String = json.SelectToken("language_name").ToString AvailableLanguages.Add(i, SelectedLanguage) i += 1 'Logger.Debug("Localization.vb: GetAvailableLanguagesList: " & SelectedLanguage) Next Return AvailableLanguages End Function Public Shared Function GetLanguageName(ByVal lang As String) As String Dim FullPath As String = GameController.GamePath & GameMode.DefaultLocalizationsPath Dim LanguageNames As New Dictionary(Of String, String) For Each TokenFile In IO.Directory.GetFiles(FullPath).Where(Function(f) Not IO.Path.GetFileName(f).Equals("missing_tokens.json")) Dim iso = IO.Path.GetFileName(TokenFile).Replace(".json", "") Dim json As JObject = JObject.Parse(System.IO.File.ReadAllText(TokenFile)) Dim name As String = json.SelectToken("language_name").ToString LanguageNames.Add(iso, name) Next 'Logger.Debug("Localization.vb: GetLangugageName: " & lang & " / " & LanguageNames.Item(lang)) Return LanguageNames.Item(lang) End Function Public Shared Function GetLanguageISO(ByVal lang As String) As String Dim FullPath As String = GameController.GamePath & GameMode.DefaultLocalizationsPath Dim LanguageISOs As New Dictionary(Of String, String) For Each TokenFile In IO.Directory.GetFiles(FullPath).Where(Function(f) Not IO.Path.GetFileName(f).Equals("missing_tokens.json")) Dim iso = IO.Path.GetFileName(TokenFile).Replace(".json", "") Dim json As JObject = JObject.Parse(System.IO.File.ReadAllText(TokenFile)) Dim name As String = json.SelectToken("language_name").ToString LanguageISOs.Add(name, iso) Next 'Logger.Debug("Localization.vb: GetLanguageISO: " & lang & " / " & LanguageISOs.Item(lang)) Return LanguageISOs.Item(lang) End Function End Class Public Class Token Private _TokenContent As String = "" Private _TokenCurrentLanguage As String = "en" Private _IsGameModeToken As Boolean = False Public Sub New(ByVal TokenContent As String, ByVal TokenCurrentLanguage As String, ByVal IsGameModeToken As Boolean) Me._IsGameModeToken = IsGameModeToken Me._TokenContent = TokenContent Me._TokenCurrentLanguage = TokenCurrentLanguage End Sub Public Property TokenContent() As String Get Return Me._TokenContent End Get Set(value As String) Me._TokenContent = value End Set End Property Public Property TokenCurrentLanguage() As String Get Return Me._TokenCurrentLanguage End Get Set(value As String) Me._TokenCurrentLanguage = value End Set End Property Public Property IsGameModeToken() As Boolean Get Return Me._IsGameModeToken End Get Set(value As Boolean) Me._IsGameModeToken = value End Set End Property End Class