Skip to content

Commit

Permalink
Added language switcher and Slovenian language
Browse files Browse the repository at this point in the history
  • Loading branch information
Ziga committed Jun 2, 2021
1 parent cfa973e commit 434e76a
Show file tree
Hide file tree
Showing 11 changed files with 451 additions and 174 deletions.
69 changes: 34 additions & 35 deletions export.html

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<link rel="stylesheet" href="css/tailwind.min.css">
<link rel="stylesheet" href="css/index.css">
<link id="css-theme" type="text/css" rel="stylesheet" href="css/themes/dark.css">
<script src="js/lang.js"></script>
<script src="js/header.js"></script>
</head>

Expand Down Expand Up @@ -71,7 +72,7 @@ <h3 class="tertiaryColor text-lg leading-6 font-medium" id="error-dialog-modal-t
<button id="btn_signin" type="submit" class="primaryButton group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white">
Sign in
</button>
<a href="register.html" class="primaryColor">
<a id="dont_have_account_link" href="register.html" class="primaryColor">
Don't have account yet? Sign up here.
</a>
</div>
Expand Down
62 changes: 25 additions & 37 deletions js/default-functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,32 @@ function toggleMenu(){
}

function changeTheme(){
if(localStorage.theme == 0){
document.getElementById("css-theme").href = "css/themes/light.css";
document.getElementById("theme-link").innerText = "Theme (Light)";
document.getElementById("theme-link-mobile").innerText = "Theme (Light)";
localStorage.theme = 1;
}else{
document.getElementById("css-theme").href = "css/themes/dark.css";
document.getElementById("theme-link").innerText = "Theme (Dark)";
document.getElementById("theme-link-mobile").innerText = "Theme (Dark)";
localStorage.theme = 0;
switch(localStorage.theme){
case "dark":
document.getElementById("css-theme").href = "css/themes/light.css";
document.getElementById("theme-link").innerText = lang[localStorage.lang]["theme"] + " (Light)";
document.getElementById("theme-link-mobile").innerText = lang[localStorage.lang]["theme"] + " (Light)";
localStorage.theme = "light";
break;
default:
document.getElementById("css-theme").href = "css/themes/dark.css";
document.getElementById("theme-link").innerText = lang[localStorage.lang]["theme"] + " (Dark)";
document.getElementById("theme-link-mobile").innerText = lang[localStorage.lang]["theme"] + " (Dark)";
localStorage.theme = "dark";
break;
}
}

function changeLanguage(){
switch(localStorage.lang){
case "en":
localStorage.lang = "sl";
break;
default:
localStorage.lang = "en";
break;
}
location.reload();
}

function copyToClipboard(text){
Expand All @@ -80,33 +95,6 @@ function copyToClipboard(text){
document.body.removeChild(textArea);
}

const errors = {
"0": "Successful",
"1": "Username is invalid!",
"2": "Password is incorrect!",
"3": "Something went wrong while inserting data to database!",
"4": "Username is already registered!",
"5": "Password must be between 8 and 255 characters long and have at least one letter, one number and one special character!",
"6": "Email is invalid!",
"7": "Username doesn't exist!",
"8": "You don't have any saved password.",
"9": "Domain is invalid!",
"10": "User does not own this password!",
"11": "Something went wrong while deleting data from database!",
"12": "Username must be between 6 and 30 characters long and can only contains letters, numbers and dots!",
"13": "Something went wrong while updating data in database!",
"14": "Json is invalid!",
"15": "This server can't accept more users!",
"16": "You have reached maximum amount of stored passwords!",
"400": "Action was not provided in POST!",
"401": "Action is invalid!",
"403": "You didn't provide all required values in POST.",
"404": "Can't connect into API.",
"429": "You are sending too many requests! Please wait some time before executing this action.",
"505": "Something went wrong while connecting to database!",
"999": "You don't have permission to use this endpoint."
}

function downloadTxt(exportTxt, exportName){
let dataStr = "data:text/plain;charset=utf-8," + encodeURIComponent(exportTxt);
let downloadAnchorNode = document.createElement('a');
Expand Down
89 changes: 73 additions & 16 deletions js/export.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,54 @@
check_login();

document.getElementById("passwords-link").innerText = lang[localStorage.lang]["passwords"];
document.getElementById("import-export-link").innerText = lang[localStorage.lang]["import_export"];
document.getElementById("signout-link").innerText = lang[localStorage.lang]["signout"];

document.getElementById("passwords-link-mobile").innerText = lang[localStorage.lang]["passwords"];
document.getElementById("import-export-link-mobile").innerText = lang[localStorage.lang]["import_export"];
document.getElementById("signout-link-mobile").innerText = lang[localStorage.lang]["signout"];

switch(localStorage.theme){
case "light":
document.getElementById("theme-link").innerText = lang[localStorage.lang]["theme"] + " (Light)";
document.getElementById("theme-link-mobile").innerText = lang[localStorage.lang]["theme"] + " (Light)";
break;
default:
document.getElementById("theme-link").innerText = lang[localStorage.lang]["theme"] + " (Dark)";
document.getElementById("theme-link-mobile").innerText = lang[localStorage.lang]["theme"] + " (Dark)";
break;
}

switch(localStorage.lang){
case "sl":
document.getElementById("lang-link").innerText = "Language (Slovenian)";
document.getElementById("lang-link-mobile").innerText = "Language (Slovenian)";
break;
default:
document.getElementById("lang-link").innerText = "Language (English)";
document.getElementById("lang-link-mobile").innerText = "Language (English)";
break;
}

document.getElementById("passky-backup-btn-text").innerText = lang[localStorage.lang]["backup"];

document.getElementById("passky-import-btn-text").innerText = lang[localStorage.lang]["import"];
document.getElementById("lastpass-import-btn-text").innerText = lang[localStorage.lang]["import"];
document.getElementById("bitwarden-import-btn-text").innerText = lang[localStorage.lang]["import"];
document.getElementById("dashline-import-btn-text").innerText = lang[localStorage.lang]["import"];
document.getElementById("onepassword-import-btn-text").innerText = lang[localStorage.lang]["import"];
document.getElementById("keeper-import-btn-text").innerText = lang[localStorage.lang]["import"];
document.getElementById("nordpass-import-btn-text").innerText = lang[localStorage.lang]["import"];

document.getElementById("passky-export-btn-text").innerText = lang[localStorage.lang]["export"];
document.getElementById("lastpass-export-btn-text").innerText = lang[localStorage.lang]["export"];
document.getElementById("dashline-export-btn-text").innerText = lang[localStorage.lang]["export"];
document.getElementById("onepassword-export-btn-text").innerText = lang[localStorage.lang]["export"];
document.getElementById("keeper-export-btn-text").innerText = lang[localStorage.lang]["export"];
document.getElementById("nordpass-export-btn-text").innerText = lang[localStorage.lang]["export"];

document.getElementById("dialog-button-cancel").innerText = lang[localStorage.lang]["cancel"];

function import_passky(){

check_login();
Expand Down Expand Up @@ -196,31 +245,31 @@ function import_data(passwords){

if(xhr.readyState === 4){
if(xhr.status != 200){
changeDialog(0, "Server is unreachable!");
changeDialog(0, lang[localStorage.lang]["server_unreachable"]);
show('dialog');
return;
}

var json = JSON.parse(xhr.responseText);

if(typeof json['error'] === 'undefined'){
changeDialog(0, "Server is unreachable!");
changeDialog(0, lang[localStorage.lang]["server_unreachable"]);
show('dialog');
return;
}

if(json['error'] != 0){
changeDialog(0, errors[json['error']]);
changeDialog(0, errors[localStorage.lang][json['error']]);
show('dialog');
return;
}

if(json['error'] == 0){
if(json['import_error'] == 0){
changeDialog(3, json['import_success'] + " passwords has been successfully imported!");
changeDialog(3, lang[localStorage.lang]["import_success"].replace("{success_number}", json['import_success']));
show('dialog');
}else{
changeDialog(3, json['import_success'] + " passwords has been successfully imported, but " + json['import_error'] + " passwords has not been imported!");
changeDialog(3, lang[localStorage.lang]["import_errors"].replace("{success_number}", json['import_success']).replace("{error_number}", json['import_error']));
show('dialog');
}
}
Expand All @@ -240,19 +289,19 @@ function changeDialog(style, text, text2){
document.getElementById('dialog-text').innerHTML = "<textarea id='import-data' name='about' rows='3' class='max-w-lg shadow-sm block w-full sm:text-sm rounded-md'></textarea>";

document.getElementById('dialog-button').className = "primaryButton inline-flex justify-center w-full rounded-md border border-transparent shadow-sm px-4 py-2 text-base font-medium focus:outline-none sm:w-auto sm:text-sm";
document.getElementById('dialog-button').innerText = "Import";
document.getElementById('dialog-button').innerText = lang[localStorage.lang]["import"];

switch(text){
case 0:
document.getElementById('dialog-title').innerText = "Import from Passky";
document.getElementById('dialog-title').innerText = lang[localStorage.lang]["import_from"].replace("{name}","Passky");
document.getElementById('dialog-button').onclick = () => import_passky();
break;
case 1:
document.getElementById('dialog-title').innerText = "Import from Lastpass";
document.getElementById('dialog-title').innerText = lang[localStorage.lang]["import_from"].replace("{name}","Lastpass");
document.getElementById('dialog-button').onclick = () => import_lastpass();
break;
case 2:
document.getElementById('dialog-title').innerText = "Import from Bitwarden";
document.getElementById('dialog-title').innerText = lang[localStorage.lang]["import_from"].replace("{name}","Bitwarden");
document.getElementById('dialog-button').onclick = () => import_bitwarden();
break;
}
Expand All @@ -262,35 +311,35 @@ function changeDialog(style, text, text2){
document.getElementById('dialog-icon').className = "mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10";
document.getElementById('dialog-icon').innerHTML = "<svg class='h-6 w-6 text-red-600' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor' aria-hidden='true'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z' /></svg>";

document.getElementById('dialog-title').innerText = "ERROR";
document.getElementById('dialog-text').innerText = "Data in import is invalid!";
document.getElementById('dialog-title').innerText = lang[localStorage.lang]["error"];
document.getElementById('dialog-text').innerText = lang[localStorage.lang]["import_invalid"];

document.getElementById('dialog-button').className = "dangerButton inline-flex justify-center w-full rounded-md border border-transparent shadow-sm px-4 py-2 text-base font-medium focus:outline-none sm:w-auto sm:text-sm";
document.getElementById('dialog-button').innerText = "Try again";
document.getElementById('dialog-button').innerText = lang[localStorage.lang]["try_again"];
document.getElementById('dialog-button').onclick = () => changeDialog(text, text2);
break;
case 3:
//Import Success
document.getElementById('dialog-icon').className = "mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-green-100";
document.getElementById('dialog-icon').innerHTML = "<svg class='h-6 w-6 text-green-600' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor' aria-hidden='true'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 13l4 4L19 7' /></svg>";

document.getElementById('dialog-title').innerText = "SUCCESS";
document.getElementById('dialog-title').innerText = lang[localStorage.lang]["success"];
document.getElementById('dialog-text').innerText = text;

document.getElementById('dialog-button').className = "successButton inline-flex justify-center w-full rounded-md border border-transparent shadow-sm px-4 py-2 text-base font-medium focus:outline-none sm:w-auto sm:text-sm";
document.getElementById('dialog-button').innerText = "Okay";
document.getElementById('dialog-button').innerText = lang[localStorage.lang]["okay"];
document.getElementById('dialog-button').onclick = () => refreshPasswords();
break;
default:
//Error
document.getElementById('dialog-icon').className = "mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10";
document.getElementById('dialog-icon').innerHTML = "<svg class='h-6 w-6 text-red-600' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor' aria-hidden='true'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z' /></svg>";

document.getElementById('dialog-title').innerText = "ERROR";
document.getElementById('dialog-title').innerText = lang[localStorage.lang]["error"];
document.getElementById('dialog-text').innerText = text;

document.getElementById('dialog-button').className = "dangerButton inline-flex justify-center w-full rounded-md border border-transparent shadow-sm px-4 py-2 text-base font-medium focus:outline-none sm:w-auto sm:text-sm";
document.getElementById('dialog-button').innerText = "Okay";
document.getElementById('dialog-button').innerText = lang[localStorage.lang]["okay"];
document.getElementById('dialog-button').onclick = () => hide('dialog');
break;
}
Expand All @@ -312,6 +361,14 @@ document.getElementById("theme-link-mobile").addEventListener("click", () => {
changeTheme();
});

document.getElementById("lang-link").addEventListener("click", () => {
changeLanguage();
});

document.getElementById("lang-link-mobile").addEventListener("click", () => {
changeLanguage();
});

document.getElementById("main-menu-toggle-btn").addEventListener("click", () => {
toggleMenu();
});
Expand Down
14 changes: 9 additions & 5 deletions js/header.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
if(localStorage.theme == null || typeof(localStorage.theme) == 'undefined') localStorage.theme = 0;
if(localStorage.theme == null || typeof(localStorage.theme) == 'undefined') localStorage.theme = "dark";
if(localStorage.lang == null || typeof(localStorage.lang) == 'undefined') localStorage.lang = "en";

if(localStorage.theme == 0){
document.getElementById("css-theme").href = "css/themes/dark.css";
}else{
document.getElementById("css-theme").href = "css/themes/light.css";
if(!(localStorage.theme == "dark" || localStorage.theme == "light")) localStorage.theme = "dark";
if(!(localStorage.lang == "en" || localStorage.lang == "sl")) localStorage.lang = "en";

switch(localStorage.theme){
case "light":
document.getElementById("css-theme").href = "css/themes/light.css";
break;
}
Loading

0 comments on commit 434e76a

Please sign in to comment.