directory refactor

This commit is contained in:
2026-03-02 13:08:25 +01:00
parent 07b7b3dc1b
commit cc89c77186
35 changed files with 326 additions and 108 deletions

13
.idea/deviceManager.xml generated Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

View File

@ -13,7 +13,11 @@ import android.widget.ProgressBar
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import java.io.File import com.dano.test1.network.DatabaseDownloader
import com.dano.test1.network.LoginManager
import com.dano.test1.network.TokenStore
import com.dano.test1.questionnaire.QuestionnaireBase
import com.dano.test1.ui.HandlerOpeningScreen
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.data
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
@ -7,8 +7,12 @@ import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.provider.MediaStore import android.provider.MediaStore
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import org.apache.poi.ss.usermodel.Row import org.apache.poi.ss.usermodel.Row
import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.io.ByteArrayOutputStream
import java.io.File
/* /*
Aufgabe: Aufgabe:
@ -83,7 +87,7 @@ class ExcelExportService(
} }
} }
val bytes = java.io.ByteArrayOutputStream().use { bos -> val bytes = ByteArrayOutputStream().use { bos ->
wb.write(bos); bos.toByteArray() wb.write(bos); bos.toByteArray()
} }
wb.close() wb.close()
@ -112,7 +116,7 @@ class ExcelExportService(
} else { } else {
val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
if (!downloadsDir.exists()) downloadsDir.mkdirs() if (!downloadsDir.exists()) downloadsDir.mkdirs()
val outFile = java.io.File(downloadsDir, filename) val outFile = File(downloadsDir, filename)
outFile.writeBytes(bytes) outFile.writeBytes(bytes)
MediaScannerConnection.scanFile( MediaScannerConnection.scanFile(
context, context,

View File

@ -1,8 +1,11 @@
package com.dano.test1 package com.dano.test1.data
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import com.dano.test1.LanguageManager
import org.apache.poi.ss.usermodel.CellType
import org.apache.poi.ss.usermodel.DateUtil
import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.json.JSONArray import org.json.JSONArray
import java.nio.charset.Charset import java.nio.charset.Charset
@ -63,16 +66,16 @@ class HeaderOrderRepository(
for (i in first until last) { for (i in first until last) {
val cell = row.getCell(i) ?: continue val cell = row.getCell(i) ?: continue
val value = when (cell.cellType) { val value = when (cell.cellType) {
org.apache.poi.ss.usermodel.CellType.STRING -> cell.stringCellValue CellType.STRING -> cell.stringCellValue
org.apache.poi.ss.usermodel.CellType.NUMERIC -> CellType.NUMERIC ->
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) if (DateUtil.isCellDateFormatted(cell))
cell.dateCellValue.time.toString() cell.dateCellValue.time.toString()
else { else {
val n = cell.numericCellValue val n = cell.numericCellValue
if (n % 1.0 == 0.0) n.toLong().toString() else n.toString() if (n % 1.0 == 0.0) n.toLong().toString() else n.toString()
} }
org.apache.poi.ss.usermodel.CellType.BOOLEAN -> cell.booleanCellValue.toString() CellType.BOOLEAN -> cell.booleanCellValue.toString()
org.apache.poi.ss.usermodel.CellType.FORMULA -> cell.richStringCellValue.string CellType.FORMULA -> cell.richStringCellValue.string
else -> "" else -> ""
}.trim() }.trim()

View File

@ -1,7 +1,8 @@
package com.dano.test1 package com.dano.test1.network
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import com.dano.test1.AES256Helper
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.network
import android.content.Context import android.content.Context
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
@ -8,6 +8,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import android.database.Cursor import android.database.Cursor
import com.dano.test1.AES256Helper
import okhttp3.* import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.asRequestBody

View File

@ -1,9 +1,9 @@
package com.dano.test1 package com.dano.test1.network
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.text.InputType
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.widget.EditText import android.widget.EditText
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Toast import android.widget.Toast
@ -96,13 +96,13 @@ object LoginManager {
} }
val etNew = EditText(context).apply { val etNew = EditText(context).apply {
hint = "Neues Passwort" hint = "Neues Passwort"
inputType = android.text.InputType.TYPE_CLASS_TEXT or inputType = InputType.TYPE_CLASS_TEXT or
android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD InputType.TYPE_TEXT_VARIATION_PASSWORD
} }
val etRepeat = EditText(context).apply { val etRepeat = EditText(context).apply {
hint = "Neues Passwort (wiederholen)" hint = "Neues Passwort (wiederholen)"
inputType = android.text.InputType.TYPE_CLASS_TEXT or inputType = InputType.TYPE_CLASS_TEXT or
android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD InputType.TYPE_TEXT_VARIATION_PASSWORD
} }
container.addView(etNew) container.addView(etNew)
container.addView(etRepeat) container.addView(etRepeat)

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.network
import android.content.Context import android.content.Context
import android.net.ConnectivityManager import android.net.ConnectivityManager

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.network
import android.content.Context import android.content.Context

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire
import android.view.View import android.view.View
interface QuestionHandler { interface QuestionHandler {

View File

@ -1,10 +1,23 @@
package com.dano.test1 package com.dano.test1.questionnaire
import android.R
import android.app.Activity import android.app.Activity
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.MyApp
import com.dano.test1.data.* import com.dano.test1.data.*
import com.dano.test1.questionnaire.handlers.HandlerClientCoachCode
import com.dano.test1.questionnaire.handlers.HandlerClientNotSigned
import com.dano.test1.questionnaire.handlers.HandlerDateSpinner
import com.dano.test1.questionnaire.handlers.HandlerGlassScaleQuestion
import com.dano.test1.questionnaire.handlers.HandlerLastPage
import com.dano.test1.questionnaire.handlers.HandlerMultiCheckboxQuestion
import com.dano.test1.questionnaire.handlers.HandlerRadioQuestion
import com.dano.test1.questionnaire.handlers.HandlerStringSpinner
import com.dano.test1.questionnaire.handlers.HandlerValueSpinner
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.JsonParser import com.google.gson.JsonParser
import kotlinx.coroutines.* import kotlinx.coroutines.*
@ -61,8 +74,8 @@ abstract class QuestionnaireBase<T> {
} }
protected fun setupSpinner(spinner: Spinner, spinnerValues: List<Any>, selectedValue: Any?) { protected fun setupSpinner(spinner: Spinner, spinnerValues: List<Any>, selectedValue: Any?) {
val adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, spinnerValues).apply { val adapter = ArrayAdapter(context, R.layout.simple_spinner_item, spinnerValues).apply {
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) setDropDownViewResource(R.layout.simple_spinner_dropdown_item)
} }
spinner.adapter = adapter spinner.adapter = adapter
selectedValue?.let { value -> selectedValue?.let { value ->
@ -75,7 +88,7 @@ abstract class QuestionnaireBase<T> {
protected fun navigateTo(layoutResId: Int, setup: (View) -> Unit) { protected fun navigateTo(layoutResId: Int, setup: (View) -> Unit) {
context.setContentView(layoutResId) context.setContentView(layoutResId)
val rootView = context.findViewById<View>(android.R.id.content) val rootView = context.findViewById<View>(R.id.content)
setup(rootView) setup(rootView)
} }
@ -85,7 +98,7 @@ abstract class QuestionnaireBase<T> {
protected fun showEmptyScreen() { protected fun showEmptyScreen() {
navigateTo(getLayoutResId("empty")) { navigateTo(getLayoutResId("empty")) {
setupPrevButton(R.id.Qprev) { goToPreviousQuestion() } setupPrevButton(com.dano.test1.R.id.Qprev) { goToPreviousQuestion() }
} }
} }
@ -155,17 +168,89 @@ abstract class QuestionnaireBase<T> {
protected open fun createHandlerForQuestion(question: QuestionItem): QuestionHandler? { protected open fun createHandlerForQuestion(question: QuestionItem): QuestionHandler? {
return when (question) { return when (question) {
is QuestionItem.RadioQuestion -> HandlerRadioQuestion(context, answers, points, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::goToQuestionById, ::showToast, questionnaireMeta.id) is QuestionItem.RadioQuestion -> HandlerRadioQuestion(
is QuestionItem.ClientCoachCodeQuestion -> HandlerClientCoachCode(answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::showToast) context,
is QuestionItem.DateSpinnerQuestion -> HandlerDateSpinner(context, answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::showToast, questionnaireMeta.id) answers,
is QuestionItem.ValueSpinnerQuestion -> HandlerValueSpinner(context, answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::goToQuestionById, ::showToast, questionnaireMeta.id) points,
is QuestionItem.GlassScaleQuestion -> HandlerGlassScaleQuestion(context, answers, points, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::showToast, questionnaireMeta.id) languageID,
is QuestionItem.ClientNotSigned -> HandlerClientNotSigned(answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::showToast) ::goToNextQuestion,
is QuestionItem.StringSpinnerQuestion -> HandlerStringSpinner(context, answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::showToast, questionnaireMeta.id) ::goToPreviousQuestion,
is QuestionItem.MultiCheckboxQuestion -> HandlerMultiCheckboxQuestion(context, answers, points, languageID, ::goToNextQuestion, ::goToPreviousQuestion, ::showToast, questionnaireMeta.id) ::goToQuestionById,
::showToast,
questionnaireMeta.id
)
is QuestionItem.ClientCoachCodeQuestion -> HandlerClientCoachCode(
answers,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::showToast
)
is QuestionItem.DateSpinnerQuestion -> HandlerDateSpinner(
context,
answers,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::showToast,
questionnaireMeta.id
)
is QuestionItem.ValueSpinnerQuestion -> HandlerValueSpinner(
context,
answers,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::goToQuestionById,
::showToast,
questionnaireMeta.id
)
is QuestionItem.GlassScaleQuestion -> HandlerGlassScaleQuestion(
context,
answers,
points,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::showToast,
questionnaireMeta.id
)
is QuestionItem.ClientNotSigned -> HandlerClientNotSigned(
answers,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::showToast
)
is QuestionItem.StringSpinnerQuestion -> HandlerStringSpinner(
context,
answers,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::showToast,
questionnaireMeta.id
)
is QuestionItem.MultiCheckboxQuestion -> HandlerMultiCheckboxQuestion(
context,
answers,
points,
languageID,
::goToNextQuestion,
::goToPreviousQuestion,
::showToast,
questionnaireMeta.id
)
is QuestionItem.LastPage -> HandlerLastPage( is QuestionItem.LastPage -> HandlerLastPage(
answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion answers, languageID, ::goToNextQuestion, ::goToPreviousQuestion
) { CoroutineScope(Dispatchers.IO).launch { saveAnswersToDatabase(answers, questionnaireMeta.id) } } ) {
CoroutineScope(Dispatchers.IO).launch {
saveAnswersToDatabase(
answers,
questionnaireMeta.id
)
}
}
else -> null else -> null
} }
} }

View File

@ -1,6 +1,8 @@
package com.dano.test1 package com.dano.test1.questionnaire
import android.widget.Button import android.widget.Button
import com.dano.test1.LocalizationHelper
import com.dano.test1.R
open class QuestionnaireGeneric(private val questionnaireFileName: String) : QuestionnaireBase<Unit>() { open class QuestionnaireGeneric(private val questionnaireFileName: String) : QuestionnaireBase<Unit>() {

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire
data class Option( data class Option(
val key: String, // Must always be set val key: String, // Must always be set

View File

@ -1,9 +1,16 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import android.util.TypedValue import android.util.TypedValue
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
import com.dano.test1.network.TokenStore
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@ -1,7 +1,11 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import com.dano.test1.LanguageManager
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
/* /*
Zweck: Zweck:

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.content.Context import android.content.Context
import android.view.View import android.view.View
@ -8,8 +8,18 @@ import kotlinx.coroutines.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import android.widget.AbsListView import android.widget.AbsListView
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.questionnaire.MAX_VALUE_YEAR
import com.dano.test1.ui.Month
import com.dano.test1.ui.Months
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
/* /*
Zweck: Zweck:
@ -233,7 +243,7 @@ class HandlerDateSpinner(
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp) tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp)
tv.includeFontPadding = true tv.includeFontPadding = true
tv.setLineSpacing(0f, 1.2f) tv.setLineSpacing(0f, 1.2f)
tv.gravity = (tv.gravity and android.view.Gravity.HORIZONTAL_GRAVITY_MASK) or android.view.Gravity.CENTER_VERTICAL tv.gravity = (tv.gravity and Gravity.HORIZONTAL_GRAVITY_MASK) or Gravity.CENTER_VERTICAL
tv.setPadding(tv.paddingLeft, vPadPx, tv.paddingRight, vPadPx) tv.setPadding(tv.paddingLeft, vPadPx, tv.paddingRight, vPadPx)
tv.minHeight = rowHeight tv.minHeight = rowHeight
tv.isSingleLine = true tv.isSingleLine = true

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.content.Context import android.content.Context
import android.util.TypedValue import android.util.TypedValue
@ -6,6 +6,12 @@ import android.view.Gravity
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
import kotlinx.coroutines.* import kotlinx.coroutines.*
/* /*

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.view.View import android.view.View
import android.widget.* import android.widget.*
@ -7,6 +7,12 @@ import kotlinx.coroutines.*
import android.util.TypedValue import android.util.TypedValue
import android.widget.TextView import android.widget.TextView
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
/* /*

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.content.Context import android.content.Context
import android.view.View import android.view.View
@ -6,6 +6,12 @@ import android.widget.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import android.util.TypedValue import android.util.TypedValue
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
/* /*
Zweck: Zweck:

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.content.Context import android.content.Context
import android.view.View import android.view.View
@ -7,6 +7,12 @@ import android.widget.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import android.util.TypedValue import android.util.TypedValue
import androidx.core.widget.TextViewCompat // <— hinzugefügt import androidx.core.widget.TextViewCompat // <— hinzugefügt
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
/* /*
Zweck: Zweck:

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.content.Context import android.content.Context
import android.view.View import android.view.View
@ -6,8 +6,16 @@ import android.view.ViewGroup
import android.widget.* import android.widget.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity
import android.widget.TextView import android.widget.TextView
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.dano.test1.ui.Countries
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
/* /*
Zweck: Zweck:
@ -146,7 +154,7 @@ class HandlerStringSpinner(
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp) tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp)
tv.includeFontPadding = true tv.includeFontPadding = true
tv.setLineSpacing(0f, 1.2f) tv.setLineSpacing(0f, 1.2f)
tv.gravity = (tv.gravity and android.view.Gravity.HORIZONTAL_GRAVITY_MASK) or android.view.Gravity.CENTER_VERTICAL tv.gravity = (tv.gravity and Gravity.HORIZONTAL_GRAVITY_MASK) or Gravity.CENTER_VERTICAL
tv.setPadding(tv.paddingLeft, vPadPx, tv.paddingRight, vPadPx) tv.setPadding(tv.paddingLeft, vPadPx, tv.paddingRight, vPadPx)
tv.minHeight = rowHeight tv.minHeight = rowHeight
tv.isSingleLine = true tv.isSingleLine = true

View File

@ -1,4 +1,4 @@
package com.dano.test1 package com.dano.test1.questionnaire.handlers
import android.content.Context import android.content.Context
import android.view.View import android.view.View
@ -6,7 +6,14 @@ import android.view.ViewGroup
import android.widget.* import android.widget.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity
import androidx.core.widget.TextViewCompat // <- NEU import androidx.core.widget.TextViewCompat // <- NEU
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.LanguageManager
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.QuestionHandler
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.R
/* /*
Zweck: Zweck:
@ -153,7 +160,7 @@ class HandlerValueSpinner(
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp) tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp)
tv.includeFontPadding = true tv.includeFontPadding = true
tv.setLineSpacing(0f, 1.2f) tv.setLineSpacing(0f, 1.2f)
tv.gravity = (tv.gravity and android.view.Gravity.HORIZONTAL_GRAVITY_MASK) or android.view.Gravity.CENTER_VERTICAL tv.gravity = (tv.gravity and Gravity.HORIZONTAL_GRAVITY_MASK) or Gravity.CENTER_VERTICAL
tv.setPadding(tv.paddingLeft, vPadPx, tv.paddingRight, vPadPx) tv.setPadding(tv.paddingLeft, vPadPx, tv.paddingRight, vPadPx)
tv.minHeight = rowHeight tv.minHeight = rowHeight
tv.isSingleLine = true tv.isSingleLine = true

View File

@ -1,4 +1,6 @@
package com.dano.test1 package com.dano.test1.ui
import com.dano.test1.LanguageManager
object Countries { object Countries {
fun getAllCountries(languageID: String): List<String> { fun getAllCountries(languageID: String): List<String> {

View File

@ -1,9 +1,17 @@
package com.dano.test1 package com.dano.test1.ui
import android.graphics.Color
import android.graphics.Typeface
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import com.dano.test1.data.ExcelExportService
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.MyApp
import com.dano.test1.R
import com.dano.test1.data.Client import com.dano.test1.data.Client
import com.dano.test1.data.HeaderOrderRepository
import com.dano.test1.data.Question import com.dano.test1.data.Question
import com.dano.test1.data.Questionnaire import com.dano.test1.data.Questionnaire
import kotlinx.coroutines.* import kotlinx.coroutines.*
@ -361,7 +369,7 @@ class DatabaseButtonHandler(
val row = TableRow(activity).apply { val row = TableRow(activity).apply {
isClickable = true isClickable = true
isFocusable = true isFocusable = true
setBackgroundColor(android.graphics.Color.TRANSPARENT) setBackgroundColor(Color.TRANSPARENT)
setOnClickListener { onClick() } setOnClickListener { onClick() }
} }
cells.forEachIndexed { index, text -> cells.forEachIndexed { index, text ->
@ -396,7 +404,7 @@ class DatabaseButtonHandler(
this.text = text this.text = text
setPadding(dp(12), dp(10), dp(12), dp(10)) setPadding(dp(12), dp(10), dp(12), dp(10))
textSize = 16f textSize = 16f
setTypeface(typeface, android.graphics.Typeface.BOLD) setTypeface(typeface, Typeface.BOLD)
} }
private fun makeBodyCell( private fun makeBodyCell(

View File

@ -1,10 +1,14 @@
package com.dano.test1 package com.dano.test1.ui
import android.widget.Button import android.widget.Button
import android.widget.EditText import android.widget.EditText
import android.widget.Toast import android.widget.Toast
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.MyApp
import kotlinx.coroutines.* import kotlinx.coroutines.*
import com.dano.test1.data.CompletedQuestionnaire import com.dano.test1.data.CompletedQuestionnaire
import com.dano.test1.questionnaire.GlobalValues
class EditButtonHandler( class EditButtonHandler(
private val activity: MainActivity, private val activity: MainActivity,

View File

@ -1,13 +1,26 @@
package com.dano.test1 package com.dano.test1.ui
import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity import android.view.Gravity
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.R
import com.dano.test1.network.DatabaseUploader
import com.dano.test1.network.LoginManager
import com.dano.test1.network.NetworkUtils
import com.dano.test1.network.TokenStore
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.questionnaire.QuestionItem
import com.dano.test1.questionnaire.QuestionnaireBase
import com.dano.test1.questionnaire.QuestionnaireGeneric
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
@ -682,22 +695,22 @@ class HandlerOpeningScreen(private val activity: MainActivity) {
private fun showRedToast(ctx: android.content.Context, message: String) { private fun showRedToast(ctx: Context, message: String) {
val tv = android.widget.TextView(ctx).apply { val tv = TextView(ctx).apply {
text = message text = message
setTextColor(android.graphics.Color.WHITE) setTextColor(Color.WHITE)
textSize = 16f textSize = 16f
setPadding(32, 20, 32, 20) setPadding(32, 20, 32, 20)
background = android.graphics.drawable.GradientDrawable().apply { background = GradientDrawable().apply {
shape = android.graphics.drawable.GradientDrawable.RECTANGLE shape = GradientDrawable.RECTANGLE
cornerRadius = 24f cornerRadius = 24f
setColor(android.graphics.Color.parseColor("#D32F2F")) // kräftiges Rot setColor(Color.parseColor("#D32F2F")) // kräftiges Rot
} }
} }
android.widget.Toast(ctx).apply { Toast(ctx).apply {
duration = android.widget.Toast.LENGTH_LONG duration = Toast.LENGTH_LONG
view = tv view = tv
setGravity(android.view.Gravity.TOP or android.view.Gravity.CENTER_HORIZONTAL, 0, 120) setGravity(Gravity.TOP or Gravity.CENTER_HORIZONTAL, 0, 120)
}.show() }.show()
} }

View File

@ -1,10 +1,15 @@
package com.dano.test1 package com.dano.test1.ui
import android.widget.Button import android.widget.Button
import android.widget.EditText import android.widget.EditText
import android.widget.Toast import android.widget.Toast
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.MyApp
import kotlinx.coroutines.* import kotlinx.coroutines.*
import com.dano.test1.data.CompletedQuestionnaire import com.dano.test1.data.CompletedQuestionnaire
import com.dano.test1.questionnaire.GlobalValues
import com.dano.test1.questionnaire.QuestionItem
class LoadButtonHandler( class LoadButtonHandler(
private val activity: MainActivity, private val activity: MainActivity,

View File

@ -1,4 +1,6 @@
package com.dano.test1 package com.dano.test1.ui
import com.dano.test1.LanguageManager
data class Month(val name: String) { data class Month(val name: String) {
override fun toString(): String = name override fun toString(): String = name

View File

@ -1,12 +1,21 @@
package com.dano.test1 package com.dano.test1.ui
import android.content.ActivityNotFoundException
import android.content.ContentUris
import android.content.ContentValues
import android.content.Intent
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Paint import android.graphics.Paint
import android.graphics.pdf.PdfDocument import android.graphics.pdf.PdfDocument
import android.provider.MediaStore
import android.util.Log import android.util.Log
import android.widget.Button import android.widget.Button
import android.widget.EditText import android.widget.EditText
import android.widget.Toast import android.widget.Toast
import com.dano.test1.LanguageManager
import com.dano.test1.MainActivity
import com.dano.test1.MyApp
import com.dano.test1.questionnaire.GlobalValues
import kotlinx.coroutines.* import kotlinx.coroutines.*
class SaveButtonHandler( class SaveButtonHandler(
@ -105,19 +114,19 @@ class SaveButtonHandler(
val resolver = activity.contentResolver val resolver = activity.contentResolver
val deleteIfExists: (String) -> Unit = { name -> val deleteIfExists: (String) -> Unit = { name ->
val projection = arrayOf(android.provider.MediaStore.MediaColumns._ID) val projection = arrayOf(MediaStore.MediaColumns._ID)
val selection = "${android.provider.MediaStore.MediaColumns.DISPLAY_NAME} = ?" val selection = "${MediaStore.MediaColumns.DISPLAY_NAME} = ?"
val selectionArgs = arrayOf(name) val selectionArgs = arrayOf(name)
val query = resolver.query( val query = resolver.query(
android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI, MediaStore.Downloads.EXTERNAL_CONTENT_URI,
projection, selection, selectionArgs, null projection, selection, selectionArgs, null
) )
query?.use { cursor -> query?.use { cursor ->
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
val idColumn = cursor.getColumnIndexOrThrow(android.provider.MediaStore.MediaColumns._ID) val idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID)
val id = cursor.getLong(idColumn) val id = cursor.getLong(idColumn)
val deleteUri = android.content.ContentUris.withAppendedId( val deleteUri = ContentUris.withAppendedId(
android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI, id MediaStore.Downloads.EXTERNAL_CONTENT_URI, id
) )
resolver.delete(deleteUri, null, null) resolver.delete(deleteUri, null, null)
} }
@ -129,20 +138,20 @@ class SaveButtonHandler(
try { try {
val pdfUri = resolver.insert( val pdfUri = resolver.insert(
android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI, MediaStore.Downloads.EXTERNAL_CONTENT_URI,
android.content.ContentValues().apply { ContentValues().apply {
put(android.provider.MediaStore.MediaColumns.DISPLAY_NAME, pdfFileName) put(MediaStore.MediaColumns.DISPLAY_NAME, pdfFileName)
put(android.provider.MediaStore.MediaColumns.MIME_TYPE, "application/pdf") put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
put(android.provider.MediaStore.MediaColumns.RELATIVE_PATH, "Download/") put(MediaStore.MediaColumns.RELATIVE_PATH, "Download/")
} }
) )
val csvUri = resolver.insert( val csvUri = resolver.insert(
android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI, MediaStore.Downloads.EXTERNAL_CONTENT_URI,
android.content.ContentValues().apply { ContentValues().apply {
put(android.provider.MediaStore.MediaColumns.DISPLAY_NAME, csvFileName) put(MediaStore.MediaColumns.DISPLAY_NAME, csvFileName)
put(android.provider.MediaStore.MediaColumns.MIME_TYPE, "text/csv") put(MediaStore.MediaColumns.MIME_TYPE, "text/csv")
put(android.provider.MediaStore.MediaColumns.RELATIVE_PATH, "Download/") put(MediaStore.MediaColumns.RELATIVE_PATH, "Download/")
} }
) )
@ -162,13 +171,13 @@ class SaveButtonHandler(
Toast.makeText(activity, msg, Toast.LENGTH_LONG).show() Toast.makeText(activity, msg, Toast.LENGTH_LONG).show()
pdfUri?.let { pdfUri?.let {
val intent = android.content.Intent(android.content.Intent.ACTION_VIEW).apply { val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(it, "application/pdf") setDataAndType(it, "application/pdf")
addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION or android.content.Intent.FLAG_ACTIVITY_NO_HISTORY) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NO_HISTORY)
} }
try { try {
activity.startActivity(intent) activity.startActivity(intent)
} catch (e: android.content.ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
val noViewer = LanguageManager.getText(languageIDProvider(), "no_pdf_viewer") val noViewer = LanguageManager.getText(languageIDProvider(), "no_pdf_viewer")
Toast.makeText(activity, noViewer, Toast.LENGTH_SHORT).show() Toast.makeText(activity, noViewer, Toast.LENGTH_SHORT).show()
} }

View File

@ -1,6 +1,8 @@
package com.dano.test1 package com.dano.test1
import java.util.Calendar import com.dano.test1.questionnaire.MAX_VALUE_AGE
import com.dano.test1.questionnaire.MAX_VALUE_YEAR
import com.dano.test1.ui.RHS_POINTS
object LanguageManager { object LanguageManager {
fun getTextFormatted(languageId: String, key: String, vararg args: Any): String { fun getTextFormatted(languageId: String, key: String, vararg args: Any): String {
@ -61,14 +63,14 @@ object LanguageManager {
"once" to "einmal", "once" to "einmal",
"year_after_2000" to "Das Jahr muss nach 2000 liegen!", "year_after_2000" to "Das Jahr muss nach 2000 liegen!",
"year_after_departure" to "Das Jahr muss nach dem Verlassen des Herkunftslandes liegen!", "year_after_departure" to "Das Jahr muss nach dem Verlassen des Herkunftslandes liegen!",
"year_max" to "Das Jahr muss kleiner oder gleich $MAX_VALUE_YEAR sein!", "year_max" to "Das Jahr muss kleiner oder gleich ${MAX_VALUE_YEAR} sein!",
"data_final_warning" to "<b><font color='#FF0000'>Wichtig:</font></b> Die Daten können nach dem Abschluss nicht mehr verändert oder bearbeitet werden!", "data_final_warning" to "<b><font color='#FF0000'>Wichtig:</font></b> Die Daten können nach dem Abschluss nicht mehr verändert oder bearbeitet werden!",
"multiple_times" to "mehrmals", "multiple_times" to "mehrmals",
"more_than_15_years" to "mehr als 15 Jahre", "more_than_15_years" to "mehr als 15 Jahre",
"no" to "Nein", "no" to "Nein",
"no_answer" to "keine Angabe", "no_answer" to "keine Angabe",
"other_country" to "anderes Land", "other_country" to "anderes Land",
"value_must_be_less_equal_max" to "Der Wert muss kleiner oder gleich $MAX_VALUE_AGE sein!", "value_must_be_less_equal_max" to "Der Wert muss kleiner oder gleich ${MAX_VALUE_AGE} sein!",
"value_between_1_and_15" to "Der Wert muss zwischen 1 und 15 liegen!", "value_between_1_and_15" to "Der Wert muss zwischen 1 und 15 liegen!",
"invalid_month" to "Ungültige Monatsangabe!", "invalid_month" to "Ungültige Monatsangabe!",
"invalid_year" to "Ungültige Jahresangabe!", "invalid_year" to "Ungültige Jahresangabe!",
@ -438,14 +440,14 @@ object LanguageManager {
"once" to "once", "once" to "once",
"year_after_2000" to "The year must be after 2000!", "year_after_2000" to "The year must be after 2000!",
"year_after_departure" to "The year must be after leaving the country of origin!", "year_after_departure" to "The year must be after leaving the country of origin!",
"year_max" to "The year must be less than or equal to $MAX_VALUE_YEAR!", "year_max" to "The year must be less than or equal to ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>Important:</font></b> The data cannot be changed or edited after completion!", "data_final_warning" to "<b><font color='#FF0000'>Important:</font></b> The data cannot be changed or edited after completion!",
"multiple_times" to "multiple times", "multiple_times" to "multiple times",
"more_than_15_years" to "more than 15 years", "more_than_15_years" to "more than 15 years",
"no" to "No", "no" to "No",
"no_answer" to "No answer", "no_answer" to "No answer",
"other_country" to "Other country", "other_country" to "Other country",
"value_must_be_less_equal_max" to "The value must be less than or equal to $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "The value must be less than or equal to ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "The value must be between 1 and 15!", "value_between_1_and_15" to "The value must be between 1 and 15!",
"invalid_month" to "Invalid month!", "invalid_month" to "Invalid month!",
"invalid_year" to "Invalid year!", "invalid_year" to "Invalid year!",
@ -814,14 +816,14 @@ object LanguageManager {
"once" to "une fois", "once" to "une fois",
"year_after_2000" to "Lannée doit être après 2000 !", "year_after_2000" to "Lannée doit être après 2000 !",
"year_after_departure" to "Lannée doit être après le départ du pays dorigine !", "year_after_departure" to "Lannée doit être après le départ du pays dorigine !",
"year_max" to "Lannée doit être inférieure ou égale à $MAX_VALUE_YEAR !", "year_max" to "Lannée doit être inférieure ou égale à ${MAX_VALUE_YEAR} !",
"data_final_warning" to "<b><font color='#FF0000'>Important :</font></b> Les données ne peuvent plus être modifiées ou éditées après la validation !", "data_final_warning" to "<b><font color='#FF0000'>Important :</font></b> Les données ne peuvent plus être modifiées ou éditées après la validation !",
"multiple_times" to "plusieurs fois", "multiple_times" to "plusieurs fois",
"more_than_15_years" to "plus de 15 ans", "more_than_15_years" to "plus de 15 ans",
"no" to "Non", "no" to "Non",
"no_answer" to "pas de réponse", "no_answer" to "pas de réponse",
"other_country" to "autre pays", "other_country" to "autre pays",
"value_must_be_less_equal_max" to "La valeur doit être inférieure ou égale à $MAX_VALUE_AGE !", "value_must_be_less_equal_max" to "La valeur doit être inférieure ou égale à ${MAX_VALUE_AGE} !",
"value_between_1_and_15" to "La valeur doit être comprise entre 1 et 15 !", "value_between_1_and_15" to "La valeur doit être comprise entre 1 et 15 !",
"invalid_month" to "Mois invalide !", "invalid_month" to "Mois invalide !",
"invalid_year" to "Année invalide !", "invalid_year" to "Année invalide !",
@ -1194,14 +1196,14 @@ object LanguageManager {
"once" to "один раз", "once" to "один раз",
"year_after_2000" to "Год должен быть после 2000!", "year_after_2000" to "Год должен быть после 2000!",
"year_after_departure" to "Год должен быть после даты выезда из страны происхождения!", "year_after_departure" to "Год должен быть после даты выезда из страны происхождения!",
"year_max" to "Год должен быть меньше или равен $MAX_VALUE_YEAR!", "year_max" to "Год должен быть меньше или равен ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>Внимание:</font></b> Данные нельзя изменять после завершения!", "data_final_warning" to "<b><font color='#FF0000'>Внимание:</font></b> Данные нельзя изменять после завершения!",
"multiple_times" to "несколько раз", "multiple_times" to "несколько раз",
"more_than_15_years" to "более 15 лет", "more_than_15_years" to "более 15 лет",
"no" to "Нет", "no" to "Нет",
"no_answer" to "без ответа", "no_answer" to "без ответа",
"other_country" to "другая страна", "other_country" to "другая страна",
"value_must_be_less_equal_max" to "Значение должно быть меньше или равно $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "Значение должно быть меньше или равно ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "Значение должно быть между 1 и 15!", "value_between_1_and_15" to "Значение должно быть между 1 и 15!",
"invalid_month" to "Недопустимый месяц!", "invalid_month" to "Недопустимый месяц!",
"invalid_year" to "Недопустимый год!", "invalid_year" to "Недопустимый год!",
@ -1570,14 +1572,14 @@ object LanguageManager {
"once" to "один раз", "once" to "один раз",
"year_after_2000" to "Рік має бути після 2000!", "year_after_2000" to "Рік має бути після 2000!",
"year_after_departure" to "Рік має бути після виїзду з країни походження!", "year_after_departure" to "Рік має бути після виїзду з країни походження!",
"year_max" to "Рік має бути меншим або рівним $MAX_VALUE_YEAR!", "year_max" to "Рік має бути меншим або рівним ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>Важливо:</font></b> Дані після завершення не можна змінити або редагувати!", "data_final_warning" to "<b><font color='#FF0000'>Важливо:</font></b> Дані після завершення не можна змінити або редагувати!",
"multiple_times" to "багато разів", "multiple_times" to "багато разів",
"more_than_15_years" to "більше 15 років", "more_than_15_years" to "більше 15 років",
"no" to "Ні", "no" to "Ні",
"no_answer" to "немає відповіді", "no_answer" to "немає відповіді",
"other_country" to "інша країна", "other_country" to "інша країна",
"value_must_be_less_equal_max" to "Значення має бути меншим або рівним $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "Значення має бути меншим або рівним ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "Значення має бути від 1 до 15!", "value_between_1_and_15" to "Значення має бути від 1 до 15!",
"invalid_month" to "Неправильний місяць!", "invalid_month" to "Неправильний місяць!",
"invalid_year" to "Неправильний рік!", "invalid_year" to "Неправильний рік!",
@ -1950,14 +1952,14 @@ object LanguageManager {
"once" to "bir kez", "once" to "bir kez",
"year_after_2000" to "Yıl 2000den sonra olmalıdır!", "year_after_2000" to "Yıl 2000den sonra olmalıdır!",
"year_after_departure" to "Yıl, menşe ülkeyi terk ettikten sonra olmalıdır!", "year_after_departure" to "Yıl, menşe ülkeyi terk ettikten sonra olmalıdır!",
"year_max" to "Yıl $MAX_VALUE_YEARden küçük veya ona eşit olmalıdır!", "year_max" to "Yıl ${MAX_VALUE_YEAR}den küçük veya ona eşit olmalıdır!",
"data_final_warning" to "<b><font color='#FF0000'>Önemli:</font></b> Veriler tamamlandıktan sonra değiştirilemez veya düzenlenemez!", "data_final_warning" to "<b><font color='#FF0000'>Önemli:</font></b> Veriler tamamlandıktan sonra değiştirilemez veya düzenlenemez!",
"multiple_times" to "birden fazla kez", "multiple_times" to "birden fazla kez",
"more_than_15_years" to "15 yıldan fazla", "more_than_15_years" to "15 yıldan fazla",
"no" to "Hayır", "no" to "Hayır",
"no_answer" to "Cevap yok", "no_answer" to "Cevap yok",
"other_country" to "diğer ülke", "other_country" to "diğer ülke",
"value_must_be_less_equal_max" to "Değer $MAX_VALUE_AGEden küçük veya ona eşit olmalıdır!", "value_must_be_less_equal_max" to "Değer ${MAX_VALUE_AGE}den küçük veya ona eşit olmalıdır!",
"value_between_1_and_15" to "Değer 1 ile 15 arasında olmalıdır!", "value_between_1_and_15" to "Değer 1 ile 15 arasında olmalıdır!",
"invalid_month" to "Geçersiz ay girişi!", "invalid_month" to "Geçersiz ay girişi!",
"invalid_year" to "Geçersiz yıl girişi!", "invalid_year" to "Geçersiz yıl girişi!",
@ -2330,14 +2332,14 @@ object LanguageManager {
"once" to "jeden raz", "once" to "jeden raz",
"year_after_2000" to "Rok musi być po 2000!", "year_after_2000" to "Rok musi być po 2000!",
"year_after_departure" to "Rok musi być po opuszczeniu kraju pochodzenia!", "year_after_departure" to "Rok musi być po opuszczeniu kraju pochodzenia!",
"year_max" to "Rok musi być mniejszy lub równy $MAX_VALUE_YEAR!", "year_max" to "Rok musi być mniejszy lub równy ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>Ważne:</font></b> Po zakończeniu dane nie mogą być zmienione ani edytowane!", "data_final_warning" to "<b><font color='#FF0000'>Ważne:</font></b> Po zakończeniu dane nie mogą być zmienione ani edytowane!",
"multiple_times" to "kilka razy", "multiple_times" to "kilka razy",
"more_than_15_years" to "więcej niż 15 lat", "more_than_15_years" to "więcej niż 15 lat",
"no" to "Nie", "no" to "Nie",
"no_answer" to "brak odpowiedzi", "no_answer" to "brak odpowiedzi",
"other_country" to "inny kraj", "other_country" to "inny kraj",
"value_must_be_less_equal_max" to "Wartość musi być mniejsza lub równa $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "Wartość musi być mniejsza lub równa ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "Wartość musi być między 1 a 15!", "value_between_1_and_15" to "Wartość musi być między 1 a 15!",
"invalid_month" to "Nieprawidłowy miesiąc!", "invalid_month" to "Nieprawidłowy miesiąc!",
"invalid_year" to "Nieprawidłowy rok!", "invalid_year" to "Nieprawidłowy rok!",
@ -2710,14 +2712,14 @@ object LanguageManager {
"once" to "مرة واحدة", "once" to "مرة واحدة",
"year_after_2000" to "يجب أن تكون السنة بعد 2000!", "year_after_2000" to "يجب أن تكون السنة بعد 2000!",
"year_after_departure" to "يجب أن تكون السنة بعد مغادرة بلد المنشأ!", "year_after_departure" to "يجب أن تكون السنة بعد مغادرة بلد المنشأ!",
"year_max" to "يجب أن تكون السنة أقل من أو تساوي $MAX_VALUE_YEAR!", "year_max" to "يجب أن تكون السنة أقل من أو تساوي ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>هام:</font></b> لا يمكن تعديل البيانات بعد الانتهاء!", "data_final_warning" to "<b><font color='#FF0000'>هام:</font></b> لا يمكن تعديل البيانات بعد الانتهاء!",
"multiple_times" to "عدة مرات", "multiple_times" to "عدة مرات",
"more_than_15_years" to "أكثر من 15 سنة", "more_than_15_years" to "أكثر من 15 سنة",
"no" to "لا", "no" to "لا",
"no_answer" to "لا يوجد إجابة", "no_answer" to "لا يوجد إجابة",
"other_country" to "بلد آخر", "other_country" to "بلد آخر",
"value_must_be_less_equal_max" to "يجب أن تكون القيمة أقل من أو تساوي $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "يجب أن تكون القيمة أقل من أو تساوي ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "يجب أن تكون القيمة بين 1 و15!", "value_between_1_and_15" to "يجب أن تكون القيمة بين 1 و15!",
"invalid_month" to "شهر غير صالح!", "invalid_month" to "شهر غير صالح!",
"invalid_year" to "سنة غير صالحة!", "invalid_year" to "سنة غير صالحة!",
@ -3090,14 +3092,14 @@ object LanguageManager {
"once" to "o dată", "once" to "o dată",
"year_after_2000" to "Anul trebuie să fie după 2000!", "year_after_2000" to "Anul trebuie să fie după 2000!",
"year_after_departure" to "Anul trebuie să fie după plecarea din țara de origine!", "year_after_departure" to "Anul trebuie să fie după plecarea din țara de origine!",
"year_max" to "Anul trebuie să fie mai mic sau egal cu $MAX_VALUE_YEAR!", "year_max" to "Anul trebuie să fie mai mic sau egal cu ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>Important:</font></b> Datele nu mai pot fi modificate după finalizare!", "data_final_warning" to "<b><font color='#FF0000'>Important:</font></b> Datele nu mai pot fi modificate după finalizare!",
"multiple_times" to "de mai multe ori", "multiple_times" to "de mai multe ori",
"more_than_15_years" to "mai mult de 15 ani", "more_than_15_years" to "mai mult de 15 ani",
"no" to "Nu", "no" to "Nu",
"no_answer" to "fără răspuns", "no_answer" to "fără răspuns",
"other_country" to "altă țară", "other_country" to "altă țară",
"value_must_be_less_equal_max" to "Valoarea trebuie să fie mai mică sau egală cu $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "Valoarea trebuie să fie mai mică sau egală cu ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "Valoarea trebuie să fie între 1 și 15!", "value_between_1_and_15" to "Valoarea trebuie să fie între 1 și 15!",
"invalid_month" to "Lună invalidă!", "invalid_month" to "Lună invalidă!",
"invalid_year" to "An invalid!", "invalid_year" to "An invalid!",
@ -3470,14 +3472,14 @@ object LanguageManager {
"once" to "una vez", "once" to "una vez",
"year_after_2000" to "¡El año debe ser posterior al 2000!", "year_after_2000" to "¡El año debe ser posterior al 2000!",
"year_after_departure" to "¡El año debe ser posterior a la salida de su país de origen!", "year_after_departure" to "¡El año debe ser posterior a la salida de su país de origen!",
"year_max" to "¡El año debe ser menor o igual que $MAX_VALUE_YEAR!", "year_max" to "¡El año debe ser menor o igual que ${MAX_VALUE_YEAR}!",
"data_final_warning" to "<b><font color='#FF0000'>Importante:</font></b> Después de finalizar, los datos no podrán cambiarse o editarse.", "data_final_warning" to "<b><font color='#FF0000'>Importante:</font></b> Después de finalizar, los datos no podrán cambiarse o editarse.",
"multiple_times" to "varias veces", "multiple_times" to "varias veces",
"more_than_15_years" to "más de 15 años", "more_than_15_years" to "más de 15 años",
"no" to "No", "no" to "No",
"no_answer" to "sin respuesta", "no_answer" to "sin respuesta",
"other_country" to "otro país", "other_country" to "otro país",
"value_must_be_less_equal_max" to "¡El valor debe ser menor o igual que $MAX_VALUE_AGE!", "value_must_be_less_equal_max" to "¡El valor debe ser menor o igual que ${MAX_VALUE_AGE}!",
"value_between_1_and_15" to "¡El valor debe estar entre 1 y 15!", "value_between_1_and_15" to "¡El valor debe estar entre 1 y 15!",
"invalid_month" to "¡Mes no válido!", "invalid_month" to "¡Mes no válido!",
"invalid_year" to "¡Año no válido!", "invalid_year" to "¡Año no válido!",