Skip to content

Commit 21f4dd7

Browse files
committed
resolved #8 ; web interface language is now browser-specific
1 parent b758d0e commit 21f4dd7

File tree

3 files changed

+65
-12
lines changed

3 files changed

+65
-12
lines changed

static/js/main.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
1+
// Language detection and forwarding
2+
document.addEventListener('DOMContentLoaded', function() {
3+
// Only send if not already set in session (could check via a cookie or a hidden field)
4+
if (!window.sessionStorage.getItem('languageSet')) {
5+
var lang = navigator.language || navigator.userLanguage;
6+
fetch('/language', {
7+
method: 'POST',
8+
headers: {'Content-Type': 'application/json'},
9+
body: JSON.stringify({language: lang.replace('-', '_')})
10+
}).then(function(response) {
11+
if (response.ok) {
12+
window.sessionStorage.setItem('languageSet', '1');
13+
// Reload the page to apply new language if needed
14+
window.location.reload();
15+
}
16+
});
17+
}
18+
});
19+
120
// Accumulate all selected/dropped files in this array
221
let uploadedFiles = [];
322

templates/index.html

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!DOCTYPE html>
2-
<html lang="en">
2+
<html lang="{{ lang_code }}">
33
<head>
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -13,34 +13,38 @@
1313
<h1>
1414
<a class="static-anchor" target="_blank" href="https://github.com/mk2112/any_to_any.py">{{ title }}</a>
1515
<p>Web</p>
16-
<a class="github-button" href="https://github.com/mk2112/any_to_any.py/fork" data-icon="octicon-repo-forked" aria-label="Fork mk2112/any_to_any.py on GitHub">Fork</a>
17-
<a class="github-button" href="https://github.com/mk2112/any_to_any.py" data-icon="octicon-star" aria-label="Star mk2112/any_to_any.py on GitHub">Star</a>
16+
<a class="github-button" href="https://github.com/mk2112/any_to_any.py/fork" data-icon="octicon-repo-forked" aria-label="Fork mk2112/any_to_any.py">Fork</a>
17+
<a class="github-button" href="https://github.com/mk2112/any_to_any.py" data-icon="octicon-star" aria-label="Star mk2112/any_to_any.py">Star</a>
1818
</h1>
1919
</header>
2020
<div class="fade-in">
2121
<main>
2222
<noscript>
2323
<div class="no-script">
24-
<p><code>{{ title }} Web</code> requires <code>JavaScript</code> to work as intended.</p>
25-
<p>Please enable <code>JavaScript</code> in your browser settings.</p>
24+
{% if lang_code == "ar" %}
25+
<p>{{ translations['js_warn_intro'].replace("[object]", title ~ " Web") }}</p>
26+
{% else %}
27+
<p><code>{{ title }} Web</code> {{ translations['js_warn_intro'] }}</p>
28+
{% endif %}
29+
<p>{{ translations['js_warn_outro'] }}</p>
2630
</div>
2731
</noscript>
2832
<form id="conversion-form" method="post" enctype="multipart/form-data">
2933
<div id="drop-area" ondrop="drop(event)" ondragover="allowDrop(event)" onclick="triggerUploadDialogue(event)">
30-
<p>Drag and drop or click to select files</p>
34+
<p>{{ translations['drag_drop_hint'] }}</p>
3135
<input type="file" name="files" id="files" multiple onchange="handleFiles(this.files, true)">
3236
<ul id="file-list"></ul>
3337
</div>
3438
<div id="conversion-options">
35-
<label for="conversion-type">Convert to:</label>
39+
<label for="conversion-type">{{ translations['convert_to'] }}:</label>
3640
<select id="conversion-type">
3741
{% for option in options %}
3842
<option value="{{ option }}">{{ option }}</option>
3943
{% endfor %}
4044
</select>
41-
<button title="Convert All Given Files To Selected Format" type="button" onclick="submitForm('/convert')">Convert</button>
42-
<button title="Merge Movie Data With The Audio Track Of An Equally Named Audio File" type="button" onclick="submitForm('/merge')">Merge</button>
43-
<button title="Glue Files Of Same Type Together, Back To Back, In Above Displayed Order" type="button" onclick="submitForm('/concat')">Concatenate</button>
45+
<button title="{{ translations['convert_web_help'] }}" type="button" onclick="submitForm('/convert')">{{ translations['convert'] }}</button>
46+
<button title="{{ translations['merge_web_help'] }}" type="button" onclick="submitForm('/merge')">{{ translations['merge'] }}</button>
47+
<button title="{{ translations['concatenate_web_help'] }}" type="button" onclick="submitForm('/concat')">{{ translations['concatenate'] }}</button>
4448
</div>
4549
</form>
4650
<div id="progress-container" style="display: none; margin-top: 1em;">

web_to_any.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
import tempfile
44
import threading
55
import webbrowser
6+
import modules.language_support as lang
67
from any_to_any import AnyToAny
7-
from flask import Flask, render_template, request, send_file, Response, jsonify, abort
8+
from flask import Flask, render_template, request, send_file, Response, jsonify, abort, session
89
from flask_uploads import UploadSet, configure_uploads, ALL
910

1011
"""
1112
Web server providing a web interface as extension to the CLI-based any_to_any.py
1213
"""
1314

1415
app = Flask(__name__, template_folder=os.path.abspath("templates"))
16+
app.secret_key = os.urandom(32) # Distinguish session
17+
1518
host = "127.0.0.1"
1619
port = 5000
1720
any_to_any = AnyToAny()
@@ -66,7 +69,17 @@ def process_params() -> tuple:
6669

6770
@app.route("/")
6871
def index():
69-
return render_template("index.html", title="Any_To_Any.py", options=any_to_any.supported_formats)
72+
lang_code = session.get('language', 'en_US')
73+
language = lang.LANGUAGE_CODES[lang_code]
74+
translations = lang.get_all_translations(language)
75+
return render_template(
76+
"index.html",
77+
title="Any_To_Any.py",
78+
options=any_to_any.supported_formats,
79+
translations=translations,
80+
lang_code=lang_code[:2],
81+
supported_languages=lang.LANGUAGE_CODES
82+
)
7083

7184

7285
def send_to_backend(
@@ -186,6 +199,23 @@ def download_zip(job_id):
186199
abort(404)
187200
return push_zip(cv_dir)
188201

202+
@app.route('/language', methods=['POST'])
203+
def set_language():
204+
# Web interface language is set via the browser, *not* via sys language
205+
# This POST helps retrieve client's language info
206+
data = request.get_json()
207+
lang_code = data.get('language')
208+
if "_" not in lang_code:
209+
for code, _ in lang.LANGUAGE_CODES.items():
210+
if lang_code in code:
211+
lang_code = code
212+
break
213+
if lang_code and lang_code in lang.LANGUAGE_CODES:
214+
session['language'] = lang_code
215+
language = lang.LANGUAGE_CODES[lang_code]
216+
return {'success': True, 'lang_code': lang_code, 'language': language}
217+
return {'success': False}, 400
218+
189219
if __name__ == "__main__":
190220
webbrowser.open(any_to_any.web_host)
191221
app.run(debug=False, host=host, port=port)

0 commit comments

Comments
 (0)