diff --git a/server/src/main/scala/com/lbs/server/lang/Lang.scala b/server/src/main/scala/com/lbs/server/lang/Lang.scala
index 7472f7e..6517c75 100644
--- a/server/src/main/scala/com/lbs/server/lang/Lang.scala
+++ b/server/src/main/scala/com/lbs/server/lang/Lang.scala
@@ -13,7 +13,7 @@ import scala.util.Try
object Lang {
- val Langs: Seq[Lang] = Seq(En, Ua)
+ val Langs: Seq[Lang] = Seq(En, Ua, Pl)
private val LangsMap = Langs.map(e => e.id -> e).toMap
diff --git a/server/src/main/scala/com/lbs/server/lang/Pl.scala b/server/src/main/scala/com/lbs/server/lang/Pl.scala
new file mode 100644
index 0000000..b4b8d43
--- /dev/null
+++ b/server/src/main/scala/com/lbs/server/lang/Pl.scala
@@ -0,0 +1,369 @@
+
+package com.lbs.server.lang
+
+import com.lbs.api.json.model.{AvailableVisitsTermPresentation, HistoricVisit, ReservedVisit, ValuationsResponse}
+import com.lbs.server.conversation.Book
+import com.lbs.server.conversation.StaticData.StaticDataConfig
+import com.lbs.server.repository.model.Monitoring
+import com.lbs.server.util.DateTimeUtil._
+
+import java.time.{LocalTime, ZonedDateTime}
+import java.util.Locale
+
+object Pl extends Lang {
+
+ override def id: Int = 2
+
+ override def locale: Locale = new Locale("pl", "PL")
+
+ override def label: String = "🇵🇱 Polski"
+
+ override protected def withPages(message: String, page: Int, pages: Int): String = {
+ if (pages > 1) s"$message. Strona ${page + 1} z $pages"
+ else message
+ }
+
+ override def unableToCancelUpcomingVisit(reason: String): String =
+ s"⚠ Nie udało się odwołać wizyty! Powód: $reason"
+
+ override def appointmentHasBeenCancelled: String =
+ s"👍 Wizyta została odwołana!!"
+
+ override def yes: String = "Tak"
+
+ override def no: String = "Nie"
+
+ override def noUpcomingVisits: String =
+ "ℹ Nie znaleziono wizyt"
+
+ override def areYouSureToCancelAppointment(visit: ReservedVisit): String =
+ s"""➡ Czy na pewno chcesz anulować wizytę?
+ |
+ |⏱ ${formatDateTime(visit.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${visit.doctorName}
+ |${capitalizeFirstLetter(service)}: ${visit.service.name}
+ |${capitalizeFirstLetter(clinic)}: ${visit.clinic.name}
+ |""".stripMargin
+
+ override def chooseDateFrom(exampleDate: ZonedDateTime): String = s"➡ Wybierz datę albo zapisz ją w formacie dd-MM, np. ${formatDateShort(exampleDate)}"
+
+ override def chooseDateTo(exampleDate: ZonedDateTime): String = s"➡ Wybierz datę albo zapisz ją w formacie dd-MM, np. ${formatDateShort(exampleDate)}"
+
+ override def findTerms: String = "🔍 Szukaj terminów"
+
+ override def modifyDate: String = "📅 Zmień datę"
+
+ override def bookingSummary(bookingData: Book.BookingData): String =
+ s"🦄 Ok! Zarezerwujemy wizytę typu ${bookingData.serviceId.name}" +
+ s" z lekarzem: ${bookingData.doctorId.name}" +
+ s" w klinice: ${bookingData.clinicId.name}" +
+ s" w mieście ${bookingData.cityId.name}." +
+ s"\nWybrane daty: ${formatDate(bookingData.dateFrom, locale)} -> ${formatDate(bookingData.dateTo, locale)}" +
+ s"w godzinach: ${formatTime(bookingData.timeFrom)} -> ${formatTime(bookingData.timeTo)}" +
+ s"\n\n➡ Wybierz co dalej"
+
+ override def noTermsFound: String =
+ s"""ℹ Nie znaleziono dostępnych terminów
+ |
+ |Co chcesz zrobić?""".stripMargin
+
+ override def createMonitoring: String = "👀 Stwórz monitoring"
+
+ override def cancel: String = "Anuluj"
+
+ override def book: String = "Zarezerwuj"
+
+ override def confirmAppointment(term: AvailableVisitsTermPresentation, valuations: ValuationsResponse): String =
+
+ s"""➡ ${valuations.optionsQuestion.getOrElse("Czy potwierdzasz wizytę?")}
+ |
+ |⏱ ${formatDateTime(term.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${term.doctor.name}
+ |${capitalizeFirstLetter(clinic)}: ${term.clinic.name}
+ |
+ |ℹ${valuations.visitTermVariants.head.infoMessage}""".stripMargin
+
+ override def appointmentIsConfirmed: String = "👍 Twoja wizyta została potwierdzona!"
+
+ override def monitoringHasBeenCreated: String = "👍 Stworzono monitoring! Sprawdź aktywne monitoringi przez /monitorings"
+
+ override def unableToCreateMonitoring(reason: String): String = s"👎 Nie udało się stworzyć monitoringu. Powód: $reason."
+
+ override def chooseTypeOfMonitoring: String = "➡ Wybierz typ monitoringu"
+
+ override def bookByApplication: String = "👾 Automatyczna rezerwacja"
+
+ override def bookManually: String = "👤 Rezerwacja ręczna (otrzymasz powiadomienie o dostępnych terminach)"
+
+ override def rebookIfExists: String = "➡ Czy chcesz zaktualizować termin, jeśli rezerwacja już istnieje?"
+
+ override def pleaseSpecifyOffset: String = "➡ Podaj offset w godzinach albo kliknij Nie"
+
+ override def visitAlreadyExists: String = "➡ Wizyta została juz zarezerwowana. Czy chcesz zaktualizować jej termin?"
+
+ override def city: String = "miasto"
+
+ override def clinic: String = "klinika"
+
+ override def service: String = "usługa"
+
+ override def doctor: String = "lekarz"
+
+ override def previous: String = "Wstecz"
+
+ override def next: String = "Dalej"
+
+ override def noActiveMonitorings: String = "ℹ Nie masz aktywnych monitoringów. Stwórz nowy przez /book"
+
+ override def deactivateMonitoring(monitoring: Monitoring): String =
+ s"""➡ Czy na pewno chcesz wyłączyć monitoring?
+ |
+ |📅 ${formatDate(monitoring.dateFrom, locale)} -> ${formatDate(monitoring.dateTo, locale)}
+ |⏱ ${formatTime(monitoring.timeFrom)} -> ${formatTime(monitoring.timeTo)}
+ |${capitalizeFirstLetter(doctor)}: ${monitoring.doctorName}
+ |${capitalizeFirstLetter(service)}: ${monitoring.serviceName}
+ |${capitalizeFirstLetter(clinic)}: ${monitoring.clinicName}""".stripMargin
+
+ override def deactivated: String = "👍 Wyłączony! Sprawdź aktywne monitoringi przez /monitorings"
+
+ override def any: String = "Jakikolwiek"
+
+ override def pressAny: String = s"albo naciśnij przycisk $any "
+
+ override def pleaseEnterStaticDataNameOrAny(config: StaticDataConfig): String =
+ withAnyVariant(
+ s"""➡ Podaj fragment nazwy ${config.name}
+ |Na przykład: ${config.partialExample} jeśli szukasz ${config.example}""".stripMargin,
+ config.isAnyAllowed)
+
+ override def pleaseEnterStaticDataNameOrPrevious(config: StaticDataConfig): String =
+ s"""➡ Podaj fragment nazwy ${config.name}
+ |Na przykład: ${config.partialExample} jeśli szukasz ${config.example}
+ |
+ |lub wybierz ${config.name} z poprzednich wyszukiwań""".stripMargin
+
+ override def staticDataIs(config: StaticDataConfig, label: String): String =
+ s"✅ ${capitalizeFirstLetter(config.name)} jest $label"
+
+ override def pleaseChooseStaticDataNameOrAny(config: StaticDataConfig): String =
+ withAnyVariant(s"➡ Wybierz ${config.name}", config.isAnyAllowed)
+
+ override def staticNotFound(config: StaticDataConfig): String =
+ withAnyVariant(
+ s"""➡ Brak wyników 😔
+ |Proszę podaj nazwę ${config.name} jeszcze raz""", config.isAnyAllowed)
+
+ override def loginAndPasswordAreOk: String =
+ s"""✅ Brawo! Login i hasło są OK!
+ |Teraz możesz zmienic język przez /settings
+ """.stripMargin
+
+ override def provideUsername: String =
+ s"""ℹ Musisz się zalogować do Luxmed
+ |
+ |➡ Podaj nazwę uzytkownika:""".stripMargin
+
+ override def providePassword: String = "➡ Podaj hasło"
+
+ override def visitsHistoryIsEmpty: String = "ℹ Brak wizyt w historii"
+
+ override def help: String =
+ s"""ℹ Nieoficjalny Bot do Portal Pacjenta LUX MED (v.${Lang.version}).
+ |Pomogę Ci w rezerwacji wizyty, stworzeniu monitoringu na termin, pokazaniu nadchodzących wizyt i przejrzeniu historii.
+ |
+ |➡ Wspierane komendy
+ |/book - zarezerwuj wizytę albo stwórz monitoring
+ |/monitorings - lista obecnych monitoringów
+ |/monitorings_history - lista przeszłych monitoringów
+ |/reserved - nadchodzące wizyty
+ |/history - historia wizyt
+ |/accounts - zarządzanie kontami Luxmed
+ |/login - ponowne logowanie
+ |/settings - ustawienia, np. język
+ |/help - pomoc""".stripMargin
+
+ override def dateFromIs(dateFrom: ZonedDateTime): String = s"📅 Data od ${formatDate(dateFrom, locale)}"
+
+ override def dateToIs(dateTo: ZonedDateTime): String = s"📅 Data do ${formatDate(dateTo, locale)}"
+
+ override def termEntry(term: AvailableVisitsTermPresentation, page: Int, index: Int): String =
+ s"""⏱ ${formatDateTime(term.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${term.doctor.name}
+ |${capitalizeFirstLetter(clinic)}: ${term.clinic.name}
+ |➡ /book_$index
+ |
+ |""".stripMargin
+
+ override def termsHeader(page: Int, pages: Int): String =
+ withPages("➡ Dostępne terminy", page, pages)
+
+ override def historyEntry(visit: HistoricVisit, page: Int, index: Int): String =
+ s"""⏱ ${formatDateTime(visit.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${visit.doctorName}
+ |${capitalizeFirstLetter(service)}: ${visit.service.name}
+ |${capitalizeFirstLetter(clinic)}: ${visit.clinicName}
+ |
+ |""".stripMargin
+
+ override def historyHeader(page: Int, pages: Int): String =
+ withPages("➡ Odbyte wizyty", page, pages)
+
+ override def upcomingVisitEntry(visit: ReservedVisit, page: Int, index: Int): String =
+ s"""⏱ ${formatDateTime(visit.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${visit.doctorName}
+ |${capitalizeFirstLetter(service)}: ${visit.service.name}
+ |${capitalizeFirstLetter(clinic)}: ${visit.clinic.name}
+ |➡ /cancel_$index
+ |
+ |""".stripMargin
+
+ override def upcomingVisitsHeader(page: Int, pages: Int): String =
+ withPages("➡ Zarezerwowane wizyty", page, pages)
+
+ override def bugsHeader(page: Int, pages: Int): String =
+ withPages("➡ Zgłoszone błędy", page, pages)
+
+ override def monitoringEntry(monitoring: Monitoring, page: Int, index: Int): String =
+ s"""📅 ${formatDate(monitoring.dateFrom, locale)} -> ${formatDate(monitoring.dateTo, locale)}
+ |⏱ ${formatTime(monitoring.timeFrom)} -> ${formatTime(monitoring.timeTo)}
+ |${capitalizeFirstLetter(doctor)}: ${monitoring.doctorName}
+ |${capitalizeFirstLetter(service)}: ${monitoring.serviceName}
+ |${capitalizeFirstLetter(clinic)}: ${monitoring.clinicName}
+ |${capitalizeFirstLetter(city)}: ${monitoring.cityName}
+ |Sposób rejestracji: ${if (monitoring.autobook) "Automatyczny" else "Ręczny"}
+ |➡ /cancel_$index
+ |
+ |""".stripMargin
+
+ override def monitoringHistoryEntry(monitoring: Monitoring, page: Int, index: Int): String =
+ s"""📅 ${formatDate(monitoring.dateFrom, locale)} -> ${formatDate(monitoring.dateTo, locale)}
+ |⏱ ${formatTime(monitoring.timeFrom)} -> ${formatTime(monitoring.timeTo)}
+ |${capitalizeFirstLetter(doctor)}: ${monitoring.doctorName}
+ |${capitalizeFirstLetter(service)}: ${monitoring.serviceName}
+ |${capitalizeFirstLetter(clinic)}: ${monitoring.clinicName}
+ |${capitalizeFirstLetter(city)}: ${monitoring.cityName}
+ |Sposób rejestracji: ${if (monitoring.autobook) "Automatyczny" else "Ręczny"}
+ |➡ /repeat_$index
+ |
+ |""".stripMargin
+
+ override def monitoringsHeader(page: Int, pages: Int): String =
+ withPages("➡ Aktywne monitoringi", page, pages)
+
+ override def monitoringsHistoryHeader(page: Int, pages: Int): String =
+ withPages("➡ Historia monitoringów", page, pages)
+
+ override def invalidLoginOrPassword: String =
+ """❗ Błędne dane logowania. Czy dane logowania zostały zmienione przez stronę Luxmedu?
+ |Usunięto monitoringi. Zaloguj się przez /login i stwórz nowe monitoringi.
+ """.stripMargin
+
+ override def availableTermEntry(term: AvailableVisitsTermPresentation, monitoring: Monitoring, index: Int): String =
+ s"""⏱ ${formatDateTime(term.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${term.doctor.name}
+ |${capitalizeFirstLetter(service)}: ${monitoring.serviceName}
+ |${capitalizeFirstLetter(clinic)}: ${term.clinic.name}
+ |${capitalizeFirstLetter(city)}: ${monitoring.cityName}
+ |/reserve_${monitoring.recordId}_${term.scheduleId}_${minutesSinceBeginOf2018(term.visitDate.startDateTime)}
+ |
+ |""".stripMargin
+
+ override def availableTermsHeader(size: Int): String =
+ s"""✅ Monitoring znalazł $size terminów. Pokazujemy Ci najbliszych 5.
+ |
+ |➡ Wybierz jeden, by go zarezerwować""".stripMargin
+
+ override def nothingWasFoundByMonitoring(monitoring: Monitoring): String =
+ s"""❗ Monitoring nie znalazł terminów i został wyłączony jako przeterminowany.
+ |
+ |📅 ${formatDate(monitoring.dateFrom, locale)} -> ${formatDate(monitoring.dateTo, locale)}
+ |⏱ ${formatTime(monitoring.timeFrom)} -> ${formatTime(monitoring.timeTo)}
+ |${capitalizeFirstLetter(doctor)}: ${monitoring.doctorName}
+ |${capitalizeFirstLetter(service)}: ${monitoring.serviceName}
+ |${capitalizeFirstLetter(clinic)}: ${monitoring.clinicName}
+ |${capitalizeFirstLetter(city)}: ${monitoring.cityName}
+ |
+ |➡ Stwórz nowy monitoring przez /book""".stripMargin
+
+ override def appointmentIsBooked(term: AvailableVisitsTermPresentation, monitoring: Monitoring): String =
+ s"""👍 Zarezerwowaliśmy za Ciebie termin!
+ |
+ |⏱ ${formatDateTime(term.visitDate.startDateTime, locale)}
+ |${capitalizeFirstLetter(doctor)}: ${term.doctor.name}
+ |${capitalizeFirstLetter(service)}: ${monitoring.serviceName}
+ |${capitalizeFirstLetter(clinic)}: ${term.clinic.name}
+ |${capitalizeFirstLetter(city)}: ${monitoring.cityName}""".stripMargin
+
+ override def maximumMonitoringsLimitExceeded: String = "Maksymalna liczba monitoringów uzytkownika to 10"
+
+ override def termIsOutdated: String =
+ s"""❗️ Wygląda na to, ze ten termin został już zarezewowany!
+ |
+ |Wybierz inny termin albo stwórz nowy monitoring przez /book""".stripMargin
+
+ override def loginHasChangedOrWrong: String =
+ """❗ Wprowadzono niepoprawny login lub hasło lub zostały one zmienione.
+ |
+ |Zaloguj się ponownie przez /login i stwórz nowy monitoring przez /book.
+ """.stripMargin
+
+ override def settingsHeader: String = "➡ Wybierz opcję:"
+
+ override def language: String = "🌐 Język"
+
+ override def offset: String = "⏱ Offset"
+
+ override def chooseLanguage: String = "➡ Wybierz język:"
+
+ override def configureOffset: String = "➡ Wybierz opcje offsetu"
+
+ override def pleaseEnterOffset(current: Int): String = s"➡ Podaj domyślny offset. Obecny offset: $current"
+
+ override def alwaysAskOffset(enabled: Boolean): String = s"${if (enabled) "✅ " else ""}Zawsze pytaj o offset"
+
+ override def changeDefaultOffset(current: Int): String = s"Zmień domyślny offset ($current)"
+
+ override def languageUpdated: String = "👍 Zmieniono język!"
+
+ override def appointmentWasNotCancelled: String = "👍 Wizyta nie została anulowana"
+
+ override def monitoringWasNotDeactivated: String = "👍 Nie wyłączono monitoringu"
+
+ override def bugAction: String = "➡ Wybierz opcję:"
+
+ override def createNewBug: String = "🐞 Dodaj nowy"
+
+ override def showSubmittedBugs: String = "👀 Pokaż dotychczasowe"
+
+ override def enterIssueDetails: String = "➡ Podaj szczegóły błędu:"
+
+ override def noSubmittedIssuesFound: String = "ℹ Nie znaleziono dotychczasowych zgłoszeń błędów"
+
+ override def bugHasBeenCreated(bugId: Long): String = s"✅ Dziękuję za zgłoszenie błędu#$bugId!"
+
+ override def deleteAccount: String = "➖ Usuń konto"
+
+ override def addAccount: String = "➕ Dodaj konto"
+
+ override def accountSwitched(username: String): String =
+ s"✅ Zmieniono konto na: $username"
+
+ override def pleaseChooseAccount(currentAccountName: String): String =
+ s"""Obecne konto to: $currentAccountName
+ |
+ |➡ Wybierz opcję albo konto""".stripMargin
+
+ override def moreParameters: String = "🛠 Więcej opcji"
+
+ override def chooseTimeFrom(exampleTime: LocalTime): String = s"➡ Wybierz godzinę OD albo zapisz w formacie HH:mm, np. ${formatTime(exampleTime)}"
+
+ override def chooseTimeTo(exampleTime: LocalTime): String = s"➡ Wybierz godzinę DO albo zapisz w formacie HH:mm ${formatTime(exampleTime)}"
+
+ override def timeFromIs(timeFrom: LocalTime): String = s"⏱ Godzina OD: ${formatTime(timeFrom)}"
+
+ override def timeToIs(timeTo: LocalTime): String = s"⏱ Godzina DO: ${formatTime(timeTo)}"
+
+ override def canNotDetectPayer(error: String): String = s"Nie udało się ustalić płatnika. Powód: $error"
+
+ override def pleaseChoosePayer: String = "➡ Nie udało się ustalić domyślnego płatnika, wybierz jakiegoś."
+}