enhancement: reply improvements (#231); closes #205, #214

* chore: open post detail from reply button; closes #214

* chore: indicate author of comments/posts; closes #205
This commit is contained in:
Diego Beraldin 2023-12-06 19:18:08 +01:00 committed by GitHub
parent 255a5a802c
commit b6b3468847
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 216 additions and 105 deletions

View File

@ -625,12 +625,16 @@ class CommunityDetailScreen(
)
}
},
onReply = rememberCallback(model) {
onReply = rememberCallback {
if (uiState.isLogged && !isOnOtherInstance) {
val screen = CreateCommentScreen(
originalPost = post,
model.reduce(
CommunityDetailMviModel.Intent.MarkAsRead(
post.id
)
)
navigationCoordinator.pushScreen(
PostDetailScreen(post),
)
navigationCoordinator.showBottomSheet(screen)
}
},
onImageClick = rememberCallbackArgs(model) { url ->

View File

@ -41,6 +41,8 @@ interface CreateCommentMviModel :
val loading: Boolean = false,
val section: CreatePostSection = CreatePostSection.Edit,
val autoLoadImages: Boolean = true,
val currentInstance: String = "",
val currentUser: String = "",
)
sealed interface Effect {

View File

@ -3,6 +3,7 @@ package com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
@ -39,6 +40,7 @@ import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
@ -269,19 +271,43 @@ class CreateCommentScreen(
)
}
}
if (uiState.currentUser.isNotEmpty()) {
Row(
modifier = Modifier.padding(
vertical = Spacing.xs,
horizontal = Spacing.l,
)
) {
Text(
text = buildString {
append(stringResource(MR.strings.post_reply_source_account))
append(" ")
append(uiState.currentUser)
if (uiState.currentInstance.isNotEmpty()) {
append("@")
append(uiState.currentInstance)
}
},
color = MaterialTheme.colorScheme.onBackground,
style = MaterialTheme.typography.labelSmall,
textDecoration = TextDecoration.Underline,
)
}
}
}
},
) { padding ->
val referenceModifier = Modifier.padding(
horizontal = Spacing.s,
vertical = Spacing.xxs,
)
LazyColumn(
modifier = Modifier.padding(padding),
) {
val referenceModifier = Modifier.padding(
horizontal = Spacing.s,
vertical = Spacing.xxs,
)
when {
originalComment != null -> {
item {
item {
when {
originalComment != null -> {
CommentCard(
modifier = referenceModifier,
comment = originalComment,
@ -302,10 +328,8 @@ class CreateCommentScreen(
)
Divider()
}
}
originalPost != null -> {
item {
originalPost != null -> {
PostCard(
modifier = referenceModifier,
postLayout = uiState.postLayout,

View File

@ -9,6 +9,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.Sett
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommentRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PostRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository
import com.github.diegoberaldin.raccoonforlemmy.resources.MR.strings.message_missing_field
import dev.icerock.moko.resources.desc.desc
import kotlinx.coroutines.Dispatchers
@ -25,6 +26,7 @@ class CreateCommentViewModel(
private val identityRepository: IdentityRepository,
private val commentRepository: CommentRepository,
private val postRepository: PostRepository,
private val siteRepository: SiteRepository,
private val themeRepository: ThemeRepository,
private val settingsRepository: SettingsRepository,
private val notificationCenter: NotificationCenter,
@ -37,6 +39,18 @@ class CreateCommentViewModel(
themeRepository.postLayout.onEach { layout ->
mvi.updateState { it.copy(postLayout = layout) }
}.launchIn(this)
if (uiState.value.currentUser.isEmpty()) {
val auth = identityRepository.authToken.value.orEmpty()
val currentUser = siteRepository.getCurrentUser(auth)
if (currentUser != null) {
mvi.updateState {
it.copy(
currentUser = currentUser.name,
currentInstance = currentUser.host,
)
}
}
}
settingsRepository.currentSettings.onEach { settings ->
mvi.updateState {
it.copy(

View File

@ -68,6 +68,8 @@ interface CreatePostMviModel :
val fullHeightImages: Boolean = true,
val voteFormat: VoteFormat = VoteFormat.Aggregated,
val autoLoadImages: Boolean = true,
val currentInstance: String = "",
val currentUser: String = "",
)
sealed interface Effect {

View File

@ -47,6 +47,7 @@ import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
@ -462,6 +463,30 @@ class CreatePostScreen(
autoLoadImages = uiState.autoLoadImages,
)
}
if (uiState.currentUser.isNotEmpty()) {
Row(
modifier = Modifier.padding(
vertical = Spacing.xs,
horizontal = Spacing.l,
)
) {
Text(
text = buildString {
append(stringResource(MR.strings.post_reply_source_account))
append(" ")
append(uiState.currentUser)
if (uiState.currentInstance.isNotEmpty()) {
append("@")
append(uiState.currentInstance)
}
},
color = MaterialTheme.colorScheme.onBackground,
style = MaterialTheme.typography.labelSmall,
textDecoration = TextDecoration.Underline,
)
}
}
}
}

View File

@ -7,6 +7,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.Sett
import com.github.diegoberaldin.raccoonforlemmy.core.utils.StringUtils.isValidUrl
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PostRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository
import com.github.diegoberaldin.raccoonforlemmy.resources.MR.strings.message_invalid_field
import com.github.diegoberaldin.raccoonforlemmy.resources.MR.strings.message_missing_field
import dev.icerock.moko.resources.desc.desc
@ -21,6 +22,7 @@ class CreatePostViewModel(
private val mvi: DefaultMviModel<CreatePostMviModel.Intent, CreatePostMviModel.UiState, CreatePostMviModel.Effect>,
private val identityRepository: IdentityRepository,
private val postRepository: PostRepository,
private val siteRepository: SiteRepository,
private val themeRepository: ThemeRepository,
private val settingsRepository: SettingsRepository,
) : CreatePostMviModel,
@ -41,6 +43,18 @@ class CreatePostViewModel(
)
}
}.launchIn(this)
if (uiState.value.currentUser.isEmpty()) {
val auth = identityRepository.authToken.value.orEmpty()
val currentUser = siteRepository.getCurrentUser(auth)
if (currentUser != null) {
mvi.updateState {
it.copy(
currentUser = currentUser.name,
currentInstance = currentUser.host,
)
}
}
}
}
}

View File

@ -129,6 +129,7 @@ val commonUiModule = module {
identityRepository = get(),
commentRepository = get(),
postRepository = get(),
siteRepository = get(),
themeRepository = get(),
settingsRepository = get(),
notificationCenter = get(),
@ -140,6 +141,7 @@ val commonUiModule = module {
editedPostId = params[0],
identityRepository = get(),
postRepository = get(),
siteRepository = get(),
themeRepository = get(),
settingsRepository = get(),
)

View File

@ -73,6 +73,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotific
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommentModel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType
@ -168,34 +169,30 @@ class SavedItemsScreen : Screen {
targetOffsetY = { it * 2 },
),
) {
FloatingActionButtonMenu(
items = buildList {
this += FloatingActionButtonMenuItem(
icon = Icons.Default.ExpandLess,
text = stringResource(MR.strings.action_back_to_top),
onSelected = rememberCallback {
scope.launch {
lazyListState.scrollToItem(0)
topAppBarState.heightOffset = 0f
topAppBarState.contentOffset = 0f
}
},
)
}
)
FloatingActionButtonMenu(items = buildList {
this += FloatingActionButtonMenuItem(
icon = Icons.Default.ExpandLess,
text = stringResource(MR.strings.action_back_to_top),
onSelected = rememberCallback {
scope.launch {
lazyListState.scrollToItem(0)
topAppBarState.heightOffset = 0f
topAppBarState.contentOffset = 0f
}
},
)
})
}
},
) { paddingValues ->
Column(
modifier = Modifier.padding(paddingValues)
.let {
if (settings.hideNavigationBarWhileScrolling) {
it.nestedScroll(scrollBehavior.nestedScrollConnection)
} else {
it
}
modifier = Modifier.padding(paddingValues).let {
if (settings.hideNavigationBarWhileScrolling) {
it.nestedScroll(scrollBehavior.nestedScrollConnection)
} else {
it
}
.nestedScroll(fabNestedScrollConnection),
}.nestedScroll(fabNestedScrollConnection),
verticalArrangement = Arrangement.spacedBy(Spacing.s),
) {
SectionSelector(
@ -223,8 +220,7 @@ class SavedItemsScreen : Screen {
},
)
Box(
modifier = Modifier.fillMaxWidth()
.pullRefresh(pullRefreshState),
modifier = Modifier.fillMaxWidth().pullRefresh(pullRefreshState),
) {
LazyColumn(
state = lazyListState,
@ -239,22 +235,22 @@ class SavedItemsScreen : Screen {
voteFormat = uiState.voteFormat,
autoLoadImages = uiState.autoLoadImages,
blurNsfw = uiState.blurNsfw,
onClick = {
onClick = rememberCallback {
navigatorCoordinator.pushScreen(
PostDetailScreen(post),
)
},
onOpenCommunity = { community ->
onOpenCommunity = rememberCallbackArgs { community ->
navigatorCoordinator.pushScreen(
CommunityDetailScreen(community),
)
},
onOpenCreator = { u ->
onOpenCreator = rememberCallbackArgs { u ->
if (u.id != uiState.user?.id) {
navigatorCoordinator.pushScreen(UserDetailScreen(u))
}
},
onUpVote = {
onUpVote = rememberCallback(model) {
model.reduce(
SavedItemsMviModel.Intent.UpVotePost(
id = post.id,
@ -262,7 +258,7 @@ class SavedItemsScreen : Screen {
),
)
},
onDownVote = {
onDownVote = rememberCallback(model) {
model.reduce(
SavedItemsMviModel.Intent.DownVotePost(
id = post.id,
@ -270,7 +266,7 @@ class SavedItemsScreen : Screen {
),
)
},
onSave = {
onSave = rememberCallback(model) {
model.reduce(
SavedItemsMviModel.Intent.SavePost(
id = post.id,
@ -278,13 +274,12 @@ class SavedItemsScreen : Screen {
),
)
},
onReply = {
val screen = CreateCommentScreen(
originalPost = post,
onReply = rememberCallback {
navigationCoordinator.pushScreen(
PostDetailScreen(post),
)
navigatorCoordinator.showBottomSheet(screen)
},
onImageClick = { url ->
onImageClick = rememberCallbackArgs { url ->
navigatorCoordinator.pushScreen(
ZoomableImageScreen(url),
)
@ -483,8 +478,7 @@ class SavedItemsScreen : Screen {
if (rawContent != null) {
when (val content = rawContent) {
is PostModel -> {
RawContentDialog(
title = content.title,
RawContentDialog(title = content.title,
date = content.publishDate,
url = content.url,
text = content.text,
@ -494,44 +488,32 @@ class SavedItemsScreen : Screen {
onQuote = { quotation ->
rawContent = null
if (quotation != null) {
val screen =
CreateCommentScreen(
originalPost = content,
initialText = buildString {
append("> ")
append(quotation)
append("\n\n")
}
)
val screen = CreateCommentScreen(originalPost = content,
initialText = buildString {
append("> ")
append(quotation)
append("\n\n")
})
navigationCoordinator.showBottomSheet(screen)
}
}
)
})
}
is CommentModel -> {
RawContentDialog(
text = content.text,
date = content.publishDate,
onDismiss = {
rawContent = null
},
onQuote = { quotation ->
rawContent = null
if (quotation != null) {
val screen =
CreateCommentScreen(
originalComment = content,
initialText = buildString {
append("> ")
append(quotation)
append("\n\n")
}
)
navigationCoordinator.showBottomSheet(screen)
}
RawContentDialog(text = content.text, date = content.publishDate, onDismiss = {
rawContent = null
}, onQuote = { quotation ->
rawContent = null
if (quotation != null) {
val screen = CreateCommentScreen(originalComment = content,
initialText = buildString {
append("> ")
append(quotation)
append("\n\n")
})
navigationCoordinator.showBottomSheet(screen)
}
)
})
}
}
}

View File

@ -523,10 +523,9 @@ class UserDetailScreen(
null
} else {
rememberCallback {
val screen = CreateCommentScreen(
originalPost = post,
navigationCoordinator.pushScreen(
PostDetailScreen(post),
)
navigationCoordinator.showBottomSheet(screen)
}
},
onImageClick = rememberCallbackArgs { url ->

View File

@ -421,9 +421,10 @@ class PostListScreen : Screen {
},
onReply = rememberCallback(model) {
if (uiState.isLogged) {
val screen =
CreateCommentScreen(originalPost = post)
navigationCoordinator.showBottomSheet(screen)
model.reduce(PostListMviModel.Intent.MarkAsRead(post.id))
navigationCoordinator.pushScreen(
PostDetailScreen(post),
)
}
},
onImageClick = rememberCallbackArgs(model, post) { url ->

View File

@ -217,6 +217,11 @@ internal object ProfileLoggedScreen : Tab {
)
)
},
onReply = rememberCallback {
navigationCoordinator.pushScreen(
PostDetailScreen(post),
)
},
options = buildList {
add(
Option(
@ -341,6 +346,14 @@ internal object ProfileLoggedScreen : Tab {
)
)
},
onReply = rememberCallback {
navigationCoordinator.pushScreen(
PostDetailScreen(
post = PostModel(id = comment.postId),
highlightCommentId = comment.id,
),
)
},
options = buildList {
add(
Option(

View File

@ -425,10 +425,9 @@ class ExploreScreen : Screen {
},
onReply = rememberCallback {
if (uiState.isLogged) {
val screen = CreateCommentScreen(
originalPost = result.model,
navigationCoordinator.pushScreen(
PostDetailScreen(result.model),
)
navigationCoordinator.showBottomSheet(screen)
}
},
onImageClick = rememberCallbackArgs { url ->

View File

@ -65,7 +65,6 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.OptionI
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.PostCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.PostCardPlaceholder
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.SwipeableCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment.CreateCommentScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createreport.CreateReportScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getFabNestedScrollConnection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.image.ZoomableImageScreen
@ -79,6 +78,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommu
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.getAdditionalLabel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toIcon
import com.github.diegoberaldin.raccoonforlemmy.feature.search.di.getMultiCommunityViewModel
@ -302,7 +302,7 @@ class MultiCommunityScreen(
voteFormat = uiState.voteFormat,
autoLoadImages = uiState.autoLoadImages,
blurNsfw = uiState.blurNsfw,
onClick = {
onClick = rememberCallback {
model.reduce(MultiCommunityMviModel.Intent.MarkAsRead(post.id))
navigationCoordinator.pushScreen(
PostDetailScreen(post),
@ -320,17 +320,17 @@ class MultiCommunityScreen(
)
}
},
onOpenCommunity = { community ->
onOpenCommunity = rememberCallbackArgs { community ->
navigationCoordinator.pushScreen(
CommunityDetailScreen(community),
)
},
onOpenCreator = { user ->
onOpenCreator = rememberCallbackArgs { user ->
navigationCoordinator.pushScreen(
UserDetailScreen(user),
)
},
onUpVote = {
onUpVote = rememberCallback(model) {
model.reduce(
MultiCommunityMviModel.Intent.UpVotePost(
id = post.id,
@ -338,7 +338,7 @@ class MultiCommunityScreen(
),
)
},
onDownVote = {
onDownVote = rememberCallback(model) {
model.reduce(
MultiCommunityMviModel.Intent.DownVotePost(
id = post.id,
@ -346,7 +346,7 @@ class MultiCommunityScreen(
),
)
},
onSave = {
onSave = rememberCallback(model) {
model.reduce(
MultiCommunityMviModel.Intent.SavePost(
id = post.id,
@ -354,13 +354,12 @@ class MultiCommunityScreen(
),
)
},
onReply = {
val screen = CreateCommentScreen(
originalPost = post,
onReply = rememberCallback {
navigationCoordinator.pushScreen(
PostDetailScreen(post),
)
navigationCoordinator.showBottomSheet(screen)
},
onImageClick = { url ->
onImageClick = rememberCallbackArgs { url ->
model.reduce(MultiCommunityMviModel.Intent.MarkAsRead(post.id))
navigationCoordinator.pushScreen(
ZoomableImageScreen(url),

View File

@ -249,4 +249,5 @@
<string name="settings_vote_format_separated">متفرق</string>
<string name="settings_vote_format_percentage">نسبة مئوية</string>
<string name="settings_font_family_default">نظام</string>
<string name="post_reply_source_account">بواسطة:</string>
</resources>

View File

@ -280,4 +280,5 @@
<string name="settings_vote_format_separated">Separate</string>
<string name="settings_vote_format_percentage">Percentage</string>
<string name="settings_font_family_default">System</string>
<string name="post_reply_source_account">by:</string>
</resources>

View File

@ -259,4 +259,5 @@
<string name="settings_vote_format_separated">Отделно</string>
<string name="settings_vote_format_percentage">Процент</string>
<string name="settings_font_family_default">Система</string>
<string name="post_reply_source_account">от:</string>
</resources>

View File

@ -251,4 +251,5 @@
<string name="settings_vote_format_separated">Samostatný</string>
<string name="settings_vote_format_percentage">Procento</string>
<string name="settings_font_family_default">Systém</string>
<string name="post_reply_source_account">podle:</string>
</resources>

View File

@ -251,4 +251,5 @@
<string name="settings_vote_format_separated">Adskille</string>
<string name="settings_vote_format_percentage">Procent</string>
<string name="settings_font_family_default">System</string>
<string name="post_reply_source_account">ved:</string>
</resources>

View File

@ -257,4 +257,5 @@
<string name="settings_vote_format_separated">Separate</string>
<string name="settings_vote_format_percentage">Prozentsatz</string>
<string name="settings_font_family_default">System</string>
<string name="post_reply_source_account">von:</string>
</resources>

View File

@ -260,4 +260,5 @@
<string name="settings_vote_format_separated">Ξεχωριστό</string>
<string name="settings_vote_format_percentage">Ποσοστό</string>
<string name="settings_font_family_default">Σύστημα</string>
<string name="post_reply_source_account">από:</string>
</resources>

View File

@ -250,4 +250,5 @@
<string name="settings_vote_format_separated">Apartigite</string>
<string name="settings_vote_format_percentage">Procento</string>
<string name="settings_font_family_default">Sistemo</string>
<string name="post_reply_source_account">de:</string>
</resources>

View File

@ -255,4 +255,5 @@
<string name="settings_vote_format_separated">Separado</string>
<string name="settings_vote_format_percentage">Porcentaje</string>
<string name="settings_font_family_default">Sistema</string>
<string name="post_reply_source_account">por:</string>
</resources>

View File

@ -251,4 +251,5 @@
<string name="settings_vote_format_separated">Eraldi</string>
<string name="settings_vote_format_percentage">Protsent</string>
<string name="settings_font_family_default">Süsteem</string>
<string name="post_reply_source_account">kõrval:</string>
</resources>

View File

@ -251,4 +251,5 @@
<string name="settings_vote_format_separated">Erillinen</string>
<string name="settings_vote_format_percentage">Prosenttiosuus</string>
<string name="settings_font_family_default">Järjestelmä</string>
<string name="post_reply_source_account">kirjoittaja:</string>
</resources>

View File

@ -254,4 +254,5 @@
<string name="settings_vote_format_separated">Séparé</string>
<string name="settings_vote_format_percentage">Pourcentage</string>
<string name="settings_font_family_default">Système</string>
<string name="post_reply_source_account">par:</string>
</resources>

View File

@ -260,4 +260,5 @@
<string name="settings_vote_format_separated">Scartha</string>
<string name="settings_vote_format_percentage">Céatadán</string>
<string name="settings_font_family_default">Córas</string>
<string name="post_reply_source_account">le:</string>
</resources>

View File

@ -256,4 +256,5 @@
<string name="settings_vote_format_separated">Odvojeni</string>
<string name="settings_vote_format_percentage">Postotak</string>
<string name="settings_font_family_default">Sustav</string>
<string name="post_reply_source_account">po:</string>
</resources>

View File

@ -255,4 +255,5 @@
<string name="settings_vote_format_separated">Különálló</string>
<string name="settings_vote_format_percentage">Százalék</string>
<string name="settings_font_family_default">Rendszer</string>
<string name="post_reply_source_account">által:</string>
</resources>

View File

@ -255,4 +255,5 @@
<string name="settings_vote_format_separated">Separato</string>
<string name="settings_vote_format_percentage">Percentuale</string>
<string name="settings_font_family_default">Sistema</string>
<string name="post_reply_source_account">da:</string>
</resources>

View File

@ -253,4 +253,5 @@
<string name="settings_vote_format_separated">Atskirai</string>
<string name="settings_vote_format_percentage">Procentas</string>
<string name="settings_font_family_default">Sistema</string>
<string name="post_reply_source_account">pateikė:</string>
</resources>

View File

@ -255,4 +255,5 @@
<string name="settings_vote_format_separated">Atsevišķi</string>
<string name="settings_vote_format_percentage">Procenti</string>
<string name="settings_font_family_default">Sistēma</string>
<string name="post_reply_source_account">autors:</string>
</resources>

View File

@ -256,4 +256,5 @@
<string name="settings_vote_format_separated">Separati</string>
<string name="settings_vote_format_percentage">Persentaġġ</string>
<string name="settings_font_family_default">Sistema</string>
<string name="post_reply_source_account">minn:</string>
</resources>

View File

@ -254,4 +254,5 @@
<string name="settings_vote_format_separated">Verschillend</string>
<string name="settings_vote_format_percentage">Percentage</string>
<string name="settings_font_family_default">Systeem</string>
<string name="post_reply_source_account">door:</string>
</resources>

View File

@ -253,4 +253,5 @@
<string name="settings_vote_format_separated">Skille</string>
<string name="settings_vote_format_percentage">Prosentdel</string>
<string name="settings_font_family_default">System</string>
<string name="post_reply_source_account">av:</string>
</resources>

View File

@ -254,4 +254,5 @@
<string name="settings_vote_format_separated">Oddzielny</string>
<string name="settings_vote_format_percentage">Odsetek</string>
<string name="settings_font_family_default">System</string>
<string name="post_reply_source_account">przez:</string>
</resources>

View File

@ -253,4 +253,5 @@
<string name="settings_vote_format_separated">Separado</string>
<string name="settings_vote_format_percentage">Percentagem</string>
<string name="settings_font_family_default">Sistema</string>
<string name="post_reply_source_account">por:</string>
</resources>

View File

@ -252,4 +252,5 @@
<string name="settings_vote_format_separated">Separat</string>
<string name="settings_vote_format_percentage">Procent</string>
<string name="settings_font_family_default">Sistem</string>
<string name="post_reply_source_account">de:</string>
</resources>

View File

@ -254,4 +254,5 @@
<string name="settings_vote_format_separated">Отдельно</string>
<string name="settings_vote_format_percentage">Процент</string>
<string name="settings_font_family_default">Система</string>
<string name="post_reply_source_account">к:</string>
</resources>

View File

@ -252,4 +252,5 @@
<string name="settings_vote_format_separated">Separat</string>
<string name="settings_vote_format_percentage">Procentsats</string>
<string name="settings_font_family_default">Systemet</string>
<string name="post_reply_source_account">förbi:</string>
</resources>

View File

@ -253,4 +253,5 @@
<string name="settings_vote_format_separated">Samostatné</string>
<string name="settings_vote_format_percentage">Percento</string>
<string name="settings_font_family_default">Systém</string>
<string name="post_reply_source_account">od:</string>
</resources>

View File

@ -251,4 +251,5 @@
<string name="settings_vote_format_separated">Ločeno</string>
<string name="settings_vote_format_percentage">Odstotek</string>
<string name="settings_font_family_default">Sistem</string>
<string name="post_reply_source_account">avtor:</string>
</resources>

View File

@ -257,4 +257,5 @@
<string name="settings_vote_format_separated">Të ndara</string>
<string name="settings_vote_format_percentage">Përqindje</string>
<string name="settings_font_family_default">Sistemi</string>
<string name="post_reply_source_account">nga:</string>
</resources>

View File

@ -254,4 +254,5 @@
<string name="settings_vote_format_separated">Ayırmak</string>
<string name="settings_vote_format_percentage">Yüzde</string>
<string name="settings_font_family_default">Sistem</string>
<string name="post_reply_source_account">ile:</string>
</resources>

View File

@ -253,4 +253,5 @@
<string name="settings_vote_format_separated">Відокремлення</string>
<string name="settings_vote_format_percentage">Відсотки</string>
<string name="settings_font_family_default">Система</string>
<string name="post_reply_source_account">від:</string>
</resources>