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ś." +}