diff --git a/core/commonui/modals/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/modals/LanguageBottomSheet.kt b/core/commonui/modals/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/modals/LanguageBottomSheet.kt index 9d6e09a5a..2a65d1f4b 100644 --- a/core/commonui/modals/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/modals/LanguageBottomSheet.kt +++ b/core/commonui/modals/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/modals/LanguageBottomSheet.kt @@ -84,6 +84,7 @@ class LanguageBottomSheet : Screen { Locales.TOK, Locales.TR, Locales.UK, + Locales.ZH_CN, Locales.ZH_TW, Locales.ZH_HK, ) diff --git a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/DefaultStrings.kt b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/DefaultStrings.kt index 4ebf15c3b..dda8446c8 100644 --- a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/DefaultStrings.kt +++ b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/DefaultStrings.kt @@ -431,8 +431,9 @@ internal open class DefaultStrings : Strings { override val settingsItemAlternateMarkdownRendering = "Enable alternate Markdown rendering" override val settingsItemConfigureBottomNavigationBar = "Configure bottom navigation bar" override val selectTabNavigationTitle = "Select a section" - override val messageAuthIssueSegue = - "You could try one of the following actions:\n• force refresh\n• log in again\n• clear the application data" - override val messageAuthIssueSegueHighlight1 = "force refresh" - override val messageAuthIssueSegueHighlight2 = "log in again" + override val messageAuthIssueSegue0 = + "You could try one of the following actions:" + override val messageAuthIssueSegue1 = "force refresh" + override val messageAuthIssueSegue2 = "log in again" + override val messageAuthIssueSegue3 = "clear the application data" } diff --git a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/EsStrings.kt b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/EsStrings.kt index 644c10618..fa1489d5b 100644 --- a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/EsStrings.kt +++ b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/EsStrings.kt @@ -106,7 +106,8 @@ internal val EsStrings = override val manageAccountsTitle = "Gestionar cuentas" override val manageSubscriptionsHeaderMulticommunities = "Multi-comunidades" override val manageSubscriptionsHeaderSubscriptions = "Suscripciones" - override val messageEmptyComments = "Nada que ver por aquí.\n¡Sé el primero en comentar!" + override val messageEmptyComments = + "Aquí hay demasiado silencio.\n¿Te gustaría ser el primero en comentar?" override val messageEmptyList = "Ningún elemento para mostrar" override val messageErrorLoadingComments = "Error al cargar los comentarios." override val messageGenericError = "Error" @@ -336,7 +337,7 @@ internal val EsStrings = override val moderatorZoneTitle = "Herramientas para moderadores" override val moderatorZoneActionContents = "Contenidos por moderar" override val messageAuthIssue = - "Se produjo un error al obtener los datos del usuario, intente actualizar la pantalla" + "Se ha producido un error al obtener los datos, posiblemente tu token ha caducado." override val banReasonPlaceholder = "Razón (opcional)" override val banItemPermanent = "Prohibición permanente" override val banItemRemoveData = "Eliminar datos" @@ -445,4 +446,9 @@ internal val EsStrings = override val settingsItemConfigureBottomNavigationBar = "Configurar la barra de navegación inferior" override val selectTabNavigationTitle = "Seleccionar una sección" + override val messageAuthIssueSegue0 = + "Puedes intentar una de las siguientes acciones:" + override val messageAuthIssueSegue1 = "forzar actualización" + override val messageAuthIssueSegue2 = "volver a iniciar sesión" + override val messageAuthIssueSegue3 = "borrar los datos de la aplicación" } diff --git a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ItStrings.kt b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ItStrings.kt index 1a73c45b4..267649634 100644 --- a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ItStrings.kt +++ b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ItStrings.kt @@ -337,7 +337,7 @@ internal val ItStrings = override val moderatorZoneTitle = "Strumenti per moderatori" override val moderatorZoneActionContents = "Contenuti da moderare" override val messageAuthIssue = - "Si è verificato un errore nel recupero dei dati utente, fare refresh della schermata" + "Si è verificato un errore nel recupero dei dati, è possibile che il token attuale sia scaduto." override val banReasonPlaceholder = "Motivazione (opzionale)" override val banItemPermanent = "Ban permanente" override val banItemRemoveData = "Rimuovi dati" @@ -442,4 +442,12 @@ internal val ItStrings = "Se un post ha un URL, apri pagina web al click sull\'immagine" override val settingsItemAlternateMarkdownRendering = "Abilita rendering Markdown alternativo" + override val selectTabNavigationTitle = "Seleziona una sezione" + override val settingsItemConfigureBottomNavigationBar = + "Configura barra di navigazione inferiore" + override val messageAuthIssueSegue0 = + "Si consiglia di intraprendere una delle seguenti azioni:" + override val messageAuthIssueSegue1 = "forzare l\'aggiornamento" + override val messageAuthIssueSegue2 = "effettuare nuovamente l\'accesso" + override val messageAuthIssueSegue3 = " cancellare i dati dell\'applicazione" } diff --git a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/Strings.kt b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/Strings.kt index fe8238460..583da4a67 100644 --- a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/Strings.kt +++ b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/Strings.kt @@ -429,9 +429,10 @@ interface Strings { val settingsItemAlternateMarkdownRendering: String val settingsItemConfigureBottomNavigationBar: String val selectTabNavigationTitle: String - val messageAuthIssueSegue: String - val messageAuthIssueSegueHighlight1: String - val messageAuthIssueSegueHighlight2: String + val messageAuthIssueSegue0: String + val messageAuthIssueSegue1: String + val messageAuthIssueSegue2: String + val messageAuthIssueSegue3: String } object Locales { @@ -470,6 +471,7 @@ object Locales { const val NB = "nb" const val NN = "nn" const val MT = "mt" + const val ZH_CN = "zh_CN" const val ZH_TW = "zh_TW" const val ZH_HK = "zh_HK" } @@ -511,6 +513,7 @@ internal val localizableStrings: Map = Locales.TOK to TokStrings, Locales.TR to TrStrings, Locales.UK to UkStrings, + Locales.ZH_CN to ZhCnStrings, Locales.ZH_HK to ZhHkStrings, Locales.ZH_TW to ZhTwStrings, ) diff --git a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/TokStrings.kt b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/TokStrings.kt index 141586a6f..5dcda9afe 100644 --- a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/TokStrings.kt +++ b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/TokStrings.kt @@ -335,7 +335,7 @@ internal val TokStrings = override val moderatorZoneTitle = "ilo tawa jan lawa" override val moderatorZoneActionContents = "ijo pi kulupu lawa" override val messageAuthIssue = - "kama sona ijo la, pakala wan li lon. o lukin open e lipu ni lon tenpo nanpa tu" + "kama sona ijo la, pakala li lon. ken la, toki lawa sina li weka." override val banReasonPlaceholder = "Tan (sina wile la)" override val banItemPermanent = "lon tenpo ale" override val banItemRemoveData = "o weka e sona" @@ -427,4 +427,16 @@ internal val TokStrings = "o kepeken e sitelen jan tawa sitelen lili pi linja anpa" override val settingsItemRandomThemeColor = "o ante e kule lon tempo ale" override val settingsSubtitleRandomThemeColor = "open e ilo nanpa ni la, o ante e kule" + override val settingsItemOpenPostWebPageOnImageClick = + "sina luka e sitelen lipu la, o open e linluwi" + override val settingsSubtitleOpenPostWebPageOnImageClick = + "lipu li jo e sitelen wan la, luka e sitelen la, o open e linluwi" + override val settingsItemAlternateMarkdownRendering = + "o kepeken e nanpa ante pi ilo Makadon" + override val settingsItemConfigureBottomNavigationBar = "o ante e lukin pi linja anpa" + override val selectTabNavigationTitle = "o anu e ijo wan" + override val messageAuthIssueSegue0 = "sina ken lukin e ni:" + override val messageAuthIssueSegue1 = "o kama sona lon tenpo nanpa tu" + override val messageAuthIssueSegue2 = "o tawa insa lon tenpo nanpa tu" + override val messageAuthIssueSegue3 = "o weka e sona pi ilo nanpa ni" } diff --git a/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ZhCnStrings.kt b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ZhCnStrings.kt new file mode 100644 index 000000000..3a8ab280b --- /dev/null +++ b/core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/ZhCnStrings.kt @@ -0,0 +1,124 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.l10n.messages + +internal val ZhCnStrings = + object : DefaultStrings() { + override val actionBackToTop = "回到顶部" + override val actionChat = "发送消息" + override val actionClearRead = "清除已读" + override val actionCreatePost = "发新帖" + override val actionReply = "回复" + override val actionDeactivateZombieMode = "关闭僵尸模式" + override val buttonClose = "关闭" + override val buttonConfirm = "确定" + override val buttonLoad = "加载" + override val buttonReset = "重设" + override val buttonRetry = "重试" + override val commentActionDelete = "删除" + override val communityDetailBlock = "屏蔽" + override val communityDetailBlockInstance = "屏蔽实例" + override val communityDetailInfo = "社区信息" + override val communityInfoDailyActiveUsers = "活跃用户(日)" + override val communityInfoMonthlyActiveUsers = "活跃用户(月)" + override val communityInfoPosts = "帖子" + override val communityInfoSubscribers = "订阅者" + override val communityInfoWeeklyActiveUsers = "活跃用户(周)" + override val createCommentBody = "评论内容" + override val createCommentTitle = "新评论" + override val createPostBody = "帖子内容" + override val createPostCommunity = "社区" + override val createPostCrossPostText = "重发自:" + override val createPostName = "帖子标题" + override val createPostNsfw = "工作场所不宜" + override val createPostTabEditor = "编辑器" + override val createPostTabPreview = "预览" + override val createPostTitle = "新帖子" + override val createPostUrl = "网址" + override val createReportPlaceholder = "举报内容(可选)" + override val createReportTitleComment = "举报评论" + override val createReportTitlePost = "举报帖子" + override val dialogRawContentText = "文本" + override val dialogRawContentTitle = "标题" + override val dialogRawContentUrl = "网址" + override val dialogTitleChangeInstance = "更改实例" + override val dialogTitleRawContent = "原始内容" + override val dialogTitleSelectCommunity = "选择社区" + override val editPostTitle = "编辑帖子" + override val exploreResultTypeAll = "全部" + override val exploreResultTypeComments = "评论" + override val exploreResultTypeCommunities = "社区" + override val exploreResultTypePosts = "帖子" + override val exploreResultTypeUsers = "用户" + override val exploreSearchPlaceholder = "搜索" + override val homeInstanceVia = "通过" + override val homeListingTitle = "信息流" + override val homeListingTypeAll = "全部" + override val homeListingTypeLocal = "本地" + override val homeListingTypeSubscribed = "已订阅" + override val homeSortTitle = "排序方式" + override val homeSortTypeActive = "活跃" + override val homeSortTypeControversial = "有争议" + override val homeSortTypeHot = "热门" + override val homeSortTypeMostComments = "最多评论" + override val homeSortTypeOld = "旧的" + override val homeSortTypeScaled = "按活跃比例" + override val homeSortTypeTop = "最热门" + override val homeSortTypeTop12Hours = "12 小时内最热门" + override val homeSortTypeTop12HoursShort = "12 小时" + override val homeSortTypeTop6Hours = "6 小时内最热门" + override val homeSortTypeTop6HoursShort = "6 小时" + override val homeSortTypeTopDayShort = "日" + override val homeSortTypeTopMonth = "本月最热门" + override val homeSortTypeTopMonthShort = "月" + override val homeSortTypeTopWeek = "本周最热门" + override val homeSortTypeTopWeekShort = "周" + override val homeSortTypeTopYear = "本年度最热门" + override val homeSortTypeTopYearShort = "年" + override val inboxChatMessage = "消息" + override val inboxItemMention = "在此处提到你:" + override val inboxItemReplyComment = "在此处回复了你的评论:" + override val inboxItemReplyPost = "在此处回复了你的帖子:" + override val inboxListingTypeAll = "全部" + override val inboxListingTypeTitle = "收件箱类型" + override val inboxListingTypeUnread = "未读" + override val inboxNotLoggedMessage = + "你尚未登录。\n请在个人资料页添加一个账户,以查看你的收件箱。" + override val inboxSectionMentions = "提及" + override val inboxSectionMessages = "消息" + override val inboxSectionReplies = "回复" + override val instanceDetailCommunities = "社区" + override val lang = "zh_CN" + override val loginFieldInstanceName = "实例名称" + override val loginFieldLabelOptional = "(可选)" + override val instanceDetailTitle = "实例:" + override val loginFieldPassword = "密码" + override val loginFieldToken = "TOTP 两步认证代码" + override val loginFieldUserName = "用户名(或电子邮件)" + override val manageAccountsButtonAdd = "添加账户" + override val manageAccountsTitle = "管理账户" + override val manageSubscriptionsHeaderMulticommunities = "多社区" + override val manageSubscriptionsHeaderSubscriptions = "订阅" + override val messageEmptyComments = "这里仍然静悄悄。\n你要做第一个评论的人吗?" + override val messageEmptyList = "没有可显示的东西" + override val messageErrorLoadingComments = "载入评论时出错。" + override val messageMissingField = "栏位尚未填写" + override val messageOperationSuccessful = "操作成功完成" + override val multiCommunityEditorCommunities = "社区" + override val multiCommunityEditorIcon = "图标" + override val multiCommunityEditorName = "名称" + override val multiCommunityEditorTitle = "多社区编辑器" + override val navigationDrawerAnonymous = "匿名" + override val navigationDrawerTitleBookmarks = "书签" + override val navigationDrawerTitleSubscriptions = "管理订阅" + override val actionActivateZombieMode = "开启僵尸模式" + override val communityInfoComments = "评论" + override val communityDetailInstanceInfo = "实例详情" + override val homeSortTypeNew = "新发布" + override val editCommentTitle = "编辑评论" + override val homeSortTypeNewComments = "新评论" + override val homeSortTypeTopDay = "本日最热门" + override val homeSortTypeTopHour = "小时最热门" + override val homeSortTypeTopHourShort = "1 小时" + override val messageImageLoadingError = "图片载入出错" + override val messageGenericError = "常规错误" + override val messageInvalidField = "无效字段" + } diff --git a/core/utils/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/utils/Extensions.kt b/core/utils/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/utils/Extensions.kt index 3cec2ed08..84e6f222c 100644 --- a/core/utils/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/utils/Extensions.kt +++ b/core/utils/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/utils/Extensions.kt @@ -49,6 +49,7 @@ fun String.toLanguageName() = Locales.TOK -> "toki pona" Locales.TR -> "Türkçe" Locales.UK -> "Українська" + Locales.ZH_CN -> "中文" Locales.ZH_TW -> "正體中文" Locales.ZH_HK -> "廣東話" else -> "English" @@ -92,6 +93,7 @@ fun String.toLanguageFlag(): AnnotatedString = Locales.TOK -> "🦝️" Locales.TR -> "🇹🇷" Locales.UK -> "🇺🇦" + Locales.ZH_CN -> "🇨🇳" Locales.ZH_TW -> "🇹🇼" Locales.ZH_HK -> "🇭🇰" else -> "" diff --git a/docs/acknowledgements.json b/docs/acknowledgements.json index 464360b3d..64105ac8b 100644 --- a/docs/acknowledgements.json +++ b/docs/acknowledgements.json @@ -76,5 +76,11 @@ "avatar": "https://avatars.githubusercontent.com/u/8885837?v=4", "subtitle": "Irish translation", "url": "https://github.com/aindriu80" + }, + { + "title": "Monstorix", + "avatar": "https://hosted.weblate.org/avatar/128/monstorix.png", + "subtitle": "Simplified Chinese translation", + "url": "https://hosted.weblate.org/user/monstorix" } ] diff --git a/scripts/convert_xml_to_kt.py b/scripts/convert_xml_to_kt.py index 6029cc8f1..45fd76fc0 100644 --- a/scripts/convert_xml_to_kt.py +++ b/scripts/convert_xml_to_kt.py @@ -71,6 +71,9 @@ def main(): if lang_code == "en" and len(country_code) == 0: dest_file = "../core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/DefaultStrings.kt" else: + # add support for formats like zh-rCN + if country_code.startswith("-r"): + country_code = country_code[2:] dest_file = "../core/l10n/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/l10n/messages/{0}{1}Strings.kt".format(lang_code.capitalize(), country_code.capitalize()) convert(lang_code, country_code, source_file, dest_file) diff --git a/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt b/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt index a9cfb91be..2fa8f8155 100644 --- a/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt +++ b/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt @@ -165,45 +165,33 @@ object ProfileLoggedScreen : Tab { val annotatedString = buildAnnotatedString { - val text = LocalStrings.current.messageAuthIssueSegue - val span1 = - LocalStrings.current.messageAuthIssueSegueHighlight1 - val span2 = - LocalStrings.current.messageAuthIssueSegueHighlight2 + val linkStyle = + SpanStyle( + color = MaterialTheme.colorScheme.primary, + textDecoration = TextDecoration.Underline, + ) withStyle(SpanStyle(color = MaterialTheme.colorScheme.onBackground)) { - append(text) - val span1Start = text.indexOf(span1) - val span1End = span1Start + span1.length - addStringAnnotation( - tag = AuthIssueAnnotations.ANNOTATION_ACTION, - annotation = AuthIssueAnnotations.ACTION_REFRESH, - start = span1Start, - end = span1End, + append(LocalStrings.current.messageAuthIssueSegue0) + append("\n• ") + pushStringAnnotation( + AuthIssueAnnotations.ANNOTATION_ACTION, + AuthIssueAnnotations.ACTION_REFRESH, ) - addStyle( - SpanStyle( - color = MaterialTheme.colorScheme.primary, - textDecoration = TextDecoration.Underline, - ), - span1Start, - span1End, - ) - val span2Start = text.indexOf(span2) - val span2End = span2Start + span2.length - addStringAnnotation( - tag = AuthIssueAnnotations.ANNOTATION_ACTION, - annotation = AuthIssueAnnotations.ACTION_LOGIN, - start = span2Start, - end = span2End, - ) - addStyle( - SpanStyle( - color = MaterialTheme.colorScheme.primary, - textDecoration = TextDecoration.Underline, - ), - span2Start, - span2End, + withStyle(linkStyle) { + append(LocalStrings.current.messageAuthIssueSegue1) + } + pop() + append("\n• ") + pushStringAnnotation( + AuthIssueAnnotations.ANNOTATION_ACTION, + AuthIssueAnnotations.ACTION_LOGIN, ) + withStyle(linkStyle) { + append(LocalStrings.current.messageAuthIssueSegue2) + } + pop() + append("\n• ") + append(LocalStrings.current.messageAuthIssueSegue3) } } Box(