vietnamese

This commit is contained in:
nnduc
2026-10-24 17:46:20 +07:00
parent 5467b0aa2c
commit a3cf10cb0a
33 changed files with 4306 additions and 94 deletions
@@ -30,4 +30,24 @@
</li>
{% endfor %}
</ul>
<ul class="list active">
<li onclick="Account_ajaxOmemoBackup()">
<span class="primary icon gray">
<i class="material-symbols">key</i>
</span>
<div>
<p class="line">{{ __('account.omemo_backup') }}</p>
<p class="line">{{ __('account.omemo_backup_text') }}</p>
</div>
</li>
<li onclick="Account_ajaxOmemoRestore()">
<span class="primary icon gray">
<i class="material-symbols">settings_backup_restore</i>
</span>
<div>
<p class="line">{{ __('account.omemo_restore') }}</p>
<p class="line">{{ __('account.omemo_restore_text') }}</p>
</div>
</li>
</ul>
{% endif %}
@@ -0,0 +1,28 @@
<section>
<h3>{{ __('account.omemo_backup') }}</h3>
<br />
<h4 class="gray">{{ __('account.omemo_backup_explain') }}</h4>
<form name="omemo_backup" onsubmit="return false;"
data-notsame="{{ __('account.password_not_same') }}">
<div>
<input type="password" name="password" autocomplete="new-password"
placeholder="{{ __('account.omemo_password_hint') }}"/>
<label>{{ __('account.password') }}</label>
</div>
<div>
<input type="password" name="password_confirmation" autocomplete="new-password"
placeholder="{{ __('account.omemo_password_hint') }}"/>
<label>{{ __('account.password_confirmation') }}</label>
</div>
</form>
<p class="error" id="omemo_backup_error"></p>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button onclick="Account.omemoBackup()" class="button flat color oppose">
{{ __('account.omemo_download') }}
</button>
</footer>
@@ -0,0 +1,29 @@
<section>
<h3>{{ __('account.omemo_restore') }}</h3>
<br />
<h4 class="gray">{{ __('account.omemo_restore_explain') }}</h4>
<form name="omemo_restore" onsubmit="return false;"
data-nofile="{{ __('account.omemo_no_file') }}"
data-invalid="{{ __('account.omemo_invalid') }}"
data-otheraccount="{{ __('account.omemo_other_account') }}"
data-wrongpassword="{{ __('account.omemo_wrong_password') }}">
<div>
<input type="file" name="file" accept=".json,application/json"/>
<label>{{ __('account.omemo_file') }}</label>
</div>
<div>
<input type="password" name="password" autocomplete="current-password"/>
<label>{{ __('account.password') }}</label>
</div>
</form>
<p class="error" id="omemo_backup_error"></p>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button onclick="Account.omemoRestore()" class="button flat color red">
{{ __('account.omemo_restore_button') }}
</button>
</footer>
+2 -2
View File
@@ -4,11 +4,11 @@
<form name="password">
<div>
<input type="password" placeholder="Choose a nice password" name="password"/>
<input type="password" placeholder="{{ __('account.password_placeholder') }}" name="password"/>
<label>{{ __('account.password') }}</label>
</div>
<div>
<input type="password" placeholder="Type your password again" name="password_confirmation"/>
<input type="password" placeholder="{{ __('account.password_again') }}" name="password_confirmation"/>
<label>{{ __('account.password_confirmation') }}</label>
</div>
</form>
+22
View File
@@ -20,6 +20,9 @@
<span class="control icon active" onclick="ChatActions_ajaxShowSearchDialog('{{ jid|echapJS }}', true)">
<i class="material-symbols">manage_search</i>
</span>
<span class="control icon active files_button" onclick="ChatActions_ajaxShowFiles('{{ jid|echapJS }}', true)" title="{{ __('chatactions.files') }}">
<i class="material-symbols">perm_media</i>
</span>
{% if conference.group and conference.connected and conference.muji.count == 0 %}
<span class="control icon active divided {% if in_call %}disabled{% endif %}" onclick="Visio_ajaxGetMujiLobby('{{ jid|echapJS }}', true, false);">
@@ -112,6 +115,14 @@
</ul>
<ul class="list context_menu thin active">
<li class="files_menu" onclick="ChatActions_ajaxShowFiles('{{ jid|echapJS }}', true)">
<span class="primary icon gray">
<i class="material-symbols">perm_media</i>
</span>
<div>
<p class="line">{{ __('chatactions.files') }}</p>
</div>
</li>
{% if conference.role == 'moderator' or conference.affiliation == 'owner' %}
<li class="subheader">
<div>
@@ -209,6 +220,9 @@
<span class="control icon active" onclick="ChatActions_ajaxShowSearchDialog('{{ jid|echapJS }}')">
<i class="material-symbols">manage_search</i>
</span>
<span class="control icon active files_button" onclick="ChatActions_ajaxShowFiles('{{ jid|echapJS }}', false)" title="{{ __('chatactions.files') }}">
<i class="material-symbols">perm_media</i>
</span>
{% if not in_call %}
{% if call_audio %}
@@ -266,6 +280,14 @@
</li>
</ul>
<ul class="list context_menu active">
<li class="files_menu" onclick="ChatActions_ajaxShowFiles('{{ contact.id|echapJS }}', false)">
<span class="primary icon gray">
<i class="material-symbols">perm_media</i>
</span>
<div>
<p class="line">{{ __('chatactions.files') }}</p>
</div>
</li>
<li onclick="ChatActions_ajaxGetContact('{{ contact.id|echapJS }}')">
<span class="primary icon gray">
<i class="material-symbols">person</i>
@@ -0,0 +1,57 @@
<section id="chat_files">
<header>
<ul class="list">
<li>
<div>
<p>{{ __('chatactions.files') }}</p>
</div>
</li>
</ul>
<ul class="tabs wide">
{% for tab in ["images", "videos", "recordings", "files"] %}
<li class="{% if loop.first %}active{% endif %}" data-tab="{{ tab }}" onclick="ChatActions.filesTab('{{ tab }}')">
<a href="#" onclick="event.preventDefault()">{{ __('chatactions.files_' ~ tab) }}</a>
</li>
{% endfor %}
</ul>
</header>
<div class="files_tab" data-tab="images">
<ul class="files_grid" data-list="images">
{% for f in images %}
<li data-published="{{ f.published }}">
<img src="{{ f.thumb }}" alt="{{ f.name }}" title="{{ f.date }}" loading="lazy"
onclick="Preview_ajaxHttpShow('{{ f.url|echapJS }}', {{ f.mid }})"/>
</li>
{% endfor %}
</ul>
</div>
{% for tab, list, icon in [["videos", videos, "movie"], ["recordings", recordings, "mic"], ["files", files, "description"]] %}
<div class="files_tab hide" data-tab="{{ tab }}">
<ul class="list active divided" data-list="{{ tab }}" data-icon="{{ icon }}">
{% for f in list %}
<li data-published="{{ f.published }}">
<span class="primary icon gray"><i class="material-symbols">{{ icon }}</i></span>
<span class="control icon active gray" title="{{ __('chatactions.files_message') }}"
onclick="event.stopPropagation(); Chat_ajaxGetMessageContext('{{ jid|echapJS }}', {{ f.mid }}); Drawer.clear()">
<i class="material-symbols">chat</i>
</span>
<div onclick="window.open('{{ f.url|echapJS }}', '_blank', 'noopener')">
<p class="line">{{ f.name }}</p>
{% if tab == "recordings" %}
<audio controls preload="none" src="{{ f.url }}" onclick="event.stopPropagation()"></audio>
{% endif %}
<p class="line">{% if f.size %}{{ f.size }} · {% endif %}{{ f.date }}</p>
</div>
</li>
{% endfor %}
</ul>
</div>
{% endfor %}
<div class="placeholder files_empty">
<i class="material-symbols">perm_media</i>
<h4>{{ __('chatactions.files_empty') }}</h4>
</div>
</section>
@@ -7,7 +7,7 @@
<span class="resource {{ color }}">{{ message.resource }}</span>
{% endif %}
{% if message.encrypted %}
<p class="encrypted">{% if message.retracted %}{{ __('message.retracted') }}{% else %}{{ __('message.encrypted') }}{% endif %} <i class="material-symbols fill">lock</i></p>
<p class="encrypted" data-mid="{{ message.mid }}">{% if message.retracted %}{{ __('message.retracted') }}{% else %}{{ __('message.encrypted') }}{% endif %} <i class="material-symbols fill">lock</i></p>
{% elif message.retracted %}
<p class="retracted">{{ __('message.retracted') }} <i class="material-symbols">delete</i></p>
{% elif picture %}
@@ -6,7 +6,7 @@
<form name="search" onsubmit="return false;">
<div>
<input name="keyword" autocomplete="off"
placeholder="{{ __('button.search') }}" oninput="ChatActions_ajaxSearchMessages('{{ jid|echapJS }}', this.value, {% if muc %}true{% else %}false{% endif %});" type="text">
placeholder="{{ __('button.search') }}" oninput="ChatActions.search('{{ jid|echapJS }}', this.value, {% if muc %}true{% else %}false{% endif %});" type="text">
</div>
</form>
</li>