diff --git a/ClientServerLib/ClientServerLib/CWebservice.cs b/ClientServerLib/ClientServerLib/CWebservice.cs index c0a28811..8da01ab2 100644 --- a/ClientServerLib/ClientServerLib/CWebservice.cs +++ b/ClientServerLib/ClientServerLib/CWebservice.cs @@ -269,6 +269,31 @@ namespace ServerLib return null; } + public Stream GetLocaleFile(string filename) + { + if (WebOperationContext.Current != null) + { + WebOperationContext.Current.OutgoingResponse.ContentType = "text/javascript"; + WebOperationContext.Current.OutgoingResponse.LastModified = DateTime.UtcNow; + WebOperationContext.Current.OutgoingResponse.Headers.Add( + HttpResponseHeader.Expires, + DateTime.UtcNow.AddHours(4).ToString("r")); + } + + byte[] data = CServer.GetSiteFile("locales/" + filename); + + if (data != null) + { + return new MemoryStream(data); + } + + if (WebOperationContext.Current != null) + { + WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound; + } + return null; + } + public CBase64Image GetDelayedImage(string id) { return CServer.GetDelayedImage(id); @@ -428,6 +453,6 @@ namespace ServerLib } #endregion - + } } diff --git a/ClientServerLib/ClientServerLib/ICWebservice.cs b/ClientServerLib/ClientServerLib/ICWebservice.cs index c272915f..3e79d8ce 100644 --- a/ClientServerLib/ClientServerLib/ICWebservice.cs +++ b/ClientServerLib/ClientServerLib/ICWebservice.cs @@ -91,6 +91,12 @@ namespace ServerLib UriTemplate = "/img/{filename}")] Stream GetImgFile(String filename); + [OperationContract] + [WebInvoke(Method = "GET", + ResponseFormat = WebMessageFormat.Json, + UriTemplate = "/locales/{filename}")] + Stream GetLocaleFile(String filename); + [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index 168d0759..6b0f0c20 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -304,6 +304,12 @@ + + PreserveNewest + + + PreserveNewest + diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js index 7ad305a6..bfc14a85 100644 --- a/Vocaluxe/Website/js/main.js +++ b/Vocaluxe/Website/js/main.js @@ -7,24 +7,34 @@ var playlistRequestName = ""; var customSelectPlaylistSongCallback = null; var sessionId = ""; var serverBaseAddress = ""; +var tranlationLoaded; if (document.location.protocol == "file:") { if (typeof (window.deviceAndJqmLoaded) == "undefined") { window.deviceAndJqmLoaded = $.Deferred(); } window.deviceAndJqmLoaded.done(function () { - start(); + preStart(); }); } else { $(document).ready(function () { + preStart(); + }); +} + +function preStart() { + tranlationLoaded = $.Deferred(); + + initTranslation(); + + tranlationLoaded.done(function () { + translate(); start(); }); } - function start() { replaceTransitionHandler(); - initTranslation(); initPageLoadHandler(); initKeyboardPageHandler(); initMainPageHandler(); @@ -1229,185 +1239,24 @@ function showWikipedia(artist) { } function initTranslation() { - var translations = { - "en": { - translation: { - 'loginName': 'User:', - 'loginPassword': 'Password:', - 'loginButton': 'Login', - 'registerButton': 'Create Profile', - 'discoverReadQrButton': 'Scan QRCode', - 'mainPageYourProfileLink': 'Your Profile', - 'mainPageYourProfileLinkDesc': 'Edit your profile', - 'mainPageCurrentSongLink': 'Current Song', - 'mainPageCurrentSongLinkDesc': 'Display informations about the current song', - 'mainPageSelectSong': 'All songs', - 'mainPageSelectSongDesc': 'Lists all available songs', - 'mainPageSelectPlaylist': 'All playlists', - 'mainPageSelectPlaylistDesc': 'Lists all playlists', - 'mainPageSelectProfile': 'Profiles', - 'mainPageSelectProfileDesc': 'Shows all profiles', - 'mainPageTakePhotoLink': 'Take Photo', - 'mainPageTakePhotoLinkDesc': 'Takes a photo and displays it at the end of the current round', - 'mainPageKeyboard': 'Keyboard', - 'mainPageKeyboardDesc': 'Send keys', - 'mainPageSelectUserAdmin': 'Administration', - 'mainPageSelectUserAdminDesc': 'Configure user rights', - 'mainPageLogoutLink': 'Logout', - 'mainPageLogoutLinkDesc': 'Closes the session', - 'selectProfileHeader': 'All profiles', - 'displayProfileHeader': 'Profile', - 'displayProfileName': 'Name:', - 'displayProfilePlayerType': 'Player Type:', - 'displayProfilePlayerTypeNormal': 'Normal', - 'displayProfilePlayerTypeGuest': 'Guest', - 'displayProfilePlayerDifficulty': 'Difficulty:', - 'displayProfilePlayerDifficultyEasy': 'Easy', - 'displayProfilePlayerDifficultyNormal': 'Normal', - 'displayProfilePlayerDifficultyHard': 'Hard', - 'displayProfilePlayerPassword': 'New Password:', - 'displayProfilePlayerSaveButton': 'Save and upload', - 'displaySongHeader': 'No current song', - 'displaySongArtist': 'Artist:', - 'displaySongGenre': 'Genre:', - 'displaySongYear': 'Year:', - 'displaySongLanguage': 'Language:', - 'displaySongIsDuet': 'Duet:', - 'popupVideoClose': 'Close', - 'selectSongHeader': 'All songs', - 'keyboardHeader': 'Keyboard', - 'keyboardButtonUp': 'up', - 'keyboardButtonLeft': 'left', - 'keyboardButtonRight': 'right', - 'keyboardButtonDown': 'down', - 'keyboardButtonEscape': 'escape', - 'keyboardButtonTab': 'tab', - 'keyboardButtonReturn': 'return', - 'keyboardButtonKeys': 'To send other keys type here:', - 'selectUserAdminHeader': 'All profiles', - 'displayUserAdminHeader': 'Profile', - 'displayUserAdminContentSaveButton': 'Save', - 'selectPlaylistHeader': 'Select a playlist', - 'displayPlaylistHeader': 'Playlist', - 'displayPlaylistSaveButton': 'Save', - 'selectPlaylistAddPlaylistButton': 'Add', - 'Loading (external)...': 'Loading (external)...', - 'Loading...': 'Loading...', - 'Error...': 'Error...', - 'No connection': 'No connection', - 'No session': 'No session', - 'Uploading photo...': 'Uploading photo...', - 'Getting current song...': 'Getting current song...', - 'Login...': 'Login...', - 'Creating profile...': 'Creating profile...', - 'This is not a valid name.': 'This is not a valid name.', - 'Uploading profile...': 'Uploading profile...', - 'songs': 'songs', - 'YourName': 'YourName', - 'discoverConnectHeader': 'Connect to server', - 'discoverConnectServerAddress': 'Serveraddress:', - 'discoverConnectButton': 'Connect', - 'Checking...': 'Checking...', - 'timeout': 'Timeout' - } - }, - "de": { - translation: { - 'loginName': 'Benutzer:', - 'loginPassword': 'Passwort:', - 'loginButton': 'Einloggen', - 'registerButton': 'Erstelle Profil', - 'discoverReadQrButton': 'Fotografiere QRCode', - 'mainPageYourProfileLink': 'Dein Profil', - 'mainPageYourProfileLinkDesc': 'Bearbeite dein Profil', - 'mainPageCurrentSongLink': 'Aktuelles Lied', - 'mainPageCurrentSongLinkDesc': 'Zeigt Informationen über das aktuelle Lied an', - 'mainPageSelectSong': 'Alle Lieder', - 'mainPageSelectSongDesc': 'Listet alle verfügbaren Lieder auf', - 'mainPageSelectPlaylist': 'Alle Playlisten', - 'mainPageSelectPlaylistDesc': 'Listet alle verfügbaren Playlisten auf', - 'mainPageSelectProfile': 'Profile', - 'mainPageSelectProfileDesc': 'Listet alle Profile auf', - 'mainPageTakePhotoLink': 'Nehme Foto auf', - 'mainPageTakePhotoLinkDesc': 'Nimmt ein Foto auf und zeigt es am ende der Runde an', - 'mainPageKeyboard': 'Tastatur', - 'mainPageKeyboardDesc': 'Sende Tastatureingaben', - 'mainPageSelectUserAdmin': 'Administration', - 'mainPageSelectUserAdminDesc': 'Konfiguriere die Benutzerrechte', - 'mainPageLogoutLink': 'Abmelden', - 'mainPageLogoutLinkDesc': 'Beendet diese Sitzung', - 'selectProfileHeader': 'Alle Profile', - 'displayProfileHeader': 'Profile', - 'displayProfileName': 'Name:', - 'displayProfilePlayerType': 'Player Typ:', - 'displayProfilePlayerTypeNormal': 'Normal', - 'displayProfilePlayerTypeGuest': 'Gast', - 'displayProfilePlayerDifficulty': 'Schwierigkeit:', - 'displayProfilePlayerDifficultyEasy': 'Einfach', - 'displayProfilePlayerDifficultyNormal': 'Normal', - 'displayProfilePlayerDifficultyHard': 'Schwer', - 'displayProfilePlayerPassword': 'Neues Passwort:', - 'displayProfilePlayerSaveButton': 'Speichern und hochladen', - 'displaySongHeader': 'Kein aktuelles Lied', - 'displaySongArtist': 'Künstler:', - 'displaySongGenre': 'Genre:', - 'displaySongYear': 'Jahr:', - 'displaySongLanguage': 'Sprache:', - 'displaySongIsDuet': 'Duet:', - 'popupVideoClose': 'Schließen', - 'selectSongHeader': 'Alle Lieder', - 'keyboardHeader': 'Tastatur', - 'keyboardButtonUp': 'hoch', - 'keyboardButtonLeft': 'links', - 'keyboardButtonRight': 'rechts', - 'keyboardButtonDown': 'runter', - 'keyboardButtonEscape': 'Escape', - 'keyboardButtonTab': 'Tab', - 'keyboardButtonReturn': 'Enter', - 'keyboardButtonKeys': 'Um andere Zeichen zu senden, hier tippen:', - 'selectUserAdminHeader': 'Alle Profile', - 'displayUserAdminHeader': 'Profile', - 'displayUserAdminContentSaveButton': 'Speichern', - 'selectPlaylistHeader': 'Wähle eine Playlist', - 'displayPlaylistHeader': 'Playlist', - 'displayPlaylistSaveButton': 'Speichern', - 'selectPlaylistAddPlaylistButton': 'Hinzufügen', - 'Loading (external)...': 'Laden (extern)...', - 'Loading...': 'Laden...', - 'Error...': 'Fehler...', - 'No connection': 'Keine Verbindung', - 'No session': 'Keine Sitzung', - 'Uploading photo...': 'Foto hochladen...', - 'Getting current song...': 'Lade aktuelles Lied...', - 'Login...': 'Einloggen...', - 'Creating profile...': 'Erstelle Profil...', - 'This is not a valid name.': 'Dies ist kein gültiger Name.', - 'Uploading profile...': 'Profil hochladen...', - 'songs': 'Lieder', - 'YourName': 'DeinName', - 'discoverConnectHeader': 'Verbinde zum Server', - 'discoverConnectServerAddress': 'Serveradresse:', - 'discoverConnectButton': 'Verbinden', - 'Checking...': 'Prüfen...', - 'timeout': 'Zeitüberschreitung' - } - } - }; - + $.i18n.init({ + resGetPath: 'locales/__lng__.json', + supportedLngs: ['en', 'de'], + fallbackLng: 'en', + keyseparator: '::', + nsseparator: ':::' + }).done(function () { + tranlationLoaded.resolve(); + }); +} + +function translate() { //repair broken buttons on the first page (get broken while translating) var repairButtons = function () { $($('#discoverConnect')[0].childNodes).wrap(' '); $($('#discoverReadQr')[0].childNodes).wrap(' '); }; - $.i18n.init({ - resStore: translations, - supportedLngs: ['en', 'de'], - fallbackLng: 'en', - keyseparator: '::', - nsseparator: ':::' - }).done(function () { - $('body').i18n(); - repairButtons(); - }); + $('body').i18n(); + repairButtons(); } \ No newline at end of file diff --git a/Vocaluxe/Website/locales/de.json b/Vocaluxe/Website/locales/de.json new file mode 100644 index 00000000..ddf85d71 --- /dev/null +++ b/Vocaluxe/Website/locales/de.json @@ -0,0 +1,80 @@ +{ + "loginName": "Benutzer:", + "loginPassword": "Passwort:", + "loginButton": "Einloggen", + "registerButton": "Erstelle Profil", + "discoverReadQrButton": "Fotografiere QRCode", + "mainPageYourProfileLink": "Dein Profil", + "mainPageYourProfileLinkDesc": "Bearbeite dein Profil", + "mainPageCurrentSongLink": "Aktuelles Lied", + "mainPageCurrentSongLinkDesc": "Zeigt Informationen über das aktuelle Lied an", + "mainPageSelectSong": "Alle Lieder", + "mainPageSelectSongDesc": "Listet alle verfügbaren Lieder auf", + "mainPageSelectPlaylist": "Alle Playlisten", + "mainPageSelectPlaylistDesc": "Listet alle verfügbaren Playlisten auf", + "mainPageSelectProfile": "Profile", + "mainPageSelectProfileDesc": "Listet alle Profile auf", + "mainPageTakePhotoLink": "Nehme Foto auf", + "mainPageTakePhotoLinkDesc": "Nimmt ein Foto auf und zeigt es am ende der Runde an", + "mainPageKeyboard": "Tastatur", + "mainPageKeyboardDesc": "Sende Tastatureingaben", + "mainPageSelectUserAdmin": "Administration", + "mainPageSelectUserAdminDesc": "Konfiguriere die Benutzerrechte", + "mainPageLogoutLink": "Abmelden", + "mainPageLogoutLinkDesc": "Beendet diese Sitzung", + "selectProfileHeader": "Alle Profile", + "displayProfileHeader": "Profile", + "displayProfileName": "Name:", + "displayProfilePlayerType": "Player Typ:", + "displayProfilePlayerTypeNormal": "Normal", + "displayProfilePlayerTypeGuest": "Gast", + "displayProfilePlayerDifficulty": "Schwierigkeit:", + "displayProfilePlayerDifficultyEasy": "Einfach", + "displayProfilePlayerDifficultyNormal": "Normal", + "displayProfilePlayerDifficultyHard": "Schwer", + "displayProfilePlayerPassword": "Neues Passwort:", + "displayProfilePlayerSaveButton": "Speichern und hochladen", + "displaySongHeader": "Kein aktuelles Lied", + "displaySongArtist": "Künstler:", + "displaySongGenre": "Genre:", + "displaySongYear": "Jahr:", + "displaySongLanguage": "Sprache:", + "displaySongIsDuet": "Duet:", + "popupVideoClose": "Schließen", + "selectSongHeader": "Alle Lieder", + "keyboardHeader": "Tastatur", + "keyboardButtonUp": "hoch", + "keyboardButtonLeft": "links", + "keyboardButtonRight": "rechts", + "keyboardButtonDown": "runter", + "keyboardButtonEscape": "Escape", + "keyboardButtonTab": "Tab", + "keyboardButtonReturn": "Enter", + "keyboardButtonKeys": "Um andere Zeichen zu senden, hier tippen:", + "selectUserAdminHeader": "Alle Profile", + "displayUserAdminHeader": "Profile", + "displayUserAdminContentSaveButton": "Speichern", + "selectPlaylistHeader": "Wähle eine Playlist", + "displayPlaylistHeader": "Playlist", + "displayPlaylistSaveButton": "Speichern", + "selectPlaylistAddPlaylistButton": "Hinzufügen", + "Loading (external)...": "Laden (extern)...", + "Loading...": "Laden...", + "Creating...": "Erstellen...", + "Error...": "Fehler...", + "No connection": "Keine Verbindung", + "No session": "Keine Sitzung", + "Uploading photo...": "Foto hochladen...", + "Getting current song...": "Lade aktuelles Lied...", + "Login...": "Einloggen...", + "Creating profile...": "Erstelle Profil...", + "This is not a valid name.": "Dies ist kein gültiger Name.", + "Uploading profile...": "Profil hochladen...", + "songs": "Lieder", + "YourName": "DeinName", + "discoverConnectHeader": "Verbinde zum Server", + "discoverConnectServerAddress": "Serveradresse:", + "discoverConnectButton": "Verbinden", + "Checking...": "Prüfen...", + "timeout": "Zeitüberschreitung" +} \ No newline at end of file diff --git a/Vocaluxe/Website/locales/en.json b/Vocaluxe/Website/locales/en.json new file mode 100644 index 00000000..c6b28fd0 --- /dev/null +++ b/Vocaluxe/Website/locales/en.json @@ -0,0 +1,80 @@ +{ + "loginName": "User:", + "loginPassword": "Password:", + "loginButton": "Login", + "registerButton": "Create Profile", + "discoverReadQrButton": "Scan QRCode", + "mainPageYourProfileLink": "Your Profile", + "mainPageYourProfileLinkDesc": "Edit your profile", + "mainPageCurrentSongLink": "Current Song", + "mainPageCurrentSongLinkDesc": "Display informations about the current song", + "mainPageSelectSong": "All songs", + "mainPageSelectSongDesc": "Lists all available songs", + "mainPageSelectPlaylist": "All playlists", + "mainPageSelectPlaylistDesc": "Lists all playlists", + "mainPageSelectProfile": "Profiles", + "mainPageSelectProfileDesc": "Shows all profiles", + "mainPageTakePhotoLink": "Take Photo", + "mainPageTakePhotoLinkDesc": "Takes a photo and displays it at the end of the current round", + "mainPageKeyboard": "Keyboard", + "mainPageKeyboardDesc": "Send keys", + "mainPageSelectUserAdmin": "Administration", + "mainPageSelectUserAdminDesc": "Configure user rights", + "mainPageLogoutLink": "Logout", + "mainPageLogoutLinkDesc": "Closes the session", + "selectProfileHeader": "All profiles", + "displayProfileHeader": "Profile", + "displayProfileName": "Name:", + "displayProfilePlayerType": "Player Type:", + "displayProfilePlayerTypeNormal": "Normal", + "displayProfilePlayerTypeGuest": "Guest", + "displayProfilePlayerDifficulty": "Difficulty:", + "displayProfilePlayerDifficultyEasy": "Easy", + "displayProfilePlayerDifficultyNormal": "Normal", + "displayProfilePlayerDifficultyHard": "Hard", + "displayProfilePlayerPassword": "New Password:", + "displayProfilePlayerSaveButton": "Save and upload", + "displaySongHeader": "No current song", + "displaySongArtist": "Artist:", + "displaySongGenre": "Genre:", + "displaySongYear": "Year:", + "displaySongLanguage": "Language:", + "displaySongIsDuet": "Duet:", + "popupVideoClose": "Close", + "selectSongHeader": "All songs", + "keyboardHeader": "Keyboard", + "keyboardButtonUp": "up", + "keyboardButtonLeft": "left", + "keyboardButtonRight": "right", + "keyboardButtonDown": "down", + "keyboardButtonEscape": "escape", + "keyboardButtonTab": "tab", + "keyboardButtonReturn": "return", + "keyboardButtonKeys": "To send other keys type here:", + "selectUserAdminHeader": "All profiles", + "displayUserAdminHeader": "Profile", + "displayUserAdminContentSaveButton": "Save", + "selectPlaylistHeader": "Select a playlist", + "displayPlaylistHeader": "Playlist", + "displayPlaylistSaveButton": "Save", + "selectPlaylistAddPlaylistButton": "Add", + "Loading (external)...": "Loading (external)...", + "Loading...": "Loading...", + "Creating...": "Creating...", + "Error...": "Error...", + "No connection": "No connection", + "No session": "No session", + "Uploading photo...": "Uploading photo...", + "Getting current song...": "Getting current song...", + "Login...": "Login...", + "Creating profile...": "Creating profile...", + "This is not a valid name.": "This is not a valid name.", + "Uploading profile...": "Uploading profile...", + "songs": "songs", + "YourName": "YourName", + "discoverConnectHeader": "Connect to server", + "discoverConnectServerAddress": "Serveraddress:", + "discoverConnectButton": "Connect", + "Checking...": "Checking...", + "timeout": "Timeout" +} \ No newline at end of file