Skip to content

Commit

Permalink
New translations added: arz,ch,fi,fr,hi,nl,no,se,tr
Browse files Browse the repository at this point in the history
  • Loading branch information
autumoswitzerland committed Oct 9, 2024
1 parent 74166d9 commit e501768
Show file tree
Hide file tree
Showing 53 changed files with 4,763 additions and 71 deletions.
2 changes: 1 addition & 1 deletion cfg/beetroot.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ web_admin_role_delete=no
#
# Also populate 'cfg/languages.cfg'.
#
web_languages=en,de,es,it,pt,ru,ja,zh
web_languages=en,zh,hi,es,fr,arz,pt,ru,ja,de,tr,it,nl,se,fi,no,ch

#
# Should the system scan for '{$l.*}' tags in web templates
Expand Down
2 changes: 1 addition & 1 deletion cfg/beetroot_dist.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ web_admin_role_delete=no
#
# Also populate 'cfg/languages.cfg'.
#
web_languages=en,de,es,it,pt,ru,ja,zh
web_languages=en,zh,hi,es,fr,arz,pt,ru,ja,de,tr,it,nl,se,fi,no,ch

#
# Should the system scan for '{$l.*}' tags in web templates
Expand Down
2 changes: 1 addition & 1 deletion cfg/beetroot_test.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ web_admin_role_delete=no
#
# Also populate 'cfg/languages.cfg'.
#
web_languages=en,de,es,it,pt,ru,ja,zh
web_languages=en,zh,hi,es,fr,arz,pt,ru,ja,de,tr,it,nl,se,fi,no,ch

