feat(i18n): add English localization with per-user language preference

This commit is contained in:
2026-07-06 22:41:09 +08:00
parent 643f1dc35a
commit 87785494d6
8 changed files with 243 additions and 98 deletions

View File

@@ -2,7 +2,7 @@
{% block title %}{{ 'nav.profiles'|t(user.language) }} - {{ 'brand'|t(user.language) }}{% endblock %}
{% block content %}
<div class="section-header">
<h1>{{ 'nav.profiles'|t(user.language) }}</h1>
<h1>Profile</h1>
</div>
<div class="inline-form">
<form method="post" action="/profiles" class="form-row">
@@ -56,27 +56,34 @@
</div>
<div class="profile-card-footer">
<span class="profile-card-date">{{ 'profiles.created_at'|t(user.language) }} {{ p.created_at.strftime('%Y-%m-%d') }}</span>
<a href="/profiles/{{ p.id }}/postcards" class="btn btn-sm">{{ 'profiles.view'|t(user.language) }}</a>
<form method="post" action="/profiles/{{ p.id }}/delete" class="inline">
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('{{ 'profiles.confirm_delete'|t(user.language) }}')">{{ 'profiles.delete'|t(user.language) }}</button>
</form>
<div class="profile-card-actions">
<a href="/profiles/{{ p.id }}/postcards" class="btn btn-primary btn-sm">{{ 'profiles.view'|t(user.language) }}</a>
<form method="post" action="/profiles/{{ p.id }}/delete" class="inline">
<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('{{ 'profiles.confirm_delete'|t(user.language) }}')">{{ 'profiles.delete'|t(user.language) }}</button>
</form>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="empty">{{ 'profiles.new_ph'|t(user.language) }}</p>
<div class="empty-state">
<div class="empty-icon">📮</div>
<p>还没有 Profile</p>
<p class="empty-sub">{{ 'profiles.new_ph'|t(user.language) }}</p>
</div>
{% endif %}
<script>
function startRename(id) {
document.getElementById('name-display-' + id).style.display = 'none';
document.getElementById('name-edit-' + id).style.display = '';
document.getElementById('name-edit-' + id).querySelector('input').focus();
var form = document.getElementById('name-edit-' + id);
form.style.display = 'inline-flex';
form.querySelector('input').focus();
}
function cancelRename(id) {
var form = document.getElementById('name-edit-' + id);
form.style.display = 'none';
document.getElementById('name-display-' + id).style.display = '';
document.getElementById('name-edit-' + id).style.display = 'none';
}
</script>
{% endblock %}