labels changed for language

This commit is contained in:
Hadrian Burkhardt
2026-07-09 19:26:01 +02:00
parent 34240a2163
commit f3cea24130
18 changed files with 347 additions and 30 deletions
@@ -2,7 +2,9 @@ package de.softwareapp_hb.privateqrscanner
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.LocalActivityResultRegistryOwner
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultRegistryOwner
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -23,13 +25,16 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val container = (application as CleanScannerApp).appContainer val container = (application as CleanScannerApp).appContainer
setContent { setContent {
PrivateQrLocalizedContent(container) PrivateQrLocalizedContent(container, activityResultRegistryOwner = this)
} }
} }
} }
@Composable @Composable
private fun PrivateQrLocalizedContent(container: AppContainer) { private fun PrivateQrLocalizedContent(
container: AppContainer,
activityResultRegistryOwner: ActivityResultRegistryOwner
) {
val baseContext = LocalContext.current val baseContext = LocalContext.current
val localeOptions = remember(baseContext.applicationContext) { val localeOptions = remember(baseContext.applicationContext) {
AppLocaleCatalog.load(baseContext.applicationContext) AppLocaleCatalog.load(baseContext.applicationContext)
@@ -48,6 +53,7 @@ private fun PrivateQrLocalizedContent(container: AppContainer) {
} }
CompositionLocalProvider( CompositionLocalProvider(
LocalActivityResultRegistryOwner provides activityResultRegistryOwner,
LocalContext provides localizedContext, LocalContext provides localizedContext,
LocalConfiguration provides localizedContext.resources.configuration LocalConfiguration provides localizedContext.resources.configuration
) { ) {
@@ -1,5 +1,6 @@
package de.softwareapp_hb.privateqrscanner.ui.screens package de.softwareapp_hb.privateqrscanner.ui.screens
import android.content.Context
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -107,7 +108,7 @@ fun HistoryScreen(
val detailIsBase64 = detail.isBase64Encoded() val detailIsBase64 = detail.isBase64Encoded()
AlertDialog( AlertDialog(
onDismissRequest = { selectedItem.value = null }, onDismissRequest = { selectedItem.value = null },
title = { Text(text = detail.type) }, title = { Text(text = detail.localizedDisplayType(context)) },
text = { text = {
if (detailIsBase64) { if (detailIsBase64) {
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
@@ -239,7 +240,7 @@ fun HistoryScreen(
text = stringResource(R.string.share_txt), text = stringResource(R.string.share_txt),
enabled = history.isNotEmpty(), enabled = history.isNotEmpty(),
onClick = { onClick = {
val exportText = HistoryExportFormatter.formatText(history) val exportText = HistoryExportFormatter.formatText(localizedHistory(context, history))
Intents.shareContent(context, exportText, "text/plain") Intents.shareContent(context, exportText, "text/plain")
} }
) )
@@ -247,7 +248,7 @@ fun HistoryScreen(
text = stringResource(R.string.share_csv), text = stringResource(R.string.share_csv),
enabled = history.isNotEmpty(), enabled = history.isNotEmpty(),
onClick = { onClick = {
val exportCsv = HistoryExportFormatter.formatCsv(history) val exportCsv = HistoryExportFormatter.formatCsv(localizedHistory(context, history))
Intents.shareContent(context, exportCsv, "text/csv") Intents.shareContent(context, exportCsv, "text/csv")
} }
) )
@@ -255,7 +256,7 @@ fun HistoryScreen(
text = stringResource(R.string.share_json), text = stringResource(R.string.share_json),
enabled = history.isNotEmpty(), enabled = history.isNotEmpty(),
onClick = { onClick = {
val exportJson = HistoryExportFormatter.formatJson(history) val exportJson = HistoryExportFormatter.formatJson(localizedHistory(context, history))
Intents.shareContent(context, exportJson, "application/json") Intents.shareContent(context, exportJson, "application/json")
} }
) )
@@ -399,21 +400,33 @@ private fun LocalControlsCard(
text = stringResource(R.string.share_txt), text = stringResource(R.string.share_txt),
enabled = history.isNotEmpty(), enabled = history.isNotEmpty(),
onClick = { onClick = {
Intents.shareContent(context, HistoryExportFormatter.formatText(history), "text/plain") Intents.shareContent(
context,
HistoryExportFormatter.formatText(localizedHistory(context, history)),
"text/plain"
)
} }
) )
ExportButton( ExportButton(
text = stringResource(R.string.share_csv), text = stringResource(R.string.share_csv),
enabled = history.isNotEmpty(), enabled = history.isNotEmpty(),
onClick = { onClick = {
Intents.shareContent(context, HistoryExportFormatter.formatCsv(history), "text/csv") Intents.shareContent(
context,
HistoryExportFormatter.formatCsv(localizedHistory(context, history)),
"text/csv"
)
} }
) )
ExportButton( ExportButton(
text = stringResource(R.string.share_json), text = stringResource(R.string.share_json),
enabled = history.isNotEmpty(), enabled = history.isNotEmpty(),
onClick = { onClick = {
Intents.shareContent(context, HistoryExportFormatter.formatJson(history), "application/json") Intents.shareContent(
context,
HistoryExportFormatter.formatJson(localizedHistory(context, history)),
"application/json"
)
} }
) )
} }
@@ -588,6 +601,7 @@ private fun HistoryRow(
onDelete: (Long) -> Unit, onDelete: (Long) -> Unit,
onOpenDetails: () -> Unit onOpenDetails: () -> Unit
) { ) {
val context = LocalContext.current
val dismissState = rememberSwipeToDismissBoxState( val dismissState = rememberSwipeToDismissBoxState(
confirmValueChange = { confirmValueChange = {
if (it == SwipeToDismissBoxValue.EndToStart || it == SwipeToDismissBoxValue.StartToEnd) { if (it == SwipeToDismissBoxValue.EndToStart || it == SwipeToDismissBoxValue.StartToEnd) {
@@ -638,7 +652,7 @@ private fun HistoryRow(
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
Text( Text(
text = item.type, text = item.localizedDisplayType(context),
color = PrivateQrColors.TextPrimary, color = PrivateQrColors.TextPrimary,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.ExtraBold fontWeight = FontWeight.ExtraBold
@@ -678,6 +692,12 @@ private fun iconForType(type: String): ImageVector {
} }
} }
private fun localizedHistory(context: Context, history: List<ScanRecord>): List<ScanRecord> {
return history.map { item ->
item.copy(type = item.localizedDisplayType(context))
}
}
private fun ScanRecord.isBase64Encoded(): Boolean { private fun ScanRecord.isBase64Encoded(): Boolean {
return type.contains("base64", ignoreCase = true) return type.contains("base64", ignoreCase = true)
} }
@@ -0,0 +1,95 @@
package de.softwareapp_hb.privateqrscanner.ui.screens
import android.content.Context
import androidx.annotation.StringRes
import de.softwareapp_hb.privateqrscanner.R
import de.softwareapp_hb.privateqrscanner.domain.ScanRecord
import de.softwareapp_hb.privateqrscanner.domain.ScanResult
private const val DUPLICATE_TICKET_PREFIX = "Duplicate ticket ("
private const val UNREGISTERED_TICKET_PREFIX = "Unregistered ticket ("
private val base64SuffixRegex = Regex("""\s*\(Base64\)\s*$""", RegexOption.IGNORE_CASE)
internal fun ScanResult.localizedDisplayType(context: Context): String {
return localizedScanType(
context = context,
type = type,
isBase64Encoded = isBase64Encoded
)
}
internal fun ScanRecord.localizedDisplayType(context: Context): String {
return localizedStoredScanType(context, type)
}
private fun localizedStoredScanType(context: Context, rawType: String): String {
val trimmed = rawType.trim()
extractWrappedType(trimmed, DUPLICATE_TICKET_PREFIX)?.let { innerType ->
return context.getString(
R.string.scan_type_duplicate_ticket,
localizedStoredScanType(context, innerType)
)
}
extractWrappedType(trimmed, UNREGISTERED_TICKET_PREFIX)?.let { innerType ->
return context.getString(
R.string.scan_type_unregistered_ticket,
localizedStoredScanType(context, innerType)
)
}
if (base64SuffixRegex.containsMatchIn(trimmed)) {
val innerType = base64SuffixRegex.replace(trimmed, "").trim()
return context.getString(
R.string.scan_type_base64_suffix,
localizedCanonicalScanType(context, innerType)
)
}
return localizedCanonicalScanType(context, trimmed)
}
private fun localizedScanType(
context: Context,
type: String,
isBase64Encoded: Boolean
): String {
val baseType = localizedCanonicalScanType(context, type)
return if (isBase64Encoded && !type.contains("base64", ignoreCase = true)) {
context.getString(R.string.scan_type_base64_suffix, baseType)
} else {
baseType
}
}
private fun localizedCanonicalScanType(context: Context, type: String): String {
val stringRes = scanTypeStringRes(type)
return if (stringRes != null) {
context.getString(stringRes)
} else {
type.ifBlank { context.getString(R.string.scan_type_unknown) }
}
}
private fun extractWrappedType(type: String, prefix: String): String? {
return if (type.startsWith(prefix, ignoreCase = true) && type.endsWith(")")) {
type.substring(prefix.length, type.length - 1)
} else {
null
}
}
@StringRes
private fun scanTypeStringRes(type: String): Int? = when (type.trim().lowercase()) {
"contact" -> R.string.scan_type_contact
"url" -> R.string.scan_type_url
"wifi", "wi-fi" -> R.string.scan_type_wifi
"phone" -> R.string.scan_type_phone
"sms" -> R.string.scan_type_sms
"email", "e-mail" -> R.string.scan_type_email
"calendar" -> R.string.scan_type_calendar
"isbn" -> R.string.scan_type_isbn
"product" -> R.string.scan_type_product
"text" -> R.string.scan_type_text
"geo" -> R.string.scan_type_geo
"driver license", "driver licence" -> R.string.scan_type_driver_license
"unknown" -> R.string.scan_type_unknown
else -> null
}
@@ -394,7 +394,7 @@ internal fun GalleryScanPreviewDialog(
} }
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text( Text(
text = candidate.result.displayType, text = candidate.result.localizedDisplayType(context),
color = PrivateQrColors.TextPrimary, color = PrivateQrColors.TextPrimary,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.ExtraBold fontWeight = FontWeight.ExtraBold
@@ -1,5 +1,6 @@
package de.softwareapp_hb.privateqrscanner.ui.screens package de.softwareapp_hb.privateqrscanner.ui.screens
import android.content.Context
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -115,7 +116,7 @@ internal fun BatchResultsPanel(
) )
if (allowShare) { if (allowShare) {
TextButton( TextButton(
onClick = { Intents.shareText(context, buildBatchExport(results)) }, onClick = { Intents.shareText(context, buildBatchExport(context, results)) },
enabled = results.isNotEmpty(), enabled = results.isNotEmpty(),
colors = ButtonDefaults.textButtonColors( colors = ButtonDefaults.textButtonColors(
containerColor = PrivateQrColors.Mint, containerColor = PrivateQrColors.Mint,
@@ -143,7 +144,7 @@ internal fun BatchResultsPanel(
) { ) {
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text( Text(
text = "${item.result.displayType}: $contentText", text = "${item.result.localizedDisplayType(context)}: $contentText",
color = Color.White.copy(alpha = 0.92f), color = Color.White.copy(alpha = 0.92f),
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
@@ -218,12 +219,12 @@ internal fun BatchResultsPanel(
} }
} }
private fun buildBatchExport(results: List<BatchScanRecord>): String { private fun buildBatchExport(context: Context, results: List<BatchScanRecord>): String {
if (results.isEmpty()) return "" if (results.isEmpty()) return ""
val formatter = DateFormat.getDateTimeInstance() val formatter = DateFormat.getDateTimeInstance()
return results.joinToString(separator = "\n\n") { item -> return results.joinToString(separator = "\n\n") { item ->
val encoding = if (item.result.isBase64Encoded) "\nEncoding: Base64" else "" val encoding = if (item.result.isBase64Encoded) "\nEncoding: Base64" else ""
"${formatter.format(Date(item.timestamp))}\n${item.result.displayType}$encoding\n${item.result.content}" "${formatter.format(Date(item.timestamp))}\n${item.result.localizedDisplayType(context)}$encoding\n${item.result.content}"
} }
} }
@@ -22,6 +22,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@@ -46,6 +47,7 @@ internal fun ResultVisualCard(
onOpenUrl: ((String) -> Unit)? = null, onOpenUrl: ((String) -> Unit)? = null,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val context = LocalContext.current
val contact = remember(result) { val contact = remember(result) {
if (result.isBase64Encoded) null else ScanContentParsers.parseContact(result.content) if (result.isBase64Encoded) null else ScanContentParsers.parseContact(result.content)
} }
@@ -79,7 +81,7 @@ internal fun ResultVisualCard(
tint = PrivateQrColors.Teal700 tint = PrivateQrColors.Teal700
) )
Text( Text(
text = "Wi-Fi", text = result.localizedDisplayType(context),
style = MaterialTheme.typography.headlineSmall style = MaterialTheme.typography.headlineSmall
) )
} }
@@ -90,7 +92,7 @@ internal fun ResultVisualCard(
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
Text( Text(
text = result.displayType, text = result.localizedDisplayType(context),
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
color = PrivateQrColors.TextPrimary color = PrivateQrColors.TextPrimary
) )
@@ -215,7 +217,8 @@ private fun ContactVisualCard(
ContactCardTemplate.Playful -> Color(0xFF55657B) ContactCardTemplate.Playful -> Color(0xFF55657B)
ContactCardTemplate.Minimal -> Color(0xFF475569) ContactCardTemplate.Minimal -> Color(0xFF475569)
} }
val name = contact?.fullName ?: "Contact" val fallbackName = stringResource(R.string.scan_type_contact)
val name = contact?.fullName ?: fallbackName
val subtitle = listOfNotNull(contact?.title, contact?.organization).distinct().joinToString("") val subtitle = listOfNotNull(contact?.title, contact?.organization).distinct().joinToString("")
val initials = remember(name) { initialsFromName(name) } val initials = remember(name) { initialsFromName(name) }
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">تم رصد رمز. ثبّت الجهاز أو اقترب.</string> <string name="live_potential_detected">تم رصد رمز. ثبّت الجهاز أو اقترب.</string>
<string name="live_readable_detected">تم اكتشاف رمز قابل للقراءة.</string> <string name="live_readable_detected">تم اكتشاف رمز قابل للقراءة.</string>
<string name="share_history">مشاركة السجل</string> <string name="share_history">مشاركة السجل</string>
<string name="share_txt">TXT</string> <string name="share_txt">نص</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">جهة اتصال</string>
<string name="scan_type_url">رابط</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">هاتف</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">بريد إلكتروني</string>
<string name="scan_type_calendar">تقويم</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">منتج</string>
<string name="scan_type_text">نص</string>
<string name="scan_type_geo">موقع</string>
<string name="scan_type_driver_license">رخصة قيادة</string>
<string name="scan_type_unknown">غير معروف</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">تذكرة مكررة (%1$s)</string>
<string name="scan_type_unregistered_ticket">تذكرة غير مسجلة (%1$s)</string>
<string name="history_header_subtitle">يبقى السجل الاختياري على جهازك</string> <string name="history_header_subtitle">يبقى السجل الاختياري على جهازك</string>
<string name="history_hero_title">راجع عمليات المسح السابقة محليًا</string> <string name="history_hero_title">راجع عمليات المسح السابقة محليًا</string>
<string name="history_hero_subtitle">ابحث أو صدّر أو احذف عمليات المسح المحفوظة متى شئت.</string> <string name="history_hero_subtitle">ابحث أو صدّر أو احذف عمليات المسح المحفوظة متى شئت.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Código encontrado. Mantenha firme ou aproxime-se.</string> <string name="live_potential_detected">Código encontrado. Mantenha firme ou aproxime-se.</string>
<string name="live_readable_detected">Código legível detectado.</string> <string name="live_readable_detected">Código legível detectado.</string>
<string name="share_history">Compartilhar histórico</string> <string name="share_history">Compartilhar histórico</string>
<string name="share_txt">TXT</string> <string name="share_txt">Texto</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Contato</string>
<string name="scan_type_url">Link</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">Telefone</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">E-mail</string>
<string name="scan_type_calendar">Calendário</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Produto</string>
<string name="scan_type_text">Texto</string>
<string name="scan_type_geo">Localização</string>
<string name="scan_type_driver_license">Carteira de motorista</string>
<string name="scan_type_unknown">Desconhecido</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Ingresso duplicado (%1$s)</string>
<string name="scan_type_unregistered_ticket">Ingresso não registrado (%1$s)</string>
<string name="history_header_subtitle">O histórico opcional fica no seu dispositivo</string> <string name="history_header_subtitle">O histórico opcional fica no seu dispositivo</string>
<string name="history_hero_title">Revise leituras anteriores localmente</string> <string name="history_hero_title">Revise leituras anteriores localmente</string>
<string name="history_hero_subtitle">Pesquise, exporte ou exclua leituras salvas quando quiser.</string> <string name="history_hero_subtitle">Pesquise, exporte ou exclua leituras salvas quando quiser.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Código detetado. Mantenha estável ou aproxime-se.</string> <string name="live_potential_detected">Código detetado. Mantenha estável ou aproxime-se.</string>
<string name="live_readable_detected">Código legível detetado.</string> <string name="live_readable_detected">Código legível detetado.</string>
<string name="share_history">Partilhar histórico</string> <string name="share_history">Partilhar histórico</string>
<string name="share_txt">TXT</string> <string name="share_txt">Texto</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Contacto</string>
<string name="scan_type_url">Ligação</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">Telefone</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">E-mail</string>
<string name="scan_type_calendar">Calendário</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Produto</string>
<string name="scan_type_text">Texto</string>
<string name="scan_type_geo">Localização</string>
<string name="scan_type_driver_license">Carta de condução</string>
<string name="scan_type_unknown">Desconhecido</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Bilhete duplicado (%1$s)</string>
<string name="scan_type_unregistered_ticket">Bilhete não registado (%1$s)</string>
<string name="history_header_subtitle">O histórico opcional fica no seu dispositivo</string> <string name="history_header_subtitle">O histórico opcional fica no seu dispositivo</string>
<string name="history_hero_title">Reveja digitalizações anteriores localmente</string> <string name="history_hero_title">Reveja digitalizações anteriores localmente</string>
<string name="history_hero_subtitle">Pesquise, exporte ou elimine digitalizações guardadas quando quiser.</string> <string name="history_hero_subtitle">Pesquise, exporte ou elimine digitalizações guardadas quando quiser.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">发现代码。请保持稳定或靠近一些。</string> <string name="live_potential_detected">发现代码。请保持稳定或靠近一些。</string>
<string name="live_readable_detected">检测到可读取的代码。</string> <string name="live_readable_detected">检测到可读取的代码。</string>
<string name="share_history">分享历史记录</string> <string name="share_history">分享历史记录</string>
<string name="share_txt">TXT</string> <string name="share_txt">文本</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">联系人</string>
<string name="scan_type_url">链接</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">电话</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">电子邮件</string>
<string name="scan_type_calendar">日历</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">产品</string>
<string name="scan_type_text">文本</string>
<string name="scan_type_geo">位置</string>
<string name="scan_type_driver_license">驾驶证</string>
<string name="scan_type_unknown">未知</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">重复票券(%1$s</string>
<string name="scan_type_unregistered_ticket">未注册票券(%1$s</string>
<string name="history_header_subtitle">可选历史记录保留在你的设备上</string> <string name="history_header_subtitle">可选历史记录保留在你的设备上</string>
<string name="history_hero_title">在本地查看过去的扫描</string> <string name="history_hero_title">在本地查看过去的扫描</string>
<string name="history_hero_subtitle">随时搜索、导出或删除已保存的扫描。</string> <string name="history_hero_subtitle">随时搜索、导出或删除已保存的扫描。</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">發現代碼。請保持穩定或靠近一些。</string> <string name="live_potential_detected">發現代碼。請保持穩定或靠近一些。</string>
<string name="live_readable_detected">偵測到可讀取的代碼。</string> <string name="live_readable_detected">偵測到可讀取的代碼。</string>
<string name="share_history">分享記錄</string> <string name="share_history">分享記錄</string>
<string name="share_txt">TXT</string> <string name="share_txt">文字</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">聯絡人</string>
<string name="scan_type_url">連結</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">電話</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">電子郵件</string>
<string name="scan_type_calendar">日曆</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">產品</string>
<string name="scan_type_text">文字</string>
<string name="scan_type_geo">位置</string>
<string name="scan_type_driver_license">駕駛執照</string>
<string name="scan_type_unknown">未知</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">重複票券(%1$s</string>
<string name="scan_type_unregistered_ticket">未註冊票券(%1$s</string>
<string name="history_header_subtitle">可選記錄會保留在你的裝置上</string> <string name="history_header_subtitle">可選記錄會保留在你的裝置上</string>
<string name="history_hero_title">在本機查看過去的掃描</string> <string name="history_hero_title">在本機查看過去的掃描</string>
<string name="history_hero_subtitle">隨時搜尋、匯出或刪除已儲存的掃描。</string> <string name="history_hero_subtitle">隨時搜尋、匯出或刪除已儲存的掃描。</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Code erkannt. Ruhig halten oder näher rangehen.</string> <string name="live_potential_detected">Code erkannt. Ruhig halten oder näher rangehen.</string>
<string name="live_readable_detected">Lesbarer Code erkannt.</string> <string name="live_readable_detected">Lesbarer Code erkannt.</string>
<string name="share_history">Historie teilen</string> <string name="share_history">Historie teilen</string>
<string name="share_txt">TXT</string> <string name="share_txt">Text</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Kontakt</string>
<string name="scan_type_url">Link</string>
<string name="scan_type_wifi">WLAN</string>
<string name="scan_type_phone">Telefon</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">E-Mail</string>
<string name="scan_type_calendar">Kalender</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Produkt</string>
<string name="scan_type_text">Text</string>
<string name="scan_type_geo">Standort</string>
<string name="scan_type_driver_license">Führerschein</string>
<string name="scan_type_unknown">Unbekannt</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Doppeltes Ticket (%1$s)</string>
<string name="scan_type_unregistered_ticket">Nicht registriertes Ticket (%1$s)</string>
<string name="history_header_subtitle">Optionale Historie bleibt auf deinem Gerät</string> <string name="history_header_subtitle">Optionale Historie bleibt auf deinem Gerät</string>
<string name="history_hero_title">Vergangene Scans lokal prüfen</string> <string name="history_hero_title">Vergangene Scans lokal prüfen</string>
<string name="history_hero_subtitle">Gespeicherte Scans jederzeit suchen, exportieren oder löschen.</string> <string name="history_hero_subtitle">Gespeicherte Scans jederzeit suchen, exportieren oder löschen.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Código detectado. Mantén el dispositivo estable o acércate.</string> <string name="live_potential_detected">Código detectado. Mantén el dispositivo estable o acércate.</string>
<string name="live_readable_detected">Código legible detectado.</string> <string name="live_readable_detected">Código legible detectado.</string>
<string name="share_history">Compartir historial</string> <string name="share_history">Compartir historial</string>
<string name="share_txt">TXT</string> <string name="share_txt">Texto</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Contacto</string>
<string name="scan_type_url">Enlace</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">Teléfono</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">Correo electrónico</string>
<string name="scan_type_calendar">Calendario</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Producto</string>
<string name="scan_type_text">Texto</string>
<string name="scan_type_geo">Ubicación</string>
<string name="scan_type_driver_license">Permiso de conducir</string>
<string name="scan_type_unknown">Desconocido</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Ticket duplicado (%1$s)</string>
<string name="scan_type_unregistered_ticket">Ticket no registrado (%1$s)</string>
<string name="history_header_subtitle">El historial opcional permanece en tu dispositivo</string> <string name="history_header_subtitle">El historial opcional permanece en tu dispositivo</string>
<string name="history_hero_title">Revisa escaneos anteriores localmente</string> <string name="history_hero_title">Revisa escaneos anteriores localmente</string>
<string name="history_hero_subtitle">Busca, exporta o elimina escaneos guardados cuando quieras.</string> <string name="history_hero_subtitle">Busca, exporta o elimina escaneos guardados cuando quieras.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Code repéré. Restez stable ou rapprochez-vous.</string> <string name="live_potential_detected">Code repéré. Restez stable ou rapprochez-vous.</string>
<string name="live_readable_detected">Code lisible détecté.</string> <string name="live_readable_detected">Code lisible détecté.</string>
<string name="share_history">Partager lhistorique</string> <string name="share_history">Partager lhistorique</string>
<string name="share_txt">TXT</string> <string name="share_txt">Texte</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Contact</string>
<string name="scan_type_url">Lien</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">Téléphone</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">E-mail</string>
<string name="scan_type_calendar">Calendrier</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Produit</string>
<string name="scan_type_text">Texte</string>
<string name="scan_type_geo">Emplacement</string>
<string name="scan_type_driver_license">Permis de conduire</string>
<string name="scan_type_unknown">Inconnu</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Ticket en double (%1$s)</string>
<string name="scan_type_unregistered_ticket">Ticket non enregistré (%1$s)</string>
<string name="history_header_subtitle">Lhistorique facultatif reste sur votre appareil</string> <string name="history_header_subtitle">Lhistorique facultatif reste sur votre appareil</string>
<string name="history_hero_title">Consulter les scans passés localement</string> <string name="history_hero_title">Consulter les scans passés localement</string>
<string name="history_hero_subtitle">Recherchez, exportez ou supprimez les scans enregistrés quand vous le souhaitez.</string> <string name="history_hero_subtitle">Recherchez, exportez ou supprimez les scans enregistrés quand vous le souhaitez.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Codice individuato. Tieni fermo o avvicinati.</string> <string name="live_potential_detected">Codice individuato. Tieni fermo o avvicinati.</string>
<string name="live_readable_detected">Codice leggibile rilevato.</string> <string name="live_readable_detected">Codice leggibile rilevato.</string>
<string name="share_history">Condividi cronologia</string> <string name="share_history">Condividi cronologia</string>
<string name="share_txt">TXT</string> <string name="share_txt">Testo</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Contatto</string>
<string name="scan_type_url">Link</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">Telefono</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">Email</string>
<string name="scan_type_calendar">Calendario</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Prodotto</string>
<string name="scan_type_text">Testo</string>
<string name="scan_type_geo">Posizione</string>
<string name="scan_type_driver_license">Patente di guida</string>
<string name="scan_type_unknown">Sconosciuto</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Ticket duplicato (%1$s)</string>
<string name="scan_type_unregistered_ticket">Ticket non registrato (%1$s)</string>
<string name="history_header_subtitle">La cronologia opzionale resta sul tuo dispositivo</string> <string name="history_header_subtitle">La cronologia opzionale resta sul tuo dispositivo</string>
<string name="history_hero_title">Rivedi localmente le scansioni passate</string> <string name="history_hero_title">Rivedi localmente le scansioni passate</string>
<string name="history_hero_subtitle">Cerca, esporta o elimina le scansioni salvate quando vuoi.</string> <string name="history_hero_subtitle">Cerca, esporta o elimina le scansioni salvate quando vuoi.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">コードを検出しました。端末を安定させるか、近づけてください。</string> <string name="live_potential_detected">コードを検出しました。端末を安定させるか、近づけてください。</string>
<string name="live_readable_detected">読み取り可能なコードを検出しました。</string> <string name="live_readable_detected">読み取り可能なコードを検出しました。</string>
<string name="share_history">履歴を共有</string> <string name="share_history">履歴を共有</string>
<string name="share_txt">TXT</string> <string name="share_txt">テキスト</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">連絡先</string>
<string name="scan_type_url">リンク</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">電話</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">メール</string>
<string name="scan_type_calendar">カレンダー</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">製品</string>
<string name="scan_type_text">テキスト</string>
<string name="scan_type_geo">位置情報</string>
<string name="scan_type_driver_license">運転免許証</string>
<string name="scan_type_unknown">不明</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">重複チケット(%1$s</string>
<string name="scan_type_unregistered_ticket">未登録チケット(%1$s</string>
<string name="history_header_subtitle">任意の履歴は端末内に残ります</string> <string name="history_header_subtitle">任意の履歴は端末内に残ります</string>
<string name="history_hero_title">過去のスキャンをローカルで確認</string> <string name="history_hero_title">過去のスキャンをローカルで確認</string>
<string name="history_hero_subtitle">保存したスキャンをいつでも検索、エクスポート、削除できます。</string> <string name="history_hero_subtitle">保存したスキャンをいつでも検索、エクスポート、削除できます。</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">코드를 찾았습니다. 기기를 고정하거나 더 가까이 이동하세요.</string> <string name="live_potential_detected">코드를 찾았습니다. 기기를 고정하거나 더 가까이 이동하세요.</string>
<string name="live_readable_detected">읽을 수 있는 코드가 감지되었습니다.</string> <string name="live_readable_detected">읽을 수 있는 코드가 감지되었습니다.</string>
<string name="share_history">기록 공유</string> <string name="share_history">기록 공유</string>
<string name="share_txt">TXT</string> <string name="share_txt">텍스트</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">연락처</string>
<string name="scan_type_url">링크</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">전화</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">이메일</string>
<string name="scan_type_calendar">캘린더</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">제품</string>
<string name="scan_type_text">텍스트</string>
<string name="scan_type_geo">위치</string>
<string name="scan_type_driver_license">운전면허증</string>
<string name="scan_type_unknown">알 수 없음</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">중복 티켓(%1$s)</string>
<string name="scan_type_unregistered_ticket">등록되지 않은 티켓(%1$s)</string>
<string name="history_header_subtitle">선택적 기록은 기기에 남습니다</string> <string name="history_header_subtitle">선택적 기록은 기기에 남습니다</string>
<string name="history_hero_title">지난 스캔을 로컬에서 확인</string> <string name="history_hero_title">지난 스캔을 로컬에서 확인</string>
<string name="history_hero_subtitle">저장된 스캔을 언제든 검색, 내보내기 또는 삭제할 수 있습니다.</string> <string name="history_hero_subtitle">저장된 스캔을 언제든 검색, 내보내기 또는 삭제할 수 있습니다.</string>
+17 -1
View File
@@ -46,9 +46,25 @@
<string name="live_potential_detected">Code spotted. Hold steady or move closer.</string> <string name="live_potential_detected">Code spotted. Hold steady or move closer.</string>
<string name="live_readable_detected">Readable code detected.</string> <string name="live_readable_detected">Readable code detected.</string>
<string name="share_history">Share history</string> <string name="share_history">Share history</string>
<string name="share_txt">TXT</string> <string name="share_txt">Text</string>
<string name="share_csv">CSV</string> <string name="share_csv">CSV</string>
<string name="share_json">JSON</string> <string name="share_json">JSON</string>
<string name="scan_type_contact">Contact</string>
<string name="scan_type_url">Link</string>
<string name="scan_type_wifi">Wi-Fi</string>
<string name="scan_type_phone">Phone</string>
<string name="scan_type_sms">SMS</string>
<string name="scan_type_email">Email</string>
<string name="scan_type_calendar">Calendar</string>
<string name="scan_type_isbn">ISBN</string>
<string name="scan_type_product">Product</string>
<string name="scan_type_text">Text</string>
<string name="scan_type_geo">Location</string>
<string name="scan_type_driver_license">Driver license</string>
<string name="scan_type_unknown">Unknown</string>
<string name="scan_type_base64_suffix">%1$s (Base64)</string>
<string name="scan_type_duplicate_ticket">Duplicate ticket (%1$s)</string>
<string name="scan_type_unregistered_ticket">Unregistered ticket (%1$s)</string>
<string name="history_header_subtitle">Optional history stays on your device</string> <string name="history_header_subtitle">Optional history stays on your device</string>
<string name="history_hero_title">Review past scans locally</string> <string name="history_hero_title">Review past scans locally</string>
<string name="history_hero_subtitle">Search, export, or delete saved scans whenever you choose.</string> <string name="history_hero_subtitle">Search, export, or delete saved scans whenever you choose.</string>