Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Language setting #11

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import static de.uoc.dh.idh.autodone.utils.WebUtils.href;
import static java.util.Map.of;

import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
Expand All @@ -20,6 +22,7 @@
import de.uoc.dh.idh.autodone.entities.StatusEntity;
import de.uoc.dh.idh.autodone.services.GroupService;
import de.uoc.dh.idh.autodone.services.StatusService;
import de.uoc.dh.idh.autodone.utils.SupportedLocales;

@Controller()
@RequestMapping("/group")
Expand All @@ -43,6 +46,9 @@ public String delete(@RequestParam() Map<String, String> params) {

@GetMapping()
public String get(Model model, @RequestParam() Map<String, String> params) {
Map<String, String> languages = SupportedLocales.getLanguages();
model.addAttribute("languages", languages);

if (params.containsKey("uuid")) {
var group = groupService.getOne(params.get("uuid"));
var status = mapFields(of("group", group), new StatusEntity());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import de.uoc.dh.idh.autodone.services.GroupService;
import de.uoc.dh.idh.autodone.services.ImportService;
import de.uoc.dh.idh.autodone.services.StatusService;
import de.uoc.dh.idh.autodone.utils.SupportedLocales;
import jakarta.servlet.http.HttpSession;

@Controller()
Expand Down Expand Up @@ -49,6 +50,9 @@ public String get(Model model, @RequestParam() Map<String, String> params) {
var alerts = new LinkedMultiValueMap<Integer, String>();
var errors = new LinkedMultiValueMap<Integer, String>();

Map<String, String> languages = SupportedLocales.getLanguages();
model.addAttribute("languages", languages);

group.status.stream().flatMap((s) -> s.exceptions.stream()).sorted((a, b) -> {
return ((ParseException) a).getErrorOffset() > ((ParseException) b).getErrorOffset() ? 1 : -1;
}).forEach((exception) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,15 @@
import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import de.uoc.dh.idh.autodone.utils.SupportedLocales;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.EnumType;
import jakarta.persistence.Transient;
import lombok.Data;

Expand Down Expand Up @@ -49,6 +52,10 @@ public class GroupEntity {

@Column(nullable = false)
public boolean threaded;

@Enumerated(EnumType.STRING)
@Column()
public SupportedLocales language;

//

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ public StatusEntity publish(StatusEntity status) {
data.put("media_ids", status.media.stream().map((media) -> media.id).toList());
}

if (status.group.language != null) {
data.put("language", status.group.language.getLocale());
}

if (status.group.threaded) {
var prev = statusRepository //
.findTopByGroupAndDateBeforeAndIdIsNotNullOrderByDateDesc(status.group, status.date);
Expand Down
253 changes: 253 additions & 0 deletions src/main/java/de/uoc/dh/idh/autodone/utils/SupportedLocales.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,253 @@
package de.uoc.dh.idh.autodone.utils;

import java.util.Map;
import java.util.TreeMap;

public enum SupportedLocales {
AA("aa", "Afar", "Afaraf"),
AB("ab", "Abkhaz", "аҧсуа бызшәа"),
AE("ae", "Avestan", "avesta"),
AF("af", "Afrikaans", "Afrikaans"),
AK("ak", "Akan", "Akan"),
AM("am", "Amharic", "አማርኛ"),
AN("an", "Aragonese", "aragonés"),
AR("ar", "Arabic", "اللغة العربية"),
AS("as", "Assamese", "অসমীয়া"),
AV("av", "Avaric", "авар мацӀ"),
AY("ay", "Aymara", "aymar aru"),
AZ("az", "Azerbaijani", "azərbaycan dili"),
BA("ba", "Bashkir", "башҡорт теле"),
BE("be", "Belarusian", "беларуская мова"),
BG("bg", "Bulgarian", "български език"),
BH("bh", "Bihari", "भोजपुरी"),
BI("bi", "Bislama", "Bislama"),
BM("bm", "Bambara", "bamanankan"),
BN("bn", "Bengali", "বাংলা"),
BO("bo", "Tibetan", "བོད་ཡིག"),
BR("br", "Breton", "brezhoneg"),
BS("bs", "Bosnian", "bosanski jezik"),
CA("ca", "Catalan", "Català"),
CE("ce", "Chechen", "нохчийн мотт"),
CH("ch", "Chamorro", "Chamoru"),
CO("co", "Corsican", "corsu"),
CR("cr", "Cree", "ᓀᐦᐃᔭᐍᐏᐣ"),
CS("cs", "Czech", "čeština"),
CU("cu", "Old Church Slavonic", "ѩзыкъ словѣньскъ"),
CV("cv", "Chuvash", "чӑваш чӗлхи"),
CY("cy", "Welsh", "Cymraeg"),
DA("da", "Danish", "dansk"),
DE("de", "German", "Deutsch"),
DV("dv", "Divehi", "Dhivehi"),
DZ("dz", "Dzongkha", "རྫོང་ཁ"),
EE("ee", "Ewe", "Eʋegbe"),
EL("el", "Greek", "Ελληνικά"),
EN("en", "English", "English"),
EO("eo", "Esperanto", "Esperanto"),
ES("es", "Spanish", "Español"),
ET("et", "Estonian", "eesti"),
EU("eu", "Basque", "euskara"),
FA("fa", "Persian", "فارسی"),
FF("ff", "Fula", "Fulfulde"),
FI("fi", "Finnish", "suomi"),
FJ("fj", "Fijian", "Vakaviti"),
FO("fo", "Faroese", "føroyskt"),
FR("fr", "French", "Français"),
FY("fy", "Western Frisian", "Frysk"),
GA("ga", "Irish", "Gaeilge"),
GD("gd", "Scottish Gaelic", "Gàidhlig"),
GL("gl", "Galician", "galego"),
GU("gu", "Gujarati", "ગુજરાતી"),
GV("gv", "Manx", "Gaelg"),
HA("ha", "Hausa", "هَوُسَ"),
HE("he", "Hebrew", "עברית"),
HI("hi", "Hindi", "हिन्दी"),
HO("ho", "Hiri Motu", "Hiri Motu"),
HR("hr", "Croatian", "Hrvatski"),
HT("ht", "Haitian", "Kreyòl ayisyen"),
HU("hu", "Hungarian", "magyar"),
HY("hy", "Armenian", "Հայերեն"),
HZ("hz", "Herero", "Otjiherero"),
IA("ia", "Interlingua", "Interlingua"),
ID("id", "Indonesian", "Bahasa Indonesia"),
IE("ie", "Interlingue", "Interlingue"),
IG("ig", "Igbo", "Asụsụ Igbo"),
II("ii", "Nuosu", "ꆈꌠ꒿ Nuosuhxop"),
IK("ik", "Inupiaq", "Iñupiaq"),
IO("io", "Ido", "Ido"),
IS("is", "Icelandic", "Íslenska"),
IT("it", "Italian", "Italiano"),
IU("iu", "Inuktitut", "ᐃᓄᒃᑎᑐᑦ"),
JA("ja", "Japanese", "日本語"),
JV("jv", "Javanese", "basa Jawa"),
KA("ka", "Georgian", "ქართული"),
KG("kg", "Kongo", "Kikongo"),
KI("ki", "Kikuyu", "Gĩkũyũ"),
KJ("kj", "Kwanyama", "Kuanyama"),
KK("kk", "Kazakh", "қазақ тілі"),
KL("kl", "Kalaallisut", "kalaallisut"),
KM("km", "Khmer", "ខេមរភាសា"),
KN("kn", "Kannada", "ಕನ್ನಡ"),
KO("ko", "Korean", "한국어"),
KR("kr", "Kanuri", "Kanuri"),
KS("ks", "Kashmiri", "कश्मीरी"),
KU("ku", "Kurmanji (Kurdish)", "Kurmancî"),
KV("kv", "Komi", "коми кыв"),
KW("kw", "Cornish", "Kernewek"),
KY("ky", "Kyrgyz", "Кыргызча"),
LA("la", "Latin", "latine"),
LB("lb", "Luxembourgish", "Lëtzebuergesch"),
LG("lg", "Ganda", "Luganda"),
LI("li", "Limburgish", "Limburgs"),
LN("ln", "Lingala", "Lingála"),
LO("lo", "Lao", "ລາວ"),
LT("lt", "Lithuanian", "lietuvių kalba"),
LU("lu", "Luba-Katanga", "Tshiluba"),
LV("lv", "Latvian", "latviešu valoda"),
MG("mg", "Malagasy", "fiteny malagasy"),
MH("mh", "Marshallese", "Kajin M̧ajeļ"),
MI("mi", "Māori", "te reo Māori"),
MK("mk", "Macedonian", "македонски јазик"),
ML("ml", "Malayalam", "മലയാളം"),
MN("mn", "Mongolian", "Монгол хэл"),
MR("mr", "Marathi", "मराठी"),
MS("ms", "Malay", "Bahasa Melayu"),
MS_ARAB("ms-Arab", "Jawi Malay", "بهاس ملايو"),
MT("mt", "Maltese", "Malti"),
MY("my", "Burmese", "ဗမာစာ"),
NA("na", "Nauru", "Ekakairũ Naoero"),
NB("nb", "Norwegian Bokmål", "Norsk bokmål"),
ND("nd", "Northern Ndebele", "isiNdebele"),
NE("ne", "Nepali", "नेपाली"),
NG("ng", "Ndonga", "Owambo"),
NL("nl", "Dutch", "Nederlands"),
NN("nn", "Norwegian Nynorsk", "Norsk Nynorsk"),
NO("no", "Norwegian", "Norsk"),
NR("nr", "Southern Ndebele", "isiNdebele"),
NV("nv", "Navajo", "Diné bizaad"),
NY("ny", "Chichewa", "chiCheŵa"),
OC("oc", "Occitan", "occitan"),
OJ("oj", "Ojibwe", "ᐊᓂᔑᓈᐯᒧᐎᓐ"),
OM("om", "Oromo", "Afaan Oromoo"),
OR("or", "Oriya", "ଓଡ଼ିଆ"),
OS("os", "Ossetian", "ирон æвзаг"),
PA("pa", "Punjabi", "ਪੰਜਾਬੀ"),
PI("pi", "Pāli", "पाऴि"),
PL("pl", "Polish", "Polski"),
PS("ps", "Pashto", "پښتو"),
PT("pt", "Portuguese", "Português"),
QU("qu", "Quechua", "Runa Simi"),
RM("rm", "Romansh", "rumantsch grischun"),
RN("rn", "Kirundi", "Ikirundi"),
RO("ro", "Romanian", "Română"),
RU("ru", "Russian", "Русский"),
RW("rw", "Kinyarwanda", "Ikinyarwanda"),
SA("sa", "Sanskrit", "संस्कृतम्"),
SC("sc", "Sardinian", "sardu"),
SD("sd", "Sindhi", "सिन्धी"),
SE("se", "Northern Sami", "Davvisámegiella"),
SG("sg", "Sango", "yângâ tî sängö"),
SI("si", "Sinhala", "සිංහල"),
SK("sk", "Slovak", "slovenčina"),
SL("sl", "Slovenian", "slovenščina"),
SN("sn", "Shona", "chiShona"),
SO("so", "Somali", "Soomaaliga"),
SQ("sq", "Albanian", "Shqip"),
SR("sr", "Serbian", "српски језик"),
SS("ss", "Swati", "SiSwati"),
ST("st", "Southern Sotho", "Sesotho"),
SU("su", "Sundanese", "Basa Sunda"),
SV("sv", "Swedish", "Svenska"),
SW("sw", "Swahili", "Kiswahili"),
TA("ta", "Tamil", "தமிழ்"),
TE("te", "Telugu", "తెలుగు"),
TG("tg", "Tajik", "тоҷикӣ"),
TH("th", "Thai", "ไทย"),
TI("ti", "Tigrinya", "ትግርኛ"),
TK("tk", "Turkmen", "Türkmen"),
TL("tl", "Tagalog", "Tagalog"),
TN("tn", "Tswana", "Setswana"),
TO("to", "Tonga", "faka Tonga"),
TR("tr", "Turkish", "Türkçe"),
TS("ts", "Tsonga", "Xitsonga"),
TT("tt", "Tatar", "татар теле"),
TW("tw", "Twi", "Twi"),
TY("ty", "Tahitian", "Reo Tahiti"),
UG("ug", "Uyghur", "ئۇيغۇرچە‎"),
UK("uk", "Ukrainian", "Українська"),
UR("ur", "Urdu", "اردو"),
UZ("uz", "Uzbek", "Ўзбек"),
VE("ve", "Venda", "Tshivenḓa"),
VI("vi", "Vietnamese", "Tiếng Việt"),
VO("vo", "Volapük", "Volapük"),
WA("wa", "Walloon", "walon"),
WO("wo", "Wolof", "Wollof"),
XH("xh", "Xhosa", "isiXhosa"),
YI("yi", "Yiddish", "ייִדיש"),
YO("yo", "Yoruba", "Yorùbá"),
ZA("za", "Zhuang", "Saɯ cueŋƅ"),
ZH("zh", "Chinese", "中文"),
ZU("zu", "Zulu", "isiZulu"),
AST("ast", "Asturian", "Asturianu"),
CHR("chr", "Cherokee", "ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ"),
CKB("ckb", "Sorani (Kurdish)", "سۆرانی"),
CNR("cnr", "Montenegrin", "crnogorski"),
CSB("csb", "Kashubian", "Kaszëbsczi"),
GSW("gsw", "Swiss German", "Schwiizertütsch"),
JBO("jbo", "Lojban", "la .lojban."),
KAB("kab", "Kabyle", "Taqbaylit"),
LDN("ldn", "Láadan", "Láadan"),
LFN("lfn", "Lingua Franca Nova", "lingua franca nova"),
MOH("moh", "Mohawk", "Kanienʼkéha"),
NDS("nds", "Low German", "Plattdüütsch"),
PDC("pdc", "Pennsylvania Dutch", "Pennsilfaani-Deitsch"),
SCO("sco", "Scots", "Scots"),
SMA("sma", "Southern Sami", "Åarjelsaemien Gïele"),
SMJ("smj", "Lule Sami", "Julevsámegiella"),
SZL("szl", "Silesian", "ślůnsko godka"),
TOK("tok", "Toki Pona", "toki pona"),
VAI("vai", "Vai", "ꕙꔤ"),
XAL("xal", "Kalmyk", "Хальмг келн"),
ZBA("zba", "Balaibalan", "باليبلن"),
ZGH("zgh", "Standard Moroccan Tamazight", "ⵜⴰⵎⴰⵣⵉⵖⵜ"),
ZH_CN("zh-CN", "Chinese (China)", "简体中文"),
ZH_HK("zh-HK", "Chinese (Hong Kong)", "繁體中文(香港)"),
ZH_TW("zh-TW", "Chinese (Taiwan)", "繁體中文(臺灣)"),
ZH_YUE("zh-YUE", "Cantonese", "廣東話");

private final String locale;
private final String englishName;
private final String nativeName;

SupportedLocales(String locale, String englishName, String nativeName) {
this.locale = locale;
this.englishName = englishName;
this.nativeName = nativeName;
}

public String getLocale() {
return locale;
}

public String getEnglishName() {
return englishName;
}

public String getNativeName() {
return nativeName;
}

@Override
public String toString() {
return nativeName + " (" + englishName + ")";
}

public static Map<String, String> getLanguages() {
Map<String, String> languages = new TreeMap<>();

for (SupportedLocales locale : SupportedLocales.values()) {
languages.put(locale.name(), locale.toString());
}

return languages;
}
}
24 changes: 24 additions & 0 deletions src/main/resources/templates/forms/group.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,30 @@
<label class="form-label">Description for the Group</label>
</div>
</div>
<div class="accordion mb-3" id="advanced-options-accordion">
<div class="accordion-item">
<h2 class="accordion-header" id="heading-advanced-options">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-advanced-options" aria-expanded="false" aria-controls="collapse-advanced-options">
Advanced Options
</button>
</h2>
<div id="collapse-advanced-options" class="accordion-collapse collapse" aria-labelledby="heading-advanced-options" data-bs-parent="#advanced-options-accordion">
<div class="accordion-body">
<div class="col-md-6 mb-3">
<label class="form-label fw-bold" for="language">Language</label>
<div class="form-floating">
<select th:field="*{language}" class="form-select">
<th:block th:each="lang : ${languages}">
<option th:value="${lang.key}" th:text="${lang.value}"></option>
</th:block>
</select>
<label class="form-label">Language of the posts</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="accordion-footer d-flex flex-row-reverse">
<button th:text="*{uuid} ? 'Update' : 'Create'" class="btn btn-outline-primary"></button>
Expand Down