aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Localization
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Localization')
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json21
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json21
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json21
-rw-r--r--MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs117
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/de.json17
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/en_US.json17
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json17
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ru.json17
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/server.json17
9 files changed, 262 insertions, 3 deletions
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
new file mode 100644
index 000000000..41f8508a5
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.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/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 0d428742c..6f39c6759 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<string, Dictionary<string, ParentalRating>>(StringComparer.OrdinalIgnoreCase);
private readonly IFileSystem _fileSystem;
-
+ private readonly IJsonSerializer _jsonSerializer;
+
/// <summary>
/// Initializes a new instance of the <see cref="LocalizationManager"/> class.
/// </summary>
/// <param name="configurationManager">The configuration manager.</param>
- public LocalizationManager(IServerConfigurationManager configurationManager, IFileSystem fileSystem)
+ public LocalizationManager(IServerConfigurationManager configurationManager, IFileSystem fileSystem, IJsonSerializer jsonSerializer)
{
_configurationManager = configurationManager;
_fileSystem = fileSystem;
+ _jsonSerializer = jsonSerializer;
ExtractAll();
}
@@ -241,5 +245,112 @@ 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<string, Dictionary<string, string>> _dictionaries =
+ new ConcurrentDictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase);
+
+ public Dictionary<string, string> GetLocalizationDictionary(string culture)
+ {
+ const string prefix = "Server";
+ var key = prefix + culture;
+
+ return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "server.json"));
+ }
+
+ public Dictionary<string, string> GetJavaScriptLocalizationDictionary(string culture)
+ {
+ const string prefix = "JavaScript";
+ var key = prefix + culture;
+
+ return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "javascript.json"));
+ }
+
+ private Dictionary<string, string> GetDictionary(string prefix, string culture, string baseFilename)
+ {
+ var dictionary = new Dictionary<string, string>(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<string, string> dictionary, string resourcePath, Assembly assembly)
+ {
+ using (var stream = assembly.GetManifestResourceStream(resourcePath))
+ {
+ if (stream != null)
+ {
+ var dict = _jsonSerializer.DeserializeFromStream<Dictionary<string, string>>(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<LocalizatonOption> GetLocalizationOptions()
+ {
+ return new List<LocalizatonOption>
+ {
+ 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<string,string> tokenBuilder)
+ {
+ foreach (var pair in GetLocalizationDictionary(culture).ToList())
+ {
+ var token = tokenBuilder(pair.Key);
+
+ document = document.Replace(token, pair.Value, StringComparison.Ordinal);
+ }
+
+ return document;
+ }
}
}
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/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json
new file mode 100644
index 000000000..62a418391
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Localization/Server/server.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