#
# Should the system scan for '{$l.*}' tags in web templates
Expand Down
16 changes: 12 additions & 4 deletions cfg/languages.cfg
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
# Add more languages as needed
en=English
pt=Português
zh=中文
hi=हिन्दी
es=Español
fr=Français
arz=الفصحى
pt=Português
ru=Русский
ja=日本語
de=Deutsch
tr=Türkçe
it=Italiano
zh=中文
ja=日本語
ru=Русский
nl=Nederlands
se=Svenska
fi=Suomi
no=Norsk
ch=CH-Dütsch
Binary file not shown.
69 changes: 32 additions & 37 deletions src/main/java/ch/autumo/beetroot/LanguageManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ private String translate(String key, String lang, boolean fullEscape, Object...

/**
* Translate method for the template engine and for
* users of this framework that returns the defaukt value
* users of this framework that returns the default value
* if no translation is found at all.
*
* Should only be used for special cases.
Expand Down Expand Up @@ -828,43 +828,38 @@ public String retrieveLanguage(BeetRootHTTPSession session) {
* @return found language
*/
public String getLanguageFromHttpSession(BeetRootHTTPSession session) {

final String acceptLanguage = ((IHTTPSession) session).getHeaders().get("accept-language");

if (acceptLanguage == null || acceptLanguage.isEmpty()) {
return LanguageManager.DEFAULT_LANG;
} else {
// Split the Accept-Language header by commas to get each language part
final String languages[] = acceptLanguage.split(",");
// Map to store language and its priority (q-value)
final Map<String, Double> langMap = new HashMap<>();
for (String lang : languages) {
final Matcher matcher = HTTP_HEADER_LANG_PATTERN.matcher(lang.trim());
if (matcher.find()) {
final String languageCode = matcher.group(1); // Get the language code (e.g., en, fr, haw)
final String qValue = matcher.group(2); // Get the q-value if present
double quality = (qValue != null) ? Double.parseDouble(qValue) : 1.0; // Default q-value is 1.0
langMap.put(languageCode, quality);
}
}
// Find the language with the highest q-value
final String headerLang = langMap.entrySet()
.stream()
.max(Map.Entry.comparingByValue()) // Sort by q-value
.map(Map.Entry::getKey) // Return the language code with highest priority
.orElse(null); // Return null if no valid language code found

if (headerLang == null)
return LanguageManager.DEFAULT_LANG;

// Compare with application available languages
final String langs[] = BeetRootConfigurationManager.getInstance().getSepValues("web_languages");
for (int i = 0; i < langs.length; i++) {
if (headerLang.equals(langs[i]))
return headerLang;
String acceptLanguage = ((IHTTPSession) session).getHeaders().get("accept-language");
if (acceptLanguage == null || acceptLanguage.isEmpty()) {
return LanguageManager.DEFAULT_LANG;
} else {
// Split the Accept-Language header by commas to get each language part
final String languages[] = acceptLanguage.split(",");
// Map to store language and its priority (q-value)
final Map<String, Double> langMap = new HashMap<>();
for (String lang : languages) {
final Matcher matcher = HTTP_HEADER_LANG_PATTERN.matcher(lang.trim());
if (matcher.find()) {
final String languageCode = matcher.group(1); // Get the language code (e.g., en, fr, haw)
final String qValue = matcher.group(2); // Get the q-value if present
double quality = (qValue != null) ? Double.parseDouble(qValue) : 1.0; // Default q-value is 1.0
langMap.put(languageCode, quality);
}
}

}
// Find the language with the highest q-value
final String headerLang = langMap.entrySet().stream().max(Map.Entry.comparingByValue()) // Sort by q-value
.map(Map.Entry::getKey) // Return the language code with highest priority
.orElse(null); // Return null if no valid language code found

if (headerLang == null)
return LanguageManager.DEFAULT_LANG;

// Compare with application available languages
final String langs[] = BeetRootConfigurationManager.getInstance().getSepValues("web_languages");
for (int i = 0; i < langs.length; i++) {
if (headerLang.equals(langs[i]))
return headerLang;
}
}
return LanguageManager.DEFAULT_LANG;
}

Expand Down
4 changes: 4 additions & 0 deletions web/css/default.css
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ a.login {
color: #07b;
}

.dropdown-content a {
padding: 6px 16px;
}

.log-container legend{
background-color: transparent !important;
}
Expand Down
41 changes: 34 additions & 7 deletions web/css/refs.css
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,24 @@ body {
/**
* Images for language selection entries.
*/
.lang_select_de {
background-image: url('/img/lang/de.png');
}
.lang_select_en {
background-image: url('/img/lang/en.png');
}
.lang_select_it {
background-image: url('/img/lang/it.png');
.lang_select_zh {
background-image: url('/img/lang/zh.png');
}
.lang_select_hi {
background-image: url('/img/lang/hi.png');
}
.lang_select_es {
background-image: url('/img/lang/es.png');
}
.lang_select_fr {
background-image: url('/img/lang/fr.png');
}
.lang_select_arz {
background-image: url('/img/lang/arz.png');
}
.lang_select_pt {
background-image: url('/img/lang/pt.png');
}
Expand All @@ -57,8 +63,29 @@ body {
.lang_select_ja {
background-image: url('/img/lang/ja.png');
}
.lang_select_zh {
background-image: url('/img/lang/zh.png');
.lang_select_de {
background-image: url('/img/lang/de.png');
}
.lang_select_tr {
background-image: url('/img/lang/tr.png');
}
.lang_select_it {
background-image: url('/img/lang/it.png');
}
.lang_select_nl {
background-image: url('/img/lang/nl.png');
}
.lang_select_se {
background-image: url('/img/lang/se.png');
}
.lang_select_fi {
background-image: url('/img/lang/fi.png');
}
.lang_select_no {
background-image: url('/img/lang/no.png');
}
.lang_select_ch {
background-image: url('/img/lang/ch.png');
}

.log-container {
Expand Down
Binary file added web/img/lang/arz.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/fi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/fr.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/hi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/nl.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/no.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/se.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/img/lang/tr.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
135 changes: 135 additions & 0 deletions web/lang/app/lang_arz.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#
# ترجمات تطبيق القاعدة
#
# عادةً لا تحتاج إلى تغيير الترجمات هنا. تُستخدم هذه
# الترجمات بواسطة beetRoot، ولكن بالطبع يمكنك
# تعديل النص.
#
# أضف ملف ترجمة لكل لغة، مثل:
# - lang_en.properties
# - lang_de.properties
#
# يجب عليك استخدام رمز الهروب للأحرف المنقوطة بوضع
# apostrophe إضافي؛
# اكتب "You''ll be happy and have everything!".
#

base.err.lang.title=خطأ في تكوين اللغة
base.err.lang.msg=تم تكوين اللغة(ات) ''{0}''، ولكن الترجمات مفقودة!
base.err.resource.title=المورد غير موجود!
base.err.resource.msg=المورد على الويب ''{0}'' غير موجود على الخادم!
base.err.resource.mime.title=نوع MIME للمورد غير منفذ!
base.err.resource.mime.msg=نوع MIME غير منفذ للمورد على الويب المطلوب ''{0}''!

base.err.srv.404.title=الصفحة المطلوبة غير موجودة. (خطأ HTTP 404)
base.err.srv.501.title=لا يوجد تنفيذ لهذا الطلب. (خطأ HTTP 501)
base.err.srv.io.title=خطأ داخلي في الخادم
base.err.srv.io.msg=استثناء الإدخال/الإخراج:<br>{0}
base.err.srv.re.title=خطأ داخلي في الخادم
base.err.srv.re.msg=استثناء في الاستجابة (الحالة: {0}): استثناء<br>{1}
base.err.srv.db.title=خطأ داخلي في الخادم
base.err.srv.db.msg=استثناء في قاعدة البيانات:<br>{0}
base.err.srv.ex.title=خطأ داخلي في الخادم
base.err.srv.ex.msg=استثناء:<br>{0}
base.err.srv.mail.title=خطأ داخلي في الخادم
base.err.srv.mail.msg=تعذر إرسال البريد:<br>{0}
base.err.srv.sms.title=خطأ داخلي في الخادم
base.err.srv.sms.msg=تعذر إرسال SMS:<br>{0}

base.err.csrf.inv.title=رمز CSRF غير صالح!
base.err.csrf.inv.msg=يجب أن يكون هناك شخص ما يغش أو أنك ضغطت على "رجوع" في المتصفح وبالتالي استخدمت نموذجًا قديمًا/غير صالح لتعديل البيانات! ارجع وقم بإعادة تحميل الصفحة أو استخدم القائمة!
base.err.csrf.gen.title=تعذر توليد رمز CSRF!
base.err.csrf.gen.msg=استثناء:<br>{0}

base.err.handler.construct.title=خطأ في مُنشئ المعالج!
base.err.handler.construct.msg=لا يوجد تنفيذ لصف المعالج ''{0}'' مع {1} معلمات.<br>استثناء:<br>{2}
base.err.handler.impl.title=خطأ في المعالج!
base.err.handler.impl.msge=لا يوجد تنفيذ لصف المعالج ''{0}''!<br>استثناء:<br>{1}

base.err.template.title=خطأ في محرك القالب
base.err.template.msg=يرجى الاتصال بالفريق الفني لديك.
base.err.template.parsing.title=خطأ في تحليل القالب!
base.err.template.parsing.msg=القالب:<br>''{0}''
base.err.template.execute.title=تعذر تنفيذ القالب ''{0}''!

base.err.login.msg=تسجيل الدخول غير صالح، حاول مرة أخرى!

base.error.noaccess.msg=عذرًا، ليس لديك حق الوصول هنا.

base.error.handler.unique=تم العثور بالفعل على ''{0}'' بالقيمة(القيم) {1}، حدد أخرى!
base.error.handler.savedid=تعذر الحصول على معرف من السجل المراد حفظه؛ فشلت عملية التخزين!
base.error.handler.savedid.rel=تعذر الحصول على معرف من السجل المتعدد؛ فشلت عملية التخزين!
base.error.handler.delete.integrity=السجل الذي تحاول حذفه مرتبط بسجل آخر!
base.error.handler.delete.abort=تم إلغاء حذف ''{0}'' بمعرف {1}!
base.error.handler.update.abort=تم إلغاء تحديث ''{0}'' بمعرف {1}!

base.info.tasks.crondesc=الوصف
base.error.tasks.crondesc=تعذر تحديد وصف cron لquartz!

base.info.logout.msg=لقد قمت بتسجيل الخروج الآن.
base.info.welcome.msg=مرحبًا {0}!

base.info.updated=تم تحديث السجل في {0}.
base.info.saved=تم حفظ السجل في {0}.
base.info.deleted=تم حذف السجل من {0}.
base.info.stored0=تم حفظ الملف.
base.info.stored1=تم حفظ الملف ''{0}''.

base.info.session.timeout=انتهت صلاحية جلستك، قم بتسجيل الدخول مرة أخرى.
base.info.session.inv=تم إبطال هذه المكالمة! قم بإجراء اختيار جديد.
base.info.session.inv.refresh=تم إبطال هذه المكالمة، وتم تحديث الصفحة!

base.operation.delete.ask=هل أنت متأكد أنك تريد حذف ''{0}''؟

base.name.page=صفحة
base.name.of=من
base.name.showing=يعرض
base.name.recordsoutof=سجل(سجلات) من
base.name.total=الإجمالي

base.name.refresh=تحديث

base.name.login=تسجيل الدخول
base.name.logout=تسجيل الخروج
base.name.user=مستخدم
base.name.users=مستخدمون

base.name.view=عرض
base.name.edit=تحرير
base.name.add=إضافة
base.name.delete=حذف

base.mail.reset.title=autumo beetRoot - إعادة تعيين كلمة المرور
base.mail.reset.subtitle=إعادة تعيين كلمة المرور
base.mail.reset.msg=إليك الرابط لإعادة تعيين كلمة المرور الخاصة بك.

base.mail.code.title=autumo beetRoot - رمز تسجيل الدخول
base.mail.code.subtitle=رمز تسجيل الدخول
base.mail.code.msg=يرجى ملاحظة أن الرمز صالح لمدة 5 دقائق كحد أقصى ويتبع دورات التجديد الثابتة لGoogle Authenticator، أي قد يكون الرمز على وشك الانتهاء وسيتعين عليك تسجيل الدخول مرة أخرى للحصول على رمز جديد إذا لم يعمل.
base.sms.code.info=autumo beetRoot - رمز تسجيل الدخول
base.sms.code.note=صالح لمدة 5 دقائق

base.2fa.title.text=رمز QR لتطبيق Google Authenticator

base.switch.yes=نعم
base.switch.no=لا

role.Administrator=مدير
role.Operator=مشغل
role.Controller=متحكم

system.log.nobackend=لا يوجد سجل للخادم الخلفي متاح.

pw.info=يجب أن تتضمن كلمة المرور:
pw.hide=إخفاء كلمة المرور
pw.show=عرض كلمة المرور
pw.chars=الأحرف
pw.capital=على الأقل حرف كبير واحد
pw.number=على الأقل رقم واحد
pw.special=على الأقل حرف خاص واحد
pw.letter=لا توجد مسافات


#
# ترجمات تطبيق المستخدم
#
Loading

0 comments on commit e501768

Please sign in to comment.