Skip to content

Commit

Permalink
refactor(shared): use lyricist for translations.
Browse files Browse the repository at this point in the history
  • Loading branch information
GerardPaligot committed Apr 13, 2024
1 parent 96c6ff0 commit 646a07c
Show file tree
Hide file tree
Showing 17 changed files with 148 additions and 141 deletions.
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ koin = "3.5.3"
ktlint = "12.1.0"
ktor = "2.3.3"
logback = "1.3.5"
lyricist = "1.7.0"
openfeedback = "0.2.2"
richtext-commonmark = "0.11.0"
squareup-okio = "3.7.0"
Expand Down Expand Up @@ -148,6 +149,8 @@ ktlint-gradlePlugin = { group = "org.jlleitschuh.gradle", name = "ktlint-gradle"

logback = { group = "ch.qos.logback", name = "logback-classic", version.ref = "logback" }

lyricist = { group = "cafe.adriel.lyricist", name = "lyricist", version.ref = "lyricist" }

openfeedback-m3 = { group = "io.openfeedback", name = "openfeedback-m3", version.ref = "openfeedback" }

richtext-commonmark = { group = "com.halilibo.compose-richtext", name = "richtext-commonmark", version.ref = "richtext-commonmark" }
Expand Down
Binary file not shown.
4 changes: 2 additions & 2 deletions shared/core-di/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ kotlin {
val commonMain by getting {
dependencies {
api(projects.shared.core)

api(projects.shared.resources)
implementation(libs.koin.core)

implementation(libs.jetbrains.kotlinx.coroutines)
implementation(libs.lyricist)
}
}
val androidMain by getting {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,40 @@
package org.gdglille.devfest

import cafe.adriel.lyricist.LanguageTag
import cafe.adriel.lyricist.Lyricist
import com.russhwolf.settings.ExperimentalSettingsApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import org.gdglille.devfest.android.shared.resources.EnStrings
import org.gdglille.devfest.android.shared.resources.FrStrings
import org.gdglille.devfest.database.EventDao
import org.gdglille.devfest.database.FeaturesActivatedDao
import org.gdglille.devfest.database.PartnerDao
import org.gdglille.devfest.database.ScheduleDao
import org.gdglille.devfest.database.SpeakerDao
import org.gdglille.devfest.database.TalkDao
import org.gdglille.devfest.database.UserDao
import org.koin.core.qualifier.named
import org.koin.dsl.module

@OptIn(ExperimentalSettingsApi::class)
val databasesModule = module {
includes(platformModule)
single {
Lyricist(
defaultLanguageTag = "en",
translations = mapOf("en" to EnStrings, "fr" to FrStrings)
).apply {
this.languageTag = get<LanguageTag>(named(AcceptLanguageNamed)).split("-").first()
}
}
single { EventDao(db = get(), settings = get(), dispatcher = Dispatchers.IO) }
single { FeaturesActivatedDao(db = get(), settings = get(), dispatcher = Dispatchers.IO) }
single { PartnerDao(db = get(), platform = get(), dispatcher = Dispatchers.IO) }
single { ScheduleDao(db = get(), settings = get(), dispatcher = Dispatchers.IO) }
single { SpeakerDao(db = get(), dispatcher = Dispatchers.IO) }
single { TalkDao(db = get(), dispatcher = Dispatchers.IO) }
single {
ScheduleDao(db = get(), settings = get(), lyricist = get(), dispatcher = Dispatchers.IO)
}
single { SpeakerDao(db = get(), lyricist = get(), dispatcher = Dispatchers.IO) }
single { TalkDao(db = get(), lyricist = get(), dispatcher = Dispatchers.IO) }
single { UserDao(db = get(), platform = get(), dispatcher = Dispatchers.IO) }
}
2 changes: 2 additions & 0 deletions shared/core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ kotlin {
implementation(libs.cash.sqldelight.coroutines)
implementation(libs.squareup.okio)

implementation(libs.lyricist)

api(libs.settings)
implementation(libs.settings.coroutines)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.gdglille.devfest.database

import app.cash.sqldelight.coroutines.asFlow
import app.cash.sqldelight.coroutines.mapToList
import cafe.adriel.lyricist.Lyricist
import com.russhwolf.settings.ExperimentalSettingsApi
import com.russhwolf.settings.ObservableSettings
import com.russhwolf.settings.coroutines.getBooleanFlow
Expand All @@ -24,13 +25,15 @@ import org.gdglille.devfest.models.ui.CategoryUi
import org.gdglille.devfest.models.ui.FiltersUi
import org.gdglille.devfest.models.ui.FormatUi
import kotlin.coroutines.CoroutineContext
import org.gdglille.devfest.android.shared.resources.Strings

@FlowPreview
@ExperimentalCoroutinesApi
@ExperimentalSettingsApi
class ScheduleDao(
private val db: Conferences4HallDatabase,
private val settings: ObservableSettings,
private val lyricist: Lyricist<Strings>,
private val dispatcher: CoroutineContext
) {
fun fetchSchedules(eventId: String): Flow<ImmutableMap<String, AgendaUi>> = combine(
Expand Down Expand Up @@ -82,8 +85,8 @@ class ScheduleDao(
} else {
emptyList()
}
it.convertTalkItemUi(speakers = speakers)
} + breaks.map { it.convertTalkItemUi() }
it.convertTalkItemUi(speakers = speakers, strings = lyricist.strings)
} + breaks.map { it.convertTalkItemUi(lyricist.strings) }
sessions.distinctBy { it.date }
.associate { session ->
session.date to AgendaUi(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.gdglille.devfest.database
import app.cash.sqldelight.coroutines.asFlow
import app.cash.sqldelight.coroutines.mapToList
import app.cash.sqldelight.coroutines.mapToOne
import cafe.adriel.lyricist.Lyricist
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.Flow
Expand All @@ -16,9 +17,11 @@ import org.gdglille.devfest.models.ui.SpeakerItemUi
import org.gdglille.devfest.models.ui.SpeakerUi
import org.gdglille.devfest.models.ui.TalkItemUi
import kotlin.coroutines.CoroutineContext
import org.gdglille.devfest.android.shared.resources.Strings

class SpeakerDao(
private val db: Conferences4HallDatabase,
private val lyricist: Lyricist<Strings>,
private val dispatcher: CoroutineContext
) {
fun fetchSpeaker(eventId: String, speakerId: String): Flow<SpeakerUi> {
Expand All @@ -29,7 +32,8 @@ class SpeakerDao(
fetchTalksBySpeakerId(eventId, speakerId),
transform = { speaker, talks ->
return@combine speaker.convertToSpeakerUi(
talks = talks.toImmutableList()
talks = talks.toImmutableList(),
strings = lyricist.strings
)
}
)
Expand All @@ -52,7 +56,8 @@ class SpeakerDao(
.executeAsOne(),
speakers = db.sessionQueries
.selectSpeakersByTalkId(eventId, talk.id)
.executeAsList()
.executeAsList(),
strings = lyricist.strings
)
}
.toImmutableList()
Expand All @@ -65,7 +70,7 @@ class SpeakerDao(
.mapToList(dispatcher)
.map { speakers ->
speakers
.map { speaker -> speaker.convertToSpeakerItemUi() }
.map { speaker -> speaker.convertToSpeakerItemUi(lyricist.strings) }
.toImmutableList()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@ package org.gdglille.devfest.database
import app.cash.sqldelight.coroutines.asFlow
import app.cash.sqldelight.coroutines.mapToList
import app.cash.sqldelight.coroutines.mapToOne
import cafe.adriel.lyricist.Lyricist
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import org.gdglille.devfest.database.mappers.convertTalkUi
import org.gdglille.devfest.db.Conferences4HallDatabase
import org.gdglille.devfest.models.ui.TalkUi
import kotlin.coroutines.CoroutineContext
import org.gdglille.devfest.android.shared.resources.Strings

class TalkDao(
private val db: Conferences4HallDatabase,
private val lyricist: Lyricist<Strings>,
private val dispatcher: CoroutineContext
) {
fun fetchTalk(eventId: String, talkId: String): Flow<TalkUi> = db.transactionWithResult {
Expand All @@ -29,7 +32,7 @@ class TalkDao(
.asFlow()
.mapToOne(dispatcher),
transform = { speakers, openfeedback, talk ->
talk.convertTalkUi(speakers, openfeedback)
talk.convertTalkUi(speakers, openfeedback, lyricist.strings)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,7 @@ import kotlinx.datetime.Clock
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toInstant
import kotlinx.datetime.toLocalDateTime
import org.gdglille.devfest.android.shared.resources.Resource
import org.gdglille.devfest.android.shared.resources.text_level_advanced
import org.gdglille.devfest.android.shared.resources.text_level_beginner
import org.gdglille.devfest.android.shared.resources.text_level_intermediate
import org.gdglille.devfest.android.shared.resources.text_schedule_minutes
import org.gdglille.devfest.android.shared.resources.text_speakers_list_many
import org.gdglille.devfest.android.shared.resources.text_speakers_list_one
import org.gdglille.devfest.android.shared.resources.title_agenda_break
import org.gdglille.devfest.android.shared.resources.Strings
import org.gdglille.devfest.db.SelectBreakSessions
import org.gdglille.devfest.db.SelectCategories
import org.gdglille.devfest.db.SelectFormats
Expand All @@ -32,8 +25,6 @@ import org.gdglille.devfest.models.ui.CategoryUi
import org.gdglille.devfest.models.ui.FormatUi
import org.gdglille.devfest.models.ui.TalkItemUi
import org.gdglille.devfest.models.ui.TalkUi
import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.resources.getString

private const val BREAK_TITLE = "break"
private const val MaxSpeakersCount = 3
Expand Down Expand Up @@ -79,9 +70,9 @@ fun SelectFormats.convertFormatUi() = FormatUi(
time = time.toInt()
)

@OptIn(ExperimentalResourceApi::class)
suspend fun SelectSessions.convertTalkItemUi(
speakers: List<SelectSpeakersByTalkId>
fun SelectSessions.convertTalkItemUi(
speakers: List<SelectSpeakersByTalkId>,
strings: Strings
): TalkItemUi {
val startDateTime = start_time.toLocalDateTime()
val endDateTime = end_time.toLocalDateTime()
Expand All @@ -90,15 +81,10 @@ suspend fun SelectSessions.convertTalkItemUi(
val count = (speakers.size - MaxSpeakersCount).coerceAtLeast(minimumValue = 0)
val maxSpeakers = speakers.take(MaxSpeakersCount)
val speakersJoined = maxSpeakers.joinToString(", ") { it.display_name }
val speakersLabel = when (count) {
0 -> speakersJoined
1 -> getString(Resource.string.text_speakers_list_one, speakersJoined, count)
else -> getString(Resource.string.text_speakers_list_many, speakersJoined, count)
}
val level = when (level) {
"advanced" -> getString(Resource.string.text_level_advanced)
"intermediate" -> getString(Resource.string.text_level_intermediate)
"beginner" -> getString(Resource.string.text_level_beginner)
"advanced" -> strings.texts.levelAdvanced
"intermediate" -> strings.texts.levelIntermediate
"beginner" -> strings.texts.levelBeginner
else -> level
}
return TalkItemUi(
Expand All @@ -112,33 +98,32 @@ suspend fun SelectSessions.convertTalkItemUi(
startTime = start_time,
endTime = end_time,
timeInMinutes = timeInMinutes,
time = getString(Resource.string.text_schedule_minutes, timeInMinutes.toString()),
time = strings.texts.scheduleMinutes(timeInMinutes),
category = convertCategoryUi(),
speakers = maxSpeakers.map { it.display_name }.toImmutableList(),
speakersAvatar = maxSpeakers.map { it.photo_url }.toImmutableList(),
speakersLabel = speakersLabel,
speakersLabel = strings.texts.speakersList(count, speakersJoined),
isFavorite = is_favorite
)
}

@OptIn(ExperimentalResourceApi::class)
suspend fun SelectBreakSessions.convertTalkItemUi(): TalkItemUi {
fun SelectBreakSessions.convertTalkItemUi(strings: Strings): TalkItemUi {
val startDateTime = start_time.toLocalDateTime()
val endDateTime = end_time.toLocalDateTime()
val diff = endDateTime.toInstant(TimeZone.UTC).minus(startDateTime.toInstant(TimeZone.UTC))
val timeInMinutes = diff.inWholeMinutes.toInt()
return TalkItemUi(
id = id,
order = order_.toInt(),
title = getString(Resource.string.title_agenda_break),
title = strings.titles.agendaBreak,
abstract = "",
room = room,
level = null,
slotTime = startDateTime.formatHoursMinutes(),
startTime = start_time,
endTime = end_time,
timeInMinutes = timeInMinutes,
time = getString(Resource.string.text_schedule_minutes, timeInMinutes.toString()),
time = strings.texts.scheduleMinutes(timeInMinutes),
category = convertCategoryUi(),
speakers = persistentListOf(),
speakersAvatar = persistentListOf(),
Expand All @@ -147,10 +132,10 @@ suspend fun SelectBreakSessions.convertTalkItemUi(): TalkItemUi {
)
}

@OptIn(ExperimentalResourceApi::class)
suspend fun SelectTalksBySpeakerId.convertTalkItemUi(
fun SelectTalksBySpeakerId.convertTalkItemUi(
session: SelectSessionByTalkId,
speakers: List<SelectSpeakersByTalkId>
speakers: List<SelectSpeakersByTalkId>,
strings: Strings
): TalkItemUi {
val startTime = session.start_time.toLocalDateTime()
val endTime = session.end_time.toLocalDateTime()
Expand All @@ -159,15 +144,10 @@ suspend fun SelectTalksBySpeakerId.convertTalkItemUi(
val count = (speakers.size - MaxSpeakersCount).coerceAtLeast(minimumValue = 0)
val maxSpeakers = speakers.take(MaxSpeakersCount)
val speakersJoined = maxSpeakers.joinToString(", ") { it.display_name }
val speakersLabel = when (count) {
0 -> speakersJoined
1 -> getString(Resource.string.text_speakers_list_one, speakersJoined, count)
else -> getString(Resource.string.text_speakers_list_many, speakersJoined, count)
}
val level = when (level) {
"advanced" -> getString(Resource.string.text_level_advanced)
"intermediate" -> getString(Resource.string.text_level_intermediate)
"beginner" -> getString(Resource.string.text_level_beginner)
"advanced" -> strings.texts.levelAdvanced
"intermediate" -> strings.texts.levelIntermediate
"beginner" -> strings.texts.levelBeginner
else -> level
}
return TalkItemUi(
Expand All @@ -181,18 +161,19 @@ suspend fun SelectTalksBySpeakerId.convertTalkItemUi(
startTime = session.start_time,
endTime = session.end_time,
timeInMinutes = timeInMinutes,
time = getString(Resource.string.text_schedule_minutes, timeInMinutes.toString()),
time = strings.texts.scheduleMinutes(timeInMinutes),
category = convertCategoryUi(),
speakers = maxSpeakers.map { it.display_name }.toImmutableList(),
speakersAvatar = maxSpeakers.map { it.photo_url }.toImmutableList(),
speakersLabel = speakersLabel,
speakersLabel = strings.texts.speakersList(count, speakersJoined),
isFavorite = session.is_favorite
)
}

suspend fun SelectSessionByTalkId.convertTalkUi(
fun SelectSessionByTalkId.convertTalkUi(
speakers: List<SelectSpeakersByTalkId>,
openfeedbackProjectId: SelectOpenfeedbackProjectId
openfeedbackProjectId: SelectOpenfeedbackProjectId,
strings: Strings
): TalkUi {
val now = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
val startTime = start_time.toLocalDateTime()
Expand All @@ -207,7 +188,7 @@ suspend fun SelectSessionByTalkId.convertTalkUi(
endTime = endTime.formatHoursMinutes(),
timeInMinutes = diff.inWholeMinutes.toInt(),
room = room,
speakers = speakers.map { it.convertSpeakerItemUi() }.toImmutableList(),
speakers = speakers.map { it.convertSpeakerItemUi(strings) }.toImmutableList(),
speakersSharing = speakers.joinToString(", ") { speaker ->
if (speaker.twitter == null) {
speaker.display_name
Expand Down
Loading

0 comments on commit 646a07c

Please sign in to comment.