Skip to content

Commit 3ed6ab7

Browse files
committed
Improves and refactors multi language support
1 parent 49eb5f5 commit 3ed6ab7

File tree

5 files changed

+118
-54
lines changed

5 files changed

+118
-54
lines changed

client/html/index.html

+4-5
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,10 @@
5656
</div>
5757
<div class="field">
5858
<span>{{_('Language')}}</span>
59-
<select class="dropdown" id="language" onchange="changeLanguage(this.value)">
60-
<option value="en">en</option>
61-
<option value="es">es</option>
62-
<option value="pt_BR">pt_BR</option>
63-
</select>
59+
<select
60+
class="dropdown"
61+
id="language"
62+
onchange="changeLanguage(this.value)"></select>
6463
</div>
6564
</div>
6665
<a class="info" href="https://github.com/ramonvc/gptfree-jailbreak-webui" target="_blank">

client/js/change-language.js

+47-35
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,47 @@
1-
getCurrentLanguage().then((currentLanguage) => {
2-
var savedLanguage = localStorage.getItem("language") || currentLanguage;
3-
setLanguageOnPageLoad(savedLanguage);
4-
});
5-
6-
async function getCurrentLanguage() {
7-
try {
8-
const response = await fetch("/get-locale");
9-
return await response.text();
10-
} catch (error) {
11-
console.error("Failed to fetch current language");
12-
return "en";
13-
}
14-
}
15-
16-
function changeLanguage(lang) {
17-
fetch("/change-language", {
18-
method: "POST",
19-
headers: {
20-
"Content-Type": "application/json",
21-
},
22-
body: JSON.stringify({ language: lang }),
23-
}).then((response) => {
24-
if (response.ok) {
25-
localStorage.setItem("language", lang);
26-
location.reload();
27-
} else {
28-
console.error("Failed to change language");
29-
}
30-
});
31-
}
32-
33-
function setLanguageOnPageLoad(language) {
34-
document.getElementById("language").value = language;
35-
}
1+
document.addEventListener('DOMContentLoaded', fetchLanguages);
2+
3+
async function fetchLanguages() {
4+
try {
5+
const [languagesResponse, currentLanguageResponse] = await Promise.all([
6+
fetch('/get-languages'),
7+
fetch('/get-locale')
8+
]);
9+
10+
const languages = await languagesResponse.json();
11+
const currentLanguage = await currentLanguageResponse.text();
12+
13+
const languageSelect = document.getElementById('language');
14+
languages.forEach(lang => {
15+
const option = document.createElement('option');
16+
option.value = lang;
17+
option.textContent = lang;
18+
languageSelect.appendChild(option);
19+
});
20+
21+
const savedLanguage = localStorage.getItem("language") || currentLanguage;
22+
setLanguageOnPageLoad(savedLanguage);
23+
} catch (error) {
24+
console.error("Failed to fetch languages or current language");
25+
}
26+
}
27+
28+
function setLanguageOnPageLoad(language) {
29+
document.getElementById("language").value = language;
30+
}
31+
32+
function changeLanguage(lang) {
33+
fetch("/change-language", {
34+
method: "POST",
35+
headers: {
36+
"Content-Type": "application/json",
37+
},
38+
body: JSON.stringify({ language: lang }),
39+
}).then((response) => {
40+
if (response.ok) {
41+
localStorage.setItem("language", lang);
42+
location.reload();
43+
} else {
44+
console.error("Failed to change language");
45+
}
46+
});
47+
}

run.py

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import secrets
2+
23
from server.bp import bp
34
from server.website import Website
45
from server.backend import Backend_Api
6+
from server.babel import create_babel
57
from json import load
6-
from flask import Flask, session
7-
from flask_babel import Babel
8+
from flask import Flask
89

910
if __name__ == '__main__':
1011

@@ -15,15 +16,10 @@
1516

1617
# Create the app
1718
app = Flask(__name__)
18-
app.secret_key = secrets.token_hex(16)
19-
19+
app.secret_key = secrets.token_hex(16)
20+
2021
# Set up Babel
21-
babel = Babel(app)
22-
app.config['BABEL_DEFAULT_LOCALE'] = 'es'
23-
app.config['BABEL_LANGUAGES'] = ['en', 'es', 'pt-br']
24-
def get_locale():
25-
return session.get('language', 'en')
26-
babel.init_app(app, locale_selector=get_locale)
22+
create_babel(app)
2723

2824
# Set up the website routes
2925
site = Website(bp, url_prefix)
@@ -42,7 +38,7 @@ def get_locale():
4238
view_func=backend_api.routes[route]['function'],
4339
methods=backend_api.routes[route]['methods'],
4440
)
45-
41+
4642
# Register the blueprint
4743
app.register_blueprint(bp, url_prefix=url_prefix)
4844

server/babel.py

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from flask import request, session, jsonify
2+
from flask_babel import Babel
3+
4+
BABEL_DEFAULT_LOCALE = 'en'
5+
BABEL_LANGUAGES = [
6+
'ar',
7+
'bn',
8+
'de',
9+
'en',
10+
'es',
11+
'fr',
12+
'hi',
13+
'id',
14+
'ja',
15+
'jv',
16+
'ko',
17+
'mr',
18+
'pa',
19+
'pt_BR',
20+
'ru',
21+
'ta',
22+
'te',
23+
'tr',
24+
'uk',
25+
'ur',
26+
'vi',
27+
'zh',
28+
]
29+
30+
31+
def create_babel(app):
32+
"""Create and initialize a Babel instance with the given Flask app."""
33+
babel = Babel(app)
34+
app.config['BABEL_DEFAULT_LOCALE'] = BABEL_DEFAULT_LOCALE
35+
app.config['BABEL_LANGUAGES'] = BABEL_LANGUAGES
36+
37+
babel.init_app(app, locale_selector=get_locale)
38+
39+
40+
def get_locale():
41+
"""Get the user's locale from the session or the request's accepted languages."""
42+
user_language = session.get('language')
43+
if user_language is not None:
44+
return user_language
45+
46+
return request.accept_languages.best_match(BABEL_LANGUAGES)
47+
48+
49+
def get_languages():
50+
return jsonify(BABEL_LANGUAGES)

server/website.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from flask_babel import refresh
33
from time import time
44
from os import urandom
5+
from server.babel import get_locale, get_languages
56

67

78
class Website:
@@ -28,6 +29,10 @@ def __init__(self, bp, url_prefix) -> None:
2829
'/get-locale': {
2930
'function': self.get_locale,
3031
'methods': ['GET']
32+
},
33+
'/get-languages': {
34+
'function': self.get_languages,
35+
'methods': ['GET']
3136
}
3237
}
3338

@@ -45,7 +50,9 @@ def change_language(self):
4550
session['language'] = data.get('language')
4651
refresh()
4752
return '', 204
48-
49-
def get_locale(self):
50-
return session.get('language', 'en')
5153

54+
def get_locale(self):
55+
return get_locale()
56+
57+
def get_languages(self):
58+
return get_languages()

0 commit comments

Comments
 (0)