feat(settings): enhance UI labels and descriptions for clarity

- Updated various settings components to use title-cased labels for better readability.
- Added descriptions for action-related settings to improve user understanding.
- Adjusted localization strings to reflect new label structures and descriptions.

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei 2025-06-06 23:36:17 +08:00
parent 156917205f
commit 2ed9f70e20
No known key found for this signature in database
GPG Key ID: 0F62D33977F021F7
19 changed files with 214 additions and 55 deletions

View File

@ -7,6 +7,7 @@ import { Switch } from "@follow/components/ui/switch/index.jsx"
import { cn } from "@follow/utils/utils"
import type { ChangeEventHandler, ReactNode } from "react"
import { useId, useState } from "react"
import { titleCase } from "title-case"
export const SettingCheckbox: Component<{
label: string
@ -22,7 +23,7 @@ export const SettingCheckbox: Component<{
onCheckedChange={onCheckedChange}
className="cursor-auto"
/>
<Label htmlFor={id}>{label}</Label>
<Label htmlFor={id}>{titleCase(label)}</Label>
</div>
)
}
@ -35,7 +36,7 @@ export const SettingSwitch: Component<{
const id = useId()
return (
<div className={cn("mb-3 flex items-center justify-between gap-4", className)}>
<Label htmlFor={id}>{label}</Label>
<Label htmlFor={id}>{titleCase(label)}</Label>
<Switch id={id} checked={checked} onCheckedChange={onCheckedChange} />
</div>
)
@ -60,7 +61,7 @@ export const SettingInput: Component<{
)}
>
<Label className={cn("shrink-0", labelClassName)} htmlFor={id}>
{label}
{titleCase(label)}
</Label>
<Input type={type} id={id} value={value} onChange={onChange} className="text-xs" />
</div>
@ -77,7 +78,9 @@ export const SettingTabbedSegment: Component<{
return (
<div className={cn("mb-3 flex items-center justify-between gap-4", className)}>
<label className="text-sm font-medium leading-none">{label}</label>
<label className="text-sm font-medium leading-none">
{typeof label === "string" ? titleCase(label) : label}
</label>
<SegmentGroup
className="h-8"
@ -120,7 +123,9 @@ export const SettingActionItem = ({
buttonText: string
}) => (
<div className={cn("relative mb-3 mt-4 flex items-center justify-between gap-4")}>
<div className="text-sm font-medium">{label}</div>
<div className="text-sm font-medium">
{typeof label === "string" ? titleCase(label) : label}
</div>
<Button variant="outline" size="sm" onClick={action}>
{buttonText}
</Button>

View File

@ -5,6 +5,7 @@ import { cn } from "@follow/utils/utils"
import type { FC, PropsWithChildren, ReactNode } from "react"
import { cloneElement } from "react"
import * as React from "react"
import { titleCase } from "title-case"
import { SettingActionItem, SettingDescription, SettingSwitch } from "./control"
@ -15,11 +16,11 @@ export const SettingSectionTitle: FC<{
}> = ({ title, margin }) => (
<div
className={cn(
"text-text text-headline shrink-0 font-bold capitalize opacity-50 first:mt-0",
"text-text text-headline shrink-0 font-bold opacity-50 first:mt-0",
margin === "compact" ? "mb-2 mt-8" : "mb-4 mt-10",
)}
>
{title}
{typeof title === "string" ? titleCase(title) : title}
</div>
)

View File

@ -93,10 +93,12 @@ export const SettingGeneral = () => {
value: t("general.action.title"),
},
defineSettingItem("summary", {
label: t("general.action.summary"),
label: t("general.action.summary.label"),
description: t("general.action.summary.description"),
}),
defineSettingItem("translation", {
label: t("general.action.translation"),
label: t("general.action.translation.label"),
description: t("general.action.translation.description"),
}),
TranslationModeSelector,
ActionLanguageSelector,
@ -141,7 +143,7 @@ export const SettingGeneral = () => {
description: t("general.show_quick_timeline.description"),
}),
{ type: "title", value: t("general.unread") },
{ type: "title", value: t("general.mark_as_read.title") },
defineSettingItem("scrollMarkUnread", {
label: t("general.mark_as_read.scroll.label"),
@ -229,8 +231,11 @@ export const LanguageSelector = ({
const isMobile = useMobile()
return (
<div className={cn("mb-3 mt-4 flex items-center justify-between", containerClassName)}>
<span className="shrink-0 text-sm font-medium">{t("general.language")}</span>
<div className={cn("mb-3 mt-4 flex w-full items-center", containerClassName)}>
<div className="flex grow flex-col gap-1">
<span className="shrink-0 text-sm font-medium">{t("general.language.title")}</span>
<SettingDescription>{t("general.language.description")}</SettingDescription>
</div>
<ResponsiveSelect
size="sm"
@ -274,8 +279,8 @@ const TranslationModeSelector = () => {
const translationMode = useGeneralSettingKey("translationMode")
return (
<SettingItemGroup>
<div className="flex items-center justify-between">
<>
<div className="mt-4 flex items-center justify-between">
<span className="shrink-0 text-sm font-medium">{t("general.translation_mode.label")}</span>
<ResponsiveSelect
size="sm"
@ -292,7 +297,7 @@ const TranslationModeSelector = () => {
/>
</div>
<SettingDescription>{t("general.translation_mode.description")}</SettingDescription>
</SettingItemGroup>
</>
)
}
@ -301,8 +306,12 @@ const ActionLanguageSelector = () => {
const actionLanguage = useGeneralSettingKey("actionLanguage")
return (
<div className="mb-3 mt-4 flex items-center justify-between">
<span className="shrink-0 text-sm font-medium">{t("general.action_language.label")}</span>
<div className="mb-3 mt-4 flex w-full gap-1">
<div className="flex grow flex-col gap-1">
<span className="shrink-0 text-sm font-medium">{t("general.action_language.label")}</span>
<SettingDescription>{t("general.action_language.description")}</SettingDescription>
</div>
<ResponsiveSelect
size="sm"
triggerClassName="w-48"

View File

@ -2,10 +2,11 @@ import { SettingAbout } from "~/modules/settings/tabs/about"
import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const priority = Number.MAX_SAFE_INTEGER
export const loader = defineSettingPageData({
icon: "i-mgc-information-cute-re",
name: "titles.about",
priority: 9999,
priority,
})
export const Component = () => (
<>

View File

@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const iconName = "i-mgc-palette-cute-re"
const priority = 1010
const priority = (1000 << 1) + 10
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -4,7 +4,7 @@ import { SettingDataControl } from "~/modules/settings/tabs/data-control"
import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const priority = 1025
const priority = (1000 << 1) + 30
export const loader = defineSettingPageData({
icon: <MaterialSymbolsDatabaseOutline />,

View File

@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const iconName = "i-mgc-certificate-cute-re"
const priority = 1060
const priority = (1000 << 2) + 20
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const iconName = "i-mgc-settings-7-cute-re"
const priority = 1000
const priority = 1000 << 1
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const iconName = "i-mgc-department-cute-re"
const priority = 1030
const priority = (1000 << 1) + 20
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -5,7 +5,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData, DisableWhy } from "~/modules/settings/utils"
const iconName = "i-mgc-love-cute-re"
const priority = 1070
const priority = (1000 << 3) + 20
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -5,7 +5,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData, DisableWhy } from "~/modules/settings/utils"
const iconName = "i-mgc-rada-cute-re"
const priority = 1050
const priority = (1000 << 2) + 10
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -5,7 +5,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData, DisableWhy } from "~/modules/settings/utils"
const iconName = "i-mgc-notification-cute-re"
const priority = 1040
const priority = (1000 << 1) + 50
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -14,10 +14,10 @@ import { defineSettingPageData } from "~/modules/settings/utils"
import { signOut } from "~/queries/auth"
const iconName = "i-mgc-user-setting-cute-re"
const priority = 1090
const priority = (1000 << 3) + 10
export const loader = defineSettingPageData({
icon: iconName,
name: "titles.profile",
name: "titles.account",
priority,
})

View File

@ -5,7 +5,7 @@ import { SettingsTitle } from "~/modules/settings/title"
import { defineSettingPageData } from "~/modules/settings/utils"
const iconName = "i-mgc-hotkey-cute-re"
const priority = 1080
const priority = (1000 << 1) + 40
export const loader = defineSettingPageData({
icon: iconName,

View File

@ -70,7 +70,14 @@ function LanguageSetting({ settingKey }: { settingKey: "language" | "actionLangu
return (
<GroupedInsetListCell
label={settingKey === "language" ? t("general.language") : t("general.action_language.label")}
label={
settingKey === "language" ? t("general.language.title") : t("general.action_language.label")
}
description={
settingKey === "language"
? t("general.language.description")
: t("general.action_language.description")
}
>
<View className="w-[150px]">
<LanguageSelect settingKey={settingKey} />
@ -128,7 +135,7 @@ export const GeneralScreen: NavigationControllerView = () => {
>
{/* Language */}
<GroupedInsetListSectionHeader label={t("general.language")} marginSize="small" />
<GroupedInsetListSectionHeader label={t("general.language.title")} marginSize="small" />
<GroupedInsetListCard>
<LanguageSetting settingKey="language" />
</GroupedInsetListCard>
@ -136,7 +143,10 @@ export const GeneralScreen: NavigationControllerView = () => {
{/* Content Behavior */}
<GroupedInsetListSectionHeader label={t("general.action.title")} />
<GroupedInsetListCard>
<GroupedInsetListCell label={t("general.action.summary")}>
<GroupedInsetListCell
label={t("general.action.summary.label")}
description={t("general.action.summary.description")}
>
<Switch
size="sm"
value={summary}
@ -145,7 +155,10 @@ export const GeneralScreen: NavigationControllerView = () => {
}}
/>
</GroupedInsetListCell>
<GroupedInsetListCell label={t("general.action.translation")}>
<GroupedInsetListCell
label={t("general.action.translation.label")}
description={t("general.action.translation.description")}
>
<Switch
size="sm"
value={translation}
@ -242,7 +255,7 @@ export const GeneralScreen: NavigationControllerView = () => {
{/* Unread */}
<GroupedInsetListSectionHeader label={t("general.unread")} />
<GroupedInsetListSectionHeader label={t("general.mark_as_read.title")} />
<GroupedInsetListCard>
<GroupedInsetListCell
label={t("general.mark_as_read.scroll.label")}

View File

@ -152,11 +152,14 @@
"feeds.tableHeaders.name": "Name",
"feeds.tableHeaders.subscriptionCount": "Subs",
"feeds.tableHeaders.tipAmount": "Tips",
"general.action.summary": "AI Summary",
"general.action.title": "Action",
"general.action.translation": "AI Translation",
"general.action.summary.description": "Generate a summary of the entry using AI.",
"general.action.summary.label": "AI Summary",
"general.action.title": "AI Actions",
"general.action.translation.description": "Translate the entry into the selected language.",
"general.action.translation.label": "AI Translation",
"general.action_language.default": "Default (UI Language)",
"general.action_language.label": "Action Language",
"general.action_language.description": "Choose the language for the AI actions, e.g. AI Summary, AI Translation.",
"general.action_language.label": "AI Target Language",
"general.advanced": "Advanced",
"general.app": "App",
"general.auto_expand_long_social_media.description": "Automatically expand social media entries containing long text.",
@ -191,7 +194,8 @@
"general.hide_all_read_subscriptions.label": "Hide read",
"general.hide_private_subscriptions_in_timeline.description": "Hide private subscriptions from your subscriptions list and hide their entries from your timeline (they are always invisible to the public regardless of this setting).",
"general.hide_private_subscriptions_in_timeline.label": "Hide private",
"general.language": "Language",
"general.language.description": "Choose the display language for the app.",
"general.language.title": "Language",
"general.launch_at_login": "Launch at login",
"general.log_file.button": "Reveal",
"general.log_file.description": "Reveal the log file in the system.",
@ -202,6 +206,7 @@
"general.mark_as_read.render.label": "Mark as read when in the view",
"general.mark_as_read.scroll.description": "Automatically mark entries as read when scrolled out of the view.",
"general.mark_as_read.scroll.label": "Mark as read when scrolling",
"general.mark_as_read.title": "Mark as read",
"general.minimize_to_tray.description": "Minimize to system tray when closing window",
"general.minimize_to_tray.label": "Minimize to tray",
"general.network": "Network",
@ -231,9 +236,8 @@
"general.timeline": "Timeline",
"general.translation_mode.bilingual": "Bilingual Comparison",
"general.translation_mode.description": "Choose how the translated text is displayed in the entry list.",
"general.translation_mode.label": "Translation Mode",
"general.translation_mode.label": "AI Translation Mode",
"general.translation_mode.translation-only": "Only the translation",
"general.unread": "Unread",
"general.voices": "Voices",
"integration.cubox.autoMemo.description": "Automatically use Memo mode when text is selected to save to Cubox.",
"integration.cubox.autoMemo.label": "Auto Memo Mode",
@ -447,7 +451,6 @@
"titles.notifications": "Notifications",
"titles.power": "Power",
"titles.privacy": "Privacy",
"titles.profile": "Profile",
"titles.shortcuts": "Shortcuts",
"titles.sign_out": "Sign Out",
"wallet.balance.activePoints": "Active Points",

View File

@ -1,5 +1,6 @@
{
"about.changelog": "変更履歴",
"about.checkForUpdates": "アップデートを確認",
"about.feedbackInfo": "{{appName}} ({{commitSha}}) は開発の初期段階にあります。フィードバックや提案があれば、気軽に <OpenIssueLink>GitHub で課題を報告してください</OpenIssueLink> <ExternalLinkIcon />。",
"about.iconLibrary": "使用されているアイコンライブラリは <IconLibraryLink /> <ExternalLinkIcon /> によって著作権が保護されており、再配布できません。",
"about.licenseInfo": "Copyright © {{currentYear}} {{appName}}. All rights reserved.",
@ -22,6 +23,7 @@
"actions.action_card.feed_options.feed_title": "フィードタイトル",
"actions.action_card.feed_options.feed_url": "フィードURL",
"actions.action_card.feed_options.site_url": "サイトURL",
"actions.action_card.feed_options.status": "ステータス",
"actions.action_card.feed_options.subscription_view": "購読ビュー",
"actions.action_card.field": "フィールド",
"actions.action_card.from": "から",
@ -39,14 +41,24 @@
"actions.action_card.operator": "オペレーター",
"actions.action_card.or": "または",
"actions.action_card.rewrite_rules": "リライトルール",
"actions.action_card.settings": "設定",
"actions.action_card.silence": "サイレント",
"actions.action_card.source_content": "ソースコンテンツを表示する",
"actions.action_card.star": "スター",
"actions.action_card.then_do": "次に行う…",
"actions.action_card.to": "へ",
"actions.action_card.translate_into": "翻訳する",
"actions.action_card.value": "値",
"actions.action_card.webhooks": "Webhooks",
"actions.action_card.when_feeds_match": "フィードが一致した場合…",
"actions.condition": "条件",
"actions.conditions": "条件",
"actions.edit_condition": "条件を編集",
"actions.edit_rewrite_rule": "リライトルールを編集",
"actions.edit_rule": "ルールを編集",
"actions.edit_webhook": "Webhookを編集",
"actions.info": "アクションは、サーバーまたはクライアント側でタスクを実行するために自動化できるルールのコレクションです。",
"actions.navigate.prompt": "保存されていないアクションの変更があります。本当に離れますか?",
"actions.newRule": "新しいルール",
"actions.save": "保存",
"actions.saveSuccess": "🎉 アクションが保存されました。",
@ -54,11 +66,22 @@
"actions.title": "アクション",
"appearance.code_highlight_theme": "コードハイライトテーマ",
"appearance.content": "コンテンツ",
"appearance.content_font.default": "デフォルトUIフォント",
"appearance.content_font.label": "コンテンツフォント",
"appearance.content_font_size": "コンテンツフォントサイズ",
"appearance.content_line_height.label": "コンテンツ行の高さ",
"appearance.content_line_height.loose": "ゆるい",
"appearance.content_line_height.normal": "普通",
"appearance.content_line_height.relaxed": "リラックス",
"appearance.content_line_height.snug": "ぴったり",
"appearance.content_line_height.tight": "タイト",
"appearance.custom_css.button": "編集",
"appearance.custom_css.description": "コンテンツに Custom CSS を適用できます",
"appearance.custom_css.label": "Custom CSS",
"appearance.custom_font": "カスタムフォント",
"appearance.date_format": "日付形式",
"appearance.font.custom": "カスタム",
"appearance.font.system": "システムUI",
"appearance.fonts": "フォント",
"appearance.general": "一般",
"appearance.guess_code_language.description": "ラベルがないコードブロックの言語を推測するためにモデルを使用する主要なプログラミング言語",
@ -78,7 +101,12 @@
"appearance.save": "保存",
"appearance.sidebar": "サイドバー",
"appearance.sidebar_title": "外観",
"appearance.subscriptions": "購読",
"appearance.text_size.default": "デフォルト",
"appearance.text_size.label": "テキストサイズ",
"appearance.text_size.large": "大",
"appearance.text_size.medium": "中",
"appearance.text_size.smaller": "小",
"appearance.theme.dark": "ダーク",
"appearance.theme.label": "テーマ",
"appearance.theme.light": "ライト",
@ -97,27 +125,57 @@
"appearance.zen_mode.description": "Zen モードは、邪魔されることなくコンテンツに集中できる読書モードです。Zenモードを有効にすると、サイドバーが非表示になります。",
"appearance.zen_mode.label": "Zen モード",
"common.give_star": "<HeartIcon />私たちの製品が好きですか?<Link>GitHub で Star を付けましょう!</Link>",
"customizeToolbar.more_actions.description": "ドロップダウンメニューに表示されます",
"customizeToolbar.more_actions.title": "その他のアクション",
"customizeToolbar.quick_actions.description": "よく使用するアクションをカスタマイズして並べ替える",
"customizeToolbar.quick_actions.title": "クイックアクション",
"customizeToolbar.reset_layout": "デフォルトレイアウトにリセット",
"customizeToolbar.title": "ツールバーをカスタマイズ",
"data_control.app_cache_limit.description": "アプリの最大キャッシュを設定します。 このサイズに達すると空き容量を確保するために古いアイテムから削除されます。",
"data_control.app_cache_limit.label": "キャッシュリミット",
"data_control.clean_cache.button": "キャッシュをクリア",
"data_control.clean_cache.cancel": "キャンセル",
"data_control.clean_cache.clear": "クリア",
"data_control.clean_cache.description": "空き容量を確保するためにキャッシュをクリアします。",
"data_control.clean_cache.description_web": "サービスワーカーのキャッシュを削除して空き容量を確保します。",
"data_control.data_sources": "データソース",
"data_control.export_local_database.label": "ローカルデータベースをエクスポート",
"data_control.import_opml.label": "OPMLから購読をインポート",
"data_control.utils": "ユーティリティ",
"discoverFilters.filters": "フィルタ",
"discoverFilters.language": "言語",
"discoverFilters.title": "発見フィルタ",
"feeds.claim": "フィードを認証",
"feeds.claimTips": "フィードを認証してチップを受け取るには、購読リストのフィードを右クリックして「フィードをクレーム」を選択してください。",
"feeds.noFeeds": "認証されたフィードはありません",
"feeds.subscription": "購読済みフィード",
"feeds.tableHeaders.name": "名前",
"feeds.tableHeaders.subscriptionCount": "購読者",
"feeds.tableHeaders.tipAmount": "受け取った報酬",
"general.action.summary.description": "AIを使用してエントリの要約を生成します。",
"general.action.summary.label": "AI要約",
"general.action.title": "AIアクション",
"general.action.translation.description": "エントリを選択した言語に翻訳します。",
"general.action.translation.label": "AI翻訳",
"general.action_language.default": "デフォルトUI言語",
"general.action_language.description": "AI アクションの言語を選択します。",
"general.action_language.label": "AI ターゲット言語",
"general.advanced": "高度",
"general.app": "アプリ",
"general.auto_expand_long_social_media.description": "ソーシャルメディアに含まれる長いテキストを展開して表示します。",
"general.auto_expand_long_social_media.label": "ソーシャルメディアを展開",
"general.auto_group.description": "サイトのドメインごとに自動でグループ化する。",
"general.auto_group.label": "自動グループ化",
"general.cache": "キャッシュ",
"general.content": "コンテンツ",
"general.data": "データ",
"general.data_file.label": "データファイル",
"general.data_persist.description": "ローカルデータを保持してオフラインアクセスとローカル検索を可能にします。",
"general.data_persist.label": "オフライン使用のためにデータを保持",
"general.enhanced.description": "強化された設定を有効にすると、より多くのカスタマイズオプションが提供されますが、予期しない問題が発生する可能性もあります。",
"general.enhanced.disabled.tip": "強化された設定は無効になっています。一般設定 - 詳細設定で有効にできます。",
"general.enhanced.enabled.tip": "強化された設定が有効になっています。一般設定 - 詳細設定で無効にできます。",
"general.enhanced.label": "強化された設定",
"general.export.button": "エクスポート",
"general.export.description": "あなたのフィードを OPML ファイルにエクスポートします。",
"general.export.folder_mode.description": "エクスポートするフォルダーを決めて管理します。",
@ -132,7 +190,12 @@
"general.export_database.label": "データベースをエクスポート",
"general.group_by_date.description": "エントリを日付ごとにグループ化します。",
"general.group_by_date.label": "日付ごとにグループ化",
"general.language": "言語",
"general.hide_all_read_subscriptions.description": "購読リストで未読エントリのない購読を非表示にします。",
"general.hide_all_read_subscriptions.label": "既読を非表示",
"general.hide_private_subscriptions_in_timeline.description": "購読リストからプライベート購読を非表示にし、タイムラインからそれらのエントリを非表示にします(この設定に関係なく、それらは常に公開されません)。",
"general.hide_private_subscriptions_in_timeline.label": "プライベートを非表示",
"general.language.description": "アプリの表示言語を選択します。",
"general.language.title": "言語",
"general.launch_at_login": "ログイン時に起動",
"general.log_file.button": "ログ",
"general.log_file.description": "システムにログファイルがあると表示します。",
@ -143,13 +206,16 @@
"general.mark_as_read.render.label": "表示中に既読にする",
"general.mark_as_read.scroll.description": "表示からスクロールアウトしたときにエントリを自動的に既読にします。",
"general.mark_as_read.scroll.label": "スクロール時に既読にする",
"general.mark_as_read.title": "既読にする",
"general.minimize_to_tray.description": "ウィンドウを閉じるとシステムトレイに最小化します",
"general.minimize_to_tray.label": "トレイに最小化",
"general.network": "ネットワーク",
"general.open_links_in_external_app.label": "外部アプリでリンクを開く",
"general.privacy": "プライバシー",
"general.proxy.description": "ネットワークリクエストを代理します。例: socks://proxy.example.com:1080",
"general.proxy.label": "プロキシ",
"general.rebuild_database.button": "再構築",
"general.rebuild_database.cancel": "キャンセル",
"general.rebuild_database.description": "レンダリングに問題がある場合、データベースの再構築が解決するかもしれません。",
"general.rebuild_database.label": "データベースを再構築",
"general.rebuild_database.title": "データベースを再構築",
@ -165,12 +231,25 @@
"general.startup_screen.subscription": "購読",
"general.startup_screen.timeline": "タイムライン",
"general.startup_screen.title": "スタートアップスクリーン",
"general.subscription": "購読",
"general.subscriptions": "購読",
"general.timeline": "タイムライン",
"general.unread": "未読",
"general.translation_mode.bilingual": "バイリンガル比較",
"general.translation_mode.description": "エントリリストで翻訳されたテキストの表示方法を選択します。",
"general.translation_mode.label": "AI翻訳モード",
"general.translation_mode.translation-only": "翻訳のみ",
"general.voices": "音声",
"integration.cubox.autoMemo.description": "テキストを選択してCuboxに保存する際に、自動的にメモモードを使用します。",
"integration.cubox.autoMemo.label": "自動メモモード",
"integration.cubox.enable.description": "利用可能な場合、'Cuboxに保存'ボタンを表示します。",
"integration.cubox.enable.label": "有効",
"integration.cubox.title": "Cubox",
"integration.cubox.token.description": "完全なCubox API URLを入力してください。形式https://cubox.pro/c/api/save/xxxxxxxxx。こちらで取得できます",
"integration.cubox.token.label": "Cubox API URL",
"integration.eagle.enable.description": "利用可能な場合、'Eagle にメディアを保存' ボタンを表示します。",
"integration.eagle.enable.label": "有効化",
"integration.eagle.title": "Eagle",
"integration.general": "一般",
"integration.instapaper.enable.description": "利用可能な場合、'Instapaper に保存' ボタンを表示します。",
"integration.instapaper.enable.label": "有効化",
"integration.instapaper.password.label": "Instapaper パスワード",
@ -202,9 +281,17 @@
"integration.readwise.title": "Readwise",
"integration.readwise.token.description": "こちらで取得できます:",
"integration.readwise.token.label": "Readwise アクセス トークン",
"integration.save_ai_summary_as_description.label": "AI要約を説明として保存",
"integration.sidebar_title": "統合",
"integration.tip": "ヒント:あなたの機密データはローカルに保存され、サーバーにアップロードされません。",
"integration.title": "統合",
"integration.zotero.enable.description": "利用可能な場合、'Zoteroに保存'ボタンを表示します。",
"integration.zotero.enable.label": "有効",
"integration.zotero.title": "Zotero",
"integration.zotero.token.description": "Zotero APIトークン。こちらで取得できます",
"integration.zotero.token.label": "Zotero APIトークン",
"integration.zotero.userID.description": "Zotero ユーザーID。こちらで取得できます",
"integration.zotero.userID.label": "Zotero ユーザーID",
"invitation.activate": "アクティベート",
"invitation.codeOptions.betaUser": "1. ベータユーザーから招待を受ける。",
"invitation.codeOptions.discord": "2. Discord サーバーに参加して、時々プレゼントをもらいましょう。",
@ -214,8 +301,10 @@
"invitation.confirmModal.continue": "続行",
"invitation.confirmModal.message": "招待コードを生成するには、{{INVITATION_PRICE}} <PowerIcon /> Power が必要です。",
"invitation.confirmModal.title": "確認",
"invitation.created_at": "作成日",
"invitation.earlyAccess": "現在、Folo は<strong>アーリーアクセス</strong>中で、招待コードが必要です。",
"invitation.earlyAccessMessage": "😰 申し訳ありません。Folo は現在アーリーアクセス中で、招待コードが必要です。",
"invitation.generate": "生成",
"invitation.generateButton": "新しいコードを生成",
"invitation.generateCost": "{{INVITATION_PRICE}} <PowerIcon /> Power を消費して、友達のために招待コードを生成できます。",
"invitation.getCodeMessage": "以下の方法で招待コードを取得できます:",
@ -256,16 +345,31 @@
"lists.feeds.title": "タイトル",
"lists.image": "画像",
"lists.info": "リストは、他の人と共有したり販売したりできる定期購読のリストです。購読者はこのリストにあるすべてのフィードを同期してアクセスできます。",
"lists.manage_list": "リストを管理",
"lists.noLists": "リストがありません",
"lists.select_feeds": "現在のリストに追加するフィードを選択",
"lists.submit": "送信",
"lists.subscriptions": "購読者",
"lists.title": "タイトル",
"lists.view": "表示",
"notifications.channel": "チャンネル",
"notifications.current": "(現在のクライアント)",
"notifications.info": "Foloは<ActionsLink>アクション</ActionsLink>を通じて堅牢で多機能な通知機能を提供します。特定のフィード、ビュー、キーワードの通知をカスタマイズできます。以下は登録された通知チャンネルです。",
"notifications.test": "テスト通知",
"notifications.test_success": "テスト通知が正常に送信されました。",
"notifications.token": "クライアントトークン",
"privacy.privacy": "プライバシー",
"privacy.terms": "利用規約",
"profile.avatar.label": "アバター",
"profile.change_password.label": "パスワードを変更",
"profile.confirm_password.label": "パスワードの確認",
"profile.current_password.label": "現在のパスワード",
"profile.danger_zone": "危険ゾーン",
"profile.delete_account.label": "アカウントを削除",
"profile.edit_email": "メールを編集",
"profile.edit_profile": "プロフィールを編集",
"profile.email.change": "Email を変更",
"profile.email.change_note": "メールを変更したい場合は、新しいメールを確認する必要があります。",
"profile.email.changed": "Email 変更しました。",
"profile.email.changed_verification_sent": "新たな Email に確認メールを送信しました。",
"profile.email.label": "Email",
@ -273,6 +377,8 @@
"profile.email.unverified": "未確認",
"profile.email.verification_sent": "確認メールを送信しました",
"profile.email.verified": "確認済み",
"profile.email.verify_email": "続行するにはメール({{email_address}})を確認してください",
"profile.email.verify_status": "あなたのメールは{{status}}です",
"profile.handle.description": "あなた個人の識別子です",
"profile.handle.label": "ハンドル",
"profile.link_social.authentication": "認証",
@ -284,6 +390,8 @@
"profile.no_password": "パスワードを <Link>リセット</Link> します。",
"profile.password.label": "パスワード",
"profile.reset_password_mail_sent": "パスワードリセットメールを送信しました",
"profile.security": "セキュリティ",
"profile.set_avatar": "アバターを設定",
"profile.sidebar_title": "プロフィール",
"profile.submit": "送信",
"profile.title": "プロフィール設定",
@ -307,12 +415,18 @@
"rsshub.add_new_instance": "新たなインスタンスを追加",
"rsshub.description": "RSSHub コミュニティ駆動のオープンソース RSS ネットワークです。Folo は内蔵の専用インスタンスを提供し、そのインスタンスを使って数千のサブスクリプションコンテンツをサポートします。また独自あるいはサードパーティのインスタンスを使用することで、より安定したコンテンツ取得を実現できます。",
"rsshub.public_instances": "利用可能なインスタンス",
"rsshub.table.delete.confirm": "このインスタンスを削除してもよろしいですか?",
"rsshub.table.delete.label": "削除",
"rsshub.table.delete.success": "インスタンスが正常に削除されました。",
"rsshub.table.description": "説明",
"rsshub.table.edit": "編集",
"rsshub.table.inuse": "利用中",
"rsshub.table.limit_reached": "制限に達しました",
"rsshub.table.official": "公式",
"rsshub.table.owner": "所有者",
"rsshub.table.price": "月額の費用",
"rsshub.table.private": "プライベート",
"rsshub.table.unavailable": "利用不可",
"rsshub.table.unlimited": "無制限",
"rsshub.table.use": "利用",
"rsshub.table.userCount": "ユーザー数",
@ -325,6 +439,7 @@
"rsshub.useModal.title": "RSSHub インスタンス",
"rsshub.useModal.useWith": "使用する {{amount}} <Power />",
"titles.about": "About",
"titles.account": "アカウント",
"titles.actions": "アクション",
"titles.appearance": "外観",
"titles.data_control": "データコントロール",
@ -333,9 +448,11 @@
"titles.integration": "統合",
"titles.invitations": "招待",
"titles.lists": "リスト",
"titles.notifications": "通知",
"titles.power": "Power",
"titles.profile": "プロフィール",
"titles.privacy": "プライバシー",
"titles.shortcuts": "ショートカット",
"titles.sign_out": "サインアウト",
"wallet.balance.activePoints": "アクティブなポイント",
"wallet.balance.dailyReward": "デイリー報酬",
"wallet.balance.title": "残高",
@ -387,6 +504,7 @@
"wallet.withdraw.button": "引き出し",
"wallet.withdraw.error": "引き出しに失敗しました:{{error}}",
"wallet.withdraw.modalTitle": "Power を引き出す",
"wallet.withdraw.receiveRSS3": "{{amount}} RSS3を受け取ります",
"wallet.withdraw.submitButton": "送信",
"wallet.withdraw.success": "引き出しが成功しました!",
"wallet.withdraw.toRss3Label": "RSS3 で引き出す"

View File

@ -1,5 +1,6 @@
{
"about.changelog": "更新日志",
"about.checkForUpdates": "检查更新",
"about.feedbackInfo": "{{appName}}{{commitSha}})正处于开发的早期阶段。如果你有任何反馈或建议,请随时在我们的 GitHub 上<OpenIssueLink>提出</OpenIssueLink> <ExternalLinkIcon />。",
"about.iconLibrary": "使用的图标库受版权保护,版权所有者为 <IconLibraryLink /><ExternalLinkIcon />,不得重新分发。",
"about.licenseInfo": "Copyright © {{currentYear}} {{appName}}. 保留所有权利。",
@ -144,15 +145,20 @@
"discoverFilters.filters": "筛选",
"discoverFilters.language": "语言",
"discoverFilters.title": "发现筛选",
"feeds.claim": "认证订阅源",
"feeds.claimTips": "要认证你的订阅源并接收打赏,请在订阅列表中右键点击订阅源并选择「认证」。",
"feeds.noFeeds": "没有已认证的订阅源",
"feeds.subscription": "已订阅的订阅源",
"feeds.tableHeaders.name": "名称",
"feeds.tableHeaders.subscriptionCount": "订阅数",
"feeds.tableHeaders.tipAmount": "收到的打赏",
"general.action.summary": "AI 总结",
"general.action.summary.description": "使用 AI 生成条目摘要。",
"general.action.summary.label": "AI 摘要",
"general.action.title": "自动化",
"general.action.translation": "AI 翻译",
"general.action.translation.description": "将条目翻译成所选语言。",
"general.action.translation.label": "AI 翻译",
"general.action_language.default": "默认(界面语言)",
"general.action_language.description": "选择 AI 操作的语言,例如 AI 摘要、AI 翻译。",
"general.action_language.label": "自动化语言",
"general.advanced": "高级",
"general.app": "应用程序",
@ -188,7 +194,8 @@
"general.hide_all_read_subscriptions.label": "隐藏已读",
"general.hide_private_subscriptions_in_timeline.description": "从你的订阅列表中隐藏私密订阅,并从你的时间线上隐藏它们的条目(无论此设置如何,它们对公众始终是不可见的)。",
"general.hide_private_subscriptions_in_timeline.label": "隐藏私密",
"general.language": "语言",
"general.language.description": "选择应用的显示语言。",
"general.language.title": "语言",
"general.launch_at_login": "开机时启动",
"general.log_file.button": "显示",
"general.log_file.description": "在系统中显示日志文件。",
@ -199,6 +206,7 @@
"general.mark_as_read.render.label": "在可视区域中时标记为已读",
"general.mark_as_read.scroll.description": "当条目滚动出可视区域时自动将其标记为已读。",
"general.mark_as_read.scroll.label": "滚动时标记为已读",
"general.mark_as_read.title": "标记已读",
"general.minimize_to_tray.description": "关闭窗口时最小化到系统托盘。",
"general.minimize_to_tray.label": "最小化到托盘",
"general.network": "网络",
@ -230,7 +238,6 @@
"general.translation_mode.description": "选择译文在条目列表中的显示方式。",
"general.translation_mode.label": "翻译偏好",
"general.translation_mode.translation-only": "仅译文",
"general.unread": "未读",
"general.voices": "声音",
"integration.cubox.autoMemo.description": "自动使用 Memo 模式保存选中的文本到 Cubox。",
"integration.cubox.autoMemo.label": "自动 Memo 模式",
@ -444,7 +451,6 @@
"titles.notifications": "通知",
"titles.power": "Power",
"titles.privacy": "隐私",
"titles.profile": "个人资料",
"titles.shortcuts": "快捷键",
"titles.sign_out": "登出",
"wallet.balance.activePoints": "活跃度",

View File

@ -152,10 +152,13 @@
"feeds.tableHeaders.name": "名稱",
"feeds.tableHeaders.subscriptionCount": "訂閱數",
"feeds.tableHeaders.tipAmount": "收到的贊助",
"general.action.summary": "AI 總結",
"general.action.summary.description": "使用 AI 生成條目摘要。",
"general.action.summary.label": "AI 總結",
"general.action.title": "自動化操作",
"general.action.translation": "AI 翻譯",
"general.action.translation.description": "將條目翻譯成選定的語言。",
"general.action.translation.label": "AI 翻譯",
"general.action_language.default": "預設(介面語言)",
"general.action_language.description": "選擇 AI 操作的語言,例如 AI 總結、AI 翻譯。",
"general.action_language.label": "自動化翻譯語言",
"general.advanced": "進階",
"general.app": "App",
@ -191,7 +194,8 @@
"general.hide_all_read_subscriptions.label": "隱藏列表",
"general.hide_private_subscriptions_in_timeline.description": "從你的訂閱列表中隱藏私人訂閱,並從你的時間軸上隱藏它們的條目(無論此設置為何,它們對公眾始終是不可見的)。",
"general.hide_private_subscriptions_in_timeline.label": "隱藏私人",
"general.language": "語言",
"general.language.description": "選擇應用程式的顯示語言。",
"general.language.title": "語言",
"general.launch_at_login": "登入時啟動",
"general.log_file.button": "顯示",
"general.log_file.description": "在系統中顯示記錄檔案。",
@ -202,6 +206,7 @@
"general.mark_as_read.render.label": "顯示時標記為已讀",
"general.mark_as_read.scroll.description": "當條目捲動離開視圖時自動標記為已讀。",
"general.mark_as_read.scroll.label": "捲動時標記為已讀",
"general.mark_as_read.title": "標記為已讀",
"general.minimize_to_tray.description": "關閉視窗時最小化到工作列通知區域",
"general.minimize_to_tray.label": "最小化到通知區域",
"general.network": "網路",
@ -233,7 +238,6 @@
"general.translation_mode.description": "選擇譯文在條目列表中的顯示方式。",
"general.translation_mode.label": "翻譯偏好",
"general.translation_mode.translation-only": "僅譯文",
"general.unread": "未讀",
"general.voices": "聲音",
"integration.cubox.autoMemo.description": "當選取文字儲存到 Cubox 時,自動使用備忘模式。",
"integration.cubox.autoMemo.label": "自動備忘模式",
@ -447,7 +451,6 @@
"titles.notifications": "通知",
"titles.power": "Power",
"titles.privacy": "隱私",
"titles.profile": "個人資料",
"titles.shortcuts": "快捷鍵",
"titles.sign_out": "登出",
"wallet.balance.activePoints": "活躍度",