feat: added localization for templates by language

This commit is contained in:
2026-06-21 21:11:56 +03:00
parent 24927ba7ef
commit 9d9b90deb1
4 changed files with 38 additions and 9 deletions
@@ -69,12 +69,14 @@ fun FillTemplatePage(template: Template, innerPadding: PaddingValues) {
val activityContext = LocalActivity.current val activityContext = LocalActivity.current
val context = LocalContext.current val context = LocalContext.current
val language = getLanguage(context)
var filledFields by rememberSaveable { mutableStateOf(template.fields.associate { field -> var filledFields by rememberSaveable { mutableStateOf(template.fields.associate { field ->
field.id to (field.default ?: "") field.id to (field.default ?: "")
}) } }) }
Page( Page(
template.name, selectTemplateNameViaLanguage(template.names, language),
innerPadding innerPadding
) { ) {
val fieldModifier = Modifier.fillMaxWidth() val fieldModifier = Modifier.fillMaxWidth()
@@ -88,7 +90,7 @@ fun FillTemplatePage(template: Template, innerPadding: PaddingValues) {
} }
}, },
modifier = fieldModifier, modifier = fieldModifier,
label = { Text((if (field.maybeEmpty) "" else "*") + field.name) } label = { Text((if (field.maybeEmpty) "" else "*") + selectTemplateNameViaLanguage(field.names, language)) }
) )
} }
@@ -64,6 +64,8 @@ fun SelectTemplatePage(innerPadding: PaddingValues) {
val activityContext = LocalActivity.current val activityContext = LocalActivity.current
val context = LocalContext.current val context = LocalContext.current
val language = getLanguage(context)
var templates by remember { mutableStateOf<List<Template>?>(null) } var templates by remember { mutableStateOf<List<Template>?>(null) }
var loadingError by remember { mutableStateOf<String?>(null) } var loadingError by remember { mutableStateOf<String?>(null) }
@@ -134,7 +136,7 @@ fun SelectTemplatePage(innerPadding: PaddingValues) {
fillTemplateLauncher.launch(intent) fillTemplateLauncher.launch(intent)
} }
) { ) {
Text(template.name) Text(selectTemplateNameViaLanguage(template.names, language))
} }
} }
} }
@@ -4,17 +4,29 @@ import kotlinx.serialization.Serializable
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
private fun jsonObjectToMap(obj: JSONObject): LinkedHashMap<String, String> {
val map = LinkedHashMap<String, String>()
val keys = obj.keys()
while (keys.hasNext()) {
val key = keys.next()
map[key] = obj.getString(key)
}
return map
}
@Serializable @Serializable
class Field( class Field(
val id: String, val id: String,
val name: String, val names: LinkedHashMap<String, String>,
val default: String? = null, val default: String? = null,
val maybeEmpty: Boolean = false val maybeEmpty: Boolean = false
) )
@Serializable @Serializable
class Template( class Template(
val name: String, val names: LinkedHashMap<String, String>,
val fields: List<Field>, val fields: List<Field>,
val template: String val template: String
) { ) {
@@ -30,14 +42,14 @@ class Template(
fields.add(Field( fields.add(Field(
id = fieldObj.getString("id"), id = fieldObj.getString("id"),
name = fieldObj.getString("name"), names = jsonObjectToMap(fieldObj.getJSONObject("names")),
default = fieldObj.optString("default"), default = fieldObj.optString("default"),
maybeEmpty = fieldObj.optBoolean("maybeEmpty") maybeEmpty = fieldObj.optBoolean("maybeEmpty")
)) ))
} }
return Template( return Template(
name = obj.getString("name"), names = jsonObjectToMap(obj.getJSONObject("names")),
fields = fields, fields = fields,
template = obj.getString("template") template = obj.getString("template")
) )
@@ -58,14 +70,14 @@ class Template(
fields.add(Field( fields.add(Field(
id = fieldObj.getString("id"), id = fieldObj.getString("id"),
name = fieldObj.getString("name"), names = jsonObjectToMap(fieldObj.getJSONObject("names")),
default = fieldObj.optString("default"), default = fieldObj.optString("default"),
maybeEmpty = fieldObj.optBoolean("maybeEmpty") maybeEmpty = fieldObj.optBoolean("maybeEmpty")
)) ))
} }
templates.add(Template( templates.add(Template(
name = obj.getString("name"), names = jsonObjectToMap(obj.getJSONObject("names")),
fields = fields, fields = fields,
template = obj.getString("template") template = obj.getString("template")
)) ))
@@ -2,6 +2,7 @@ package ru.omni_devel.cards
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.os.LocaleList
import com.google.android.gms.wearable.Wearable import com.google.android.gms.wearable.Wearable
import com.google.zxing.BarcodeFormat import com.google.zxing.BarcodeFormat
import com.google.zxing.MultiFormatWriter import com.google.zxing.MultiFormatWriter
@@ -66,3 +67,15 @@ fun checkCardData(name: String, value: String): Int? {
return null return null
} }
fun getLanguage(context: Context): String {
val locales: LocaleList = context.resources.configuration.locales
val primaryLocale = locales[0]
val languageCode = primaryLocale.language
return languageCode
}
fun selectTemplateNameViaLanguage(names: LinkedHashMap<String, String>, language: String): String {
return names[language] ?: names.values.firstOrNull() ?: "???"
}