From 5a014b093ccefed72fa09c3b19b18d4ee7578218 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 30 Mar 2014 21:00:47 -0400 Subject: add localization stub --- .../Localization/LocalizationManager.cs | 113 ++++++++++++++++++++- 1 file changed, 110 insertions(+), 3 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs') diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index 0d428742c..badf5f93c 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -1,9 +1,9 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.Serialization; using MoreLinq; using System; using System.Collections.Concurrent; @@ -11,6 +11,8 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Reflection; +using MediaBrowser.Common.Extensions; namespace MediaBrowser.Server.Implementations.Localization { @@ -33,15 +35,17 @@ namespace MediaBrowser.Server.Implementations.Localization new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); private readonly IFileSystem _fileSystem; - + private readonly IJsonSerializer _jsonSerializer; + /// /// Initializes a new instance of the class. /// /// The configuration manager. - public LocalizationManager(IServerConfigurationManager configurationManager, IFileSystem fileSystem) + public LocalizationManager(IServerConfigurationManager configurationManager, IFileSystem fileSystem, IJsonSerializer jsonSerializer) { _configurationManager = configurationManager; _fileSystem = fileSystem; + _jsonSerializer = jsonSerializer; ExtractAll(); } @@ -241,5 +245,108 @@ namespace MediaBrowser.Server.Implementations.Localization return value == null ? (int?)null : value.Value; } + + public string GetLocalizedString(string phrase) + { + return GetLocalizedString(phrase, _configurationManager.Configuration.UICulture); + } + + public string GetLocalizedString(string phrase, string culture) + { + var dictionary = GetLocalizationDictionary(culture); + + string value; + + if (dictionary.TryGetValue(phrase, out value)) + { + return value; + } + + return phrase; + } + + private readonly ConcurrentDictionary> _dictionaries = + new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); + + public Dictionary GetLocalizationDictionary(string culture) + { + const string prefix = "Server"; + var key = prefix + culture; + + return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "server.json")); + } + + public Dictionary GetJavaScriptLocalizationDictionary(string culture) + { + const string prefix = "JavaScript"; + var key = prefix + culture; + + return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "javascript.json")); + } + + private Dictionary GetDictionary(string prefix, string culture, string baseFilename) + { + var dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); + + var assembly = GetType().Assembly; + var namespaceName = GetType().Namespace + "." + prefix; + + CopyInto(dictionary, namespaceName + "." + baseFilename, assembly); + CopyInto(dictionary, namespaceName + "." + GetResourceFilename(culture), assembly); + + return dictionary; + } + + private void CopyInto(IDictionary dictionary, string resourcePath, Assembly assembly) + { + using (var stream = assembly.GetManifestResourceStream(resourcePath)) + { + if (stream != null) + { + var dict = _jsonSerializer.DeserializeFromStream>(stream); + + foreach (var key in dict.Keys) + { + dictionary[key] = dict[key]; + } + } + } + } + + private string GetResourceFilename(string culture) + { + var parts = culture.Split('-'); + + if (parts.Length == 2) + { + culture = parts[0].ToLower() + "_" + parts[1].ToUpper(); + } + else + { + culture = culture.ToLower(); + } + + return culture + ".json"; + } + + public IEnumerable GetLocalizationOptions() + { + return new List + { + new LocalizatonOption{ Name="English (United States)", Value="en-us"} + }; + } + + public string LocalizeDocument(string document, string culture, Func tokenBuilder) + { + foreach (var pair in GetLocalizationDictionary(culture).ToList()) + { + var token = tokenBuilder(pair.Key); + + document = document.Replace(token, pair.Value, StringComparison.Ordinal); + } + + return document; + } } } -- cgit v1.2.3 From c0801e4f6de87f6a14409b7f399cfd52b3ce88e8 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 30 Mar 2014 22:33:10 -0400 Subject: added web client localization --- .../Localization/ILocalizationManager.cs | 7 ++++++ .../IO/LibraryMonitor.cs | 8 ++++-- .../Localization/JavaScript/en_US.json | 21 ++++++++++++++++ .../Localization/JavaScript/javascript.json | 20 ++++++++++++++- .../Localization/JavaScript/pt_PT.json | 21 ++++++++++++++++ .../Localization/LocalizationManager.cs | 8 ++++-- .../Localization/Server/de.json | 17 +++++++++++++ .../Localization/Server/en_US.json | 17 +++++++++++++ .../Localization/Server/pt_PT.json | 17 +++++++++++++ .../Localization/Server/ru.json | 17 +++++++++++++ .../MediaBrowser.Server.Implementations.csproj | 6 +++++ MediaBrowser.WebDashboard/Api/DashboardService.cs | 29 ++++++++++++++-------- .../MediaBrowser.WebDashboard.csproj | 6 +++++ 13 files changed, 178 insertions(+), 16 deletions(-) create mode 100644 MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json create mode 100644 MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/de.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/en_US.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/ru.json (limited to 'MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs') diff --git a/MediaBrowser.Controller/Localization/ILocalizationManager.cs b/MediaBrowser.Controller/Localization/ILocalizationManager.cs index 5993c7ac5..f41940ed4 100644 --- a/MediaBrowser.Controller/Localization/ILocalizationManager.cs +++ b/MediaBrowser.Controller/Localization/ILocalizationManager.cs @@ -61,5 +61,12 @@ namespace MediaBrowser.Controller.Localization /// /// IEnumerable{LocalizatonOption}. IEnumerable GetLocalizationOptions(); + + /// + /// Gets the java script localization dictionary. + /// + /// The culture. + /// Dictionary{System.StringSystem.String}. + Dictionary GetJavaScriptLocalizationDictionary(string culture); } } diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs index 08add952a..5b65a60c8 100644 --- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs +++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs @@ -257,8 +257,12 @@ namespace MediaBrowser.Server.Implementations.IO InternalBufferSize = 32767 }; - newWatcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.DirectoryName | - NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.Size; + newWatcher.NotifyFilter = NotifyFilters.CreationTime | + NotifyFilters.DirectoryName | + NotifyFilters.FileName | + NotifyFilters.LastWrite | + NotifyFilters.Size | + NotifyFilters.Attributes; newWatcher.Created += watcher_Changed; newWatcher.Deleted += watcher_Changed; diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json new file mode 100644 index 000000000..45f0d7e13 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json @@ -0,0 +1,21 @@ +{ + "SettingsSaved": "Settings saved.", + "AddUser": "Add User", + "Users": "Users", + "Delete": "Delete", + "Administrator": "Administrator", + "Password": "Password", + "CreatePassword": "Create Password", + "DeleteImage": "Delete Image", + "DeleteImageConfirmation": "Are you sure you wish to delete this image?", + "FileReadCancelled": "The file read has been cancelled.", + "FileNotFound": "File not found.", + "FileReadError": "An error occurred while reading the file.", + "DeleteUser": "Delete User", + "DeleteUserConfirmation": "Are you sure you wish to delete {0}?", + "PasswordResetHeader": "Password Reset", + "PasswordResetComplete": "The password has been reset.", + "PasswordResetConfirmation": "Are you sure you wish to reset the password?", + "PasswordSaved": "Password saved.", + "PasswordMatchError": "Password and password confirmation must match." +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 44600aa35..41f8508a5 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -1,3 +1,21 @@ { - "LabelTest": "Text" + "SettingsSaved": "Settings saved.", + "AddUser": "Add User", + "Users": "Users", + "Delete": "Delete", + "Administrator": "Administrator", + "Password": "Password", + "CreatePassword": "Create Password", + "DeleteImage": "Delete Image", + "DeleteImageConfirmation": "Are you sure you wish to delete this image?", + "FileReadCancelled": "The file read has been cancelled.", + "FileNotFound": "File not found.", + "FileReadError": "An error occurred while reading the file.", + "DeleteUser": "Delete User", + "DeleteUserConfirmation": "Are you sure you wish to delete {0}?", + "PasswordResetHeader": "Password Reset", + "PasswordResetComplete": "The password has been reset.", + "PasswordResetConfirmation": "Are you sure you wish to reset the password?", + "PasswordSaved": "Password saved.", + "PasswordMatchError": "Password and password confirmation must match." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json new file mode 100644 index 000000000..25d3ff944 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json @@ -0,0 +1,21 @@ +{ + "SettingsSaved": "Configura\u00e7\u00f5es guardadas.", + "AddUser": "Adicionar Utilizador", + "Users": "Utilizadores", + "Delete": "Apagar", + "Administrator": "Administrador", + "Password": "Senha", + "CreatePassword": "Criar Senha", + "DeleteImage": "Apagar Imagem", + "DeleteImageConfirmation": "Tem a certeza que pretende apagar a imagem?", + "FileReadCancelled": "The file read has been cancelled.", + "FileNotFound": "Ficheiro n\u00e3o encontrado", + "FileReadError": "Ocorreu um erro ao ler o ficheiro.", + "DeleteUser": "Apagar Utilizador", + "DeleteUserConfirmation": "Tem a certeza que pretende apagar {0}?", + "PasswordResetHeader": "Password Reset", + "PasswordResetComplete": "The password has been reset.", + "PasswordResetConfirmation": "Are you sure you wish to reset the password?", + "PasswordSaved": "Senha guardada.", + "PasswordMatchError": "Password and password confirmation must match." +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index badf5f93c..6f39c6759 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -333,8 +333,12 @@ namespace MediaBrowser.Server.Implementations.Localization { return new List { - new LocalizatonOption{ Name="English (United States)", Value="en-us"} - }; + new LocalizatonOption{ Name="English (United States)", Value="en-us"}, + new LocalizatonOption{ Name="German", Value="de"}, + new LocalizatonOption{ Name="Portuguese (Portugal)", Value="pt-PT"}, + new LocalizatonOption{ Name="Russian", Value="ru"} + + }.OrderBy(i => i.Name); } public string LocalizeDocument(string document, string culture, Func tokenBuilder) diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json new file mode 100644 index 000000000..ab3271b50 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -0,0 +1,17 @@ +{ + "LabelExit": "Ende", + "LabelVisitCommunity": "Besuche die Community", + "LabelGithubWiki": "Github Wiki", + "LabelSwagger": "Swagger", + "LabelStandard": "Standard", + "LabelViewApiDocumentation": "Zeige Api Dokumentation", + "LabelBrowseLibrary": "Durchsuche Bibliothek", + "LabelConfigureMediaBrowser": "Konfiguriere Media Browser", + "LabelOpenLibraryViewer": "\u00d6ffne Bibliothekenansicht", + "LabelRestartServer": "Server neustarten", + "LabelShowLogWindow": "Zeige Log Fenster", + "LabelPrevious": "Vorheriges", + "LabelFinish": "Ende", + "LabelNext": "N\u00e4chstes", + "LabelYoureDone": "Du bist fertig!" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json new file mode 100644 index 000000000..f74cca1eb --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json @@ -0,0 +1,17 @@ +{ + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelGithubWiki": "Github Wiki", + "LabelSwagger": "Swagger", + "LabelStandard": "Standard", + "LabelViewApiDocumentation": "View Api Documentation", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureMediaBrowser": "Configure Media Browser", + "LabelOpenLibraryViewer": "Open Library Viewer", + "LabelRestartServer": "Restart Server", + "LabelShowLogWindow": "Show Log Window", + "LabelPrevious": "Previous", + "LabelFinish": "Finish", + "LabelNext": "Next", + "LabelYoureDone": "You're Done!" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json new file mode 100644 index 000000000..700314708 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json @@ -0,0 +1,17 @@ +{ + "LabelExit": "Sair", + "LabelVisitCommunity": "Visitar a Comunidade", + "LabelGithubWiki": "Wiki Github", + "LabelSwagger": "Swagger", + "LabelStandard": "Padr\u00e3o", + "LabelViewApiDocumentation": "Ver Documenta\u00e7\u00e3o da API", + "LabelBrowseLibrary": "Navegar na Biblioteca", + "LabelConfigureMediaBrowser": "Configurar Media Browser", + "LabelOpenLibraryViewer": "Abrir Visualizador da Biblioteca", + "LabelRestartServer": "Reiniciar Servidor", + "LabelShowLogWindow": "Mostrar Janela de Log", + "LabelPrevious": "Anterior", + "LabelFinish": "Terminar", + "LabelNext": "Seguinte", + "LabelYoureDone": "Concluiu!" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json new file mode 100644 index 000000000..4cc6b90f7 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -0,0 +1,17 @@ +{ + "LabelExit": "\u0412\u044b\u0445\u043e\u0434", + "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e", + "LabelGithubWiki": "\u0412\u0438\u043a\u0438 \u043d\u0430 Github", + "LabelSwagger": "\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435", + "LabelStandard": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439", + "LabelViewApiDocumentation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e API", + "LabelBrowseLibrary": "\u041e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c \u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", + "LabelConfigureMediaBrowser": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Media Browser", + "LabelOpenLibraryViewer": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", + "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440", + "LabelShowLogWindow": "\u041e\u043a\u043d\u043e \u0416\u0443\u0440\u043d\u0430\u043b\u0430", + "LabelPrevious": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435", + "LabelFinish": "\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c", + "LabelNext": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435", + "LabelYoureDone": "\u0412\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438!" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index ac8dc9431..539b968c7 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -284,6 +284,12 @@ + + + + + + diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 597381529..7313c089f 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Plugins; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; using ServiceStack; using ServiceStack.Web; using System; @@ -100,6 +101,7 @@ namespace MediaBrowser.WebDashboard.Api private readonly IFileSystem _fileSystem; private readonly ILocalizationManager _localization; + private readonly IJsonSerializer _jsonSerializer; /// /// Initializes a new instance of the class. @@ -107,12 +109,13 @@ namespace MediaBrowser.WebDashboard.Api /// The app host. /// The server configuration manager. /// The file system. - public DashboardService(IServerApplicationHost appHost, IServerConfigurationManager serverConfigurationManager, IFileSystem fileSystem, ILocalizationManager localization) + public DashboardService(IServerApplicationHost appHost, IServerConfigurationManager serverConfigurationManager, IFileSystem fileSystem, ILocalizationManager localization, IJsonSerializer jsonSerializer) { _appHost = appHost; _serverConfigurationManager = serverConfigurationManager; _fileSystem = fileSystem; _localization = localization; + _jsonSerializer = jsonSerializer; } /// @@ -484,7 +487,7 @@ namespace MediaBrowser.WebDashboard.Api { Logger.ErrorException("Error minifying javascript", ex); } - + var bytes = Encoding.UTF8.GetBytes(js); await memoryStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); @@ -524,6 +527,7 @@ namespace MediaBrowser.WebDashboard.Api "autoorganizelog.js", "channels.js", "channelitems.js", + "dashboardgeneral.js", "dashboardinfo.js", "dashboardpage.js", "directorybrowser.js", @@ -619,7 +623,10 @@ namespace MediaBrowser.WebDashboard.Api private async Task AppendLocalization(Stream stream) { + var js = "window.localizationGlossary=" + _jsonSerializer.SerializeToString(_localization.GetJavaScriptLocalizationDictionary(GetLocalizationCulture())); + var bytes = Encoding.UTF8.GetBytes(js); + await stream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); } /// @@ -668,16 +675,16 @@ namespace MediaBrowser.WebDashboard.Api var css = builder.ToString(); - try - { - var result = new KristensenCssMinifier().Minify(builder.ToString(), false, Encoding.UTF8); + //try + //{ + // var result = new KristensenCssMinifier().Minify(builder.ToString(), false, Encoding.UTF8); - //css = result.MinifiedContent; - } - catch (Exception ex) - { - Logger.ErrorException("Error minifying css", ex); - } + // css = result.MinifiedContent; + //} + //catch (Exception ex) + //{ + // Logger.ErrorException("Error minifying css", ex); + //} var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(css)); diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 211f216d5..0ddb05577 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -224,6 +224,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -518,6 +521,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest -- cgit v1.2.3