1
0
mirror of https://github.com/hotomoe/hotomoe synced 2024-12-01 00:08:14 +09:00

fix(tutorial): add korean locale and profile settings page

This commit is contained in:
オスカー、 2024-07-25 19:22:06 +09:00
parent e649e2ea6c
commit cc7230ef5d
Signed by: SWREI
GPG Key ID: 139D6573F92DA9F7
9 changed files with 201 additions and 136 deletions

200
locales/index.d.ts vendored
View File

@ -5111,6 +5111,18 @@ export interface Locale extends ILocale {
*
*/
"sensitiveDoubleClickRequired": string;
/**
*
*/
"prohibitSkippingInitialTutorial": string;
/**
*
*/
"prohibitSkippingInitialTutorialDescription": string;
/**
*
*/
"onboarding": string;
"_bubbleGame": {
/**
*
@ -5314,72 +5326,6 @@ export interface Locale extends ILocale {
*/
"silenceDescription": string;
};
"_initialAccountSetting": {
/**
*
*/
"accountCreated": string;
/**
*
*/
"letsStartAccountSetup": string;
/**
*
*/
"letsFillYourProfile": string;
/**
*
*/
"profileSetting": string;
/**
*
*/
"privacySetting": string;
/**
*
*/
"theseSettingsCanEditLater": string;
/**
*
*/
"youCanEditMoreSettingsInSettingsPageLater": string;
/**
*
*/
"followUsers": string;
/**
* {name}使
*/
"pushNotificationDescription": ParameterizedString<"name">;
/**
*
*/
"initialAccountSettingCompleted": string;
/**
* {name}
*/
"haveFun": ParameterizedString<"name">;
/**
* {name}(Misskey)使使
*/
"youCanContinueTutorial": ParameterizedString<"name">;
/**
*
*/
"startTutorial": string;
/**
*
*/
"skipAreYouSure": string;
/**
*
*/
"laterAreYouSure": string;
/**
* Botアカウントは管理者を必ず記載する必要があります
*/
"mustBeSetBotOwner": string;
};
"_initialTutorial": {
/**
*
@ -5493,6 +5439,16 @@ export interface Locale extends ILocale {
*/
"description3": ParameterizedString<"link">;
};
"_followUsers": {
/**
*
*/
"description1": string;
/**
*
*/
"description2": string;
};
"_postNote": {
/**
* 稿
@ -5593,6 +5549,52 @@ export interface Locale extends ILocale {
*/
"doItToContinue": string;
};
"_pushNotification": {
/**
* {name}使
*/
"description": ParameterizedString<"name">;
};
"_privacySettings": {
/**
*
*/
"title": string;
/**
*
*/
"description": string;
/**
*
*/
"theseSettingsCanEditLater": string;
/**
*
*/
"youCanEditMoreSettingsInSettingsPageLater": string;
};
"_profileSettings": {
/**
*
*/
"title": string;
/**
*
*/
"description": string;
/**
*
*/
"theseSettingsCanEditLater": string;
/**
*
*/
"youCanEditMoreSettingsInSettingsPageLater": string;
/**
* Botアカウントは管理者を必ず記載する必要があります
*/
"mustBeSetBotOwner": string;
};
"_done": {
/**
* 🎉
@ -5602,6 +5604,72 @@ export interface Locale extends ILocale {
* Misskeyの使い方をより詳しく知るには{link}
*/
"description": ParameterizedString<"link">;
/**
* {name}
*/
"haveFun": ParameterizedString<"name">;
/**
*
*/
"youCanReferTutorialBy": string;
};
"_onboardingLanding": {
/**
*
*/
"accountCreated": string;
/**
* {name}
*/
"welcomeToX": ParameterizedString<"name">;
/**
* {name}使💦Misskeyの基本的な使い方を学びましょう
*/
"description": ParameterizedString<"name">;
/**
* {min}
*
*/
"takesAbout": ParameterizedString<"min">;
/**
*
* Misskeyを使い始めることはできません
*/
"adminForcesToTakeTutorial": string;
};
"_onboardingDone": {
/**
* {name}
*/
"description": ParameterizedString<"name">;
/**
*
*/
"backToOriginalPath": string;
/**
*
*/
"backToOriginalPathDescription": string;
/**
*
*/
"profile": string;
/**
*
*/
"profileDescription": string;
/**
*
*/
"exploreDescription": string;
/**
*
*/
"goToTimeline": string;
/**
*
*/
"goToTimelineDescription": string;
};
};
"_timelineDescription": {

View File

@ -1278,6 +1278,7 @@ sensitiveDoubleClickRequired: "敏感な内容のメディアをダブルクリ
mutualLink: "相互リンク"
prohibitSkippingInitialTutorial: "チュートリアルをスキップできないようにする"
prohibitSkippingInitialTutorialDescription: "新規登録したユーザーに表示されるチュートリアルをスキップできないようにします。チュートリアルを完了しなかったりチュートリアルページを回避したりした場合でも、強制的にリダイレクトされます。"
onboarding: "オンボーディング"
_bubbleGame:
howToPlay: "遊び方"
@ -1335,24 +1336,6 @@ _announcement:
silence: "非通知"
silenceDescription: "オンにすると、このお知らせは通知されず、既読にする必要もなくなります。"
_initialAccountSetting:
accountCreated: "アカウントの作成が完了しました!"
letsStartAccountSetup: "さっそくアカウントの初期設定を行いましょう。"
letsFillYourProfile: "まずはあなたのプロフィールを設定しましょう。"
profileSetting: "プロフィール設定"
privacySetting: "プライバシー設定"
theseSettingsCanEditLater: "これらの設定は後から変更できます。"
youCanEditMoreSettingsInSettingsPageLater: "この他にも様々な設定を「設定」ページから行えます。ぜひ後で確認してみてください。"
followUsers: "タイムラインを構築するため、気になるユーザーをフォローしてみましょう。"
pushNotificationDescription: "プッシュ通知を有効にすると{name}の通知をお使いのデバイスで受け取ることができます。"
initialAccountSettingCompleted: "初期設定が完了しました!"
haveFun: "{name}をお楽しみください!"
youCanContinueTutorial: "このまま{name}(Misskey)の使い方についてのチュートリアルに進むこともできますが、ここで中断してすぐに使い始めることもできます。"
startTutorial: "チュートリアルを開始"
skipAreYouSure: "初期設定をスキップしますか?"
laterAreYouSure: "初期設定をあとでやり直しますか?"
mustBeSetBotOwner: "Botアカウントは管理者を必ず記載する必要があります。以下から管理者のアカウントを選択してください。"
_initialTutorial:
launchTutorial: "チュートリアルを見る"
title: "チュートリアル"
@ -1419,9 +1402,15 @@ _initialTutorial:
description: "プッシュ通知を有効にすると{name}の通知をお使いのデバイスで受け取ることができます。"
_privacySettings:
title: "プライバシー設定"
description1: "多くのユーザーが利用しているプライバシー関連の設定項目をリストアップしました。必要に応じて変更してください。"
description: "多くのユーザーが利用しているプライバシー関連の設定項目をリストアップしました。必要に応じて変更してください。"
theseSettingsCanEditLater: "これらの設定は後から変更できます。"
youCanEditMoreSettingsInSettingsPageLater: "この他にも様々な設定を「設定」ページから行えます。ぜひ後で確認してみてください。"
_profileSettings:
title: "プライバシー設定"
description: "多くのユーザーが利用しているプライバシー関連の設定項目をリストアップしました。必要に応じて変更してください。"
theseSettingsCanEditLater: "これらの設定は後から変更できます。"
youCanEditMoreSettingsInSettingsPageLater: "この他にも様々な設定を「設定」ページから行えます。ぜひ後で確認してみてください。"
mustBeSetBotOwner: "Botアカウントは管理者を必ず記載する必要があります。以下から管理者のアカウントを選択してください。"
_done:
title: "チュートリアルは終了です🎉"
description: "ここで紹介した機能はほんの一部にすぎません。Misskeyの使い方をより詳しく知るには、{link}をご覧ください。"

View File

@ -1263,6 +1263,7 @@ sensitiveDoubleClickRequired: "민감한 내용의 미디어를 더블 클릭해
mutualLink: "서로링크"
prohibitSkippingInitialTutorial: "チュートリアルをスキップできないようにする"
prohibitSkippingInitialTutorialDescription: "新規登録したユーザーに表示されるチュートリアルをスキップできないようにします。チュートリアルを完了しなかったりチュートリアルページを回避したりした場合でも、強制的にリダイレクトされます。"
onboarding: "온보딩"
_bubbleGame:
howToPlay: "설명"
hold: "홀드"
@ -1321,23 +1322,6 @@ _announcement:
dialogAnnouncementUxWarn: "다이얼로그 형태의 알림이 동시에 2개 이상 존재하는 경우, 사용자 경험에 악영향을 끼칠 수 있으므로 신중히 결정하십시오."
silence: "조용히 알림"
silenceDescription: "활성화하면 공지사항에 대한 알림이 가지 않게 되며, 확인 버튼을 누를 필요가 없게 됩니다."
_initialAccountSetting:
accountCreated: "계정 생성이 완료되었습니다!"
letsStartAccountSetup: "계정의 초기 설정을 진행합니다."
letsFillYourProfile: "우선 나의 프로필을 설정해 보아요."
profileSetting: "프로필 설정"
privacySetting: "프라이버시 설정"
theseSettingsCanEditLater: "이 설정들은 나중에도 변경할 수 있습니다."
youCanEditMoreSettingsInSettingsPageLater: "이 외에도 '설정' 페이지에서 다양한 설정을 나의 입맛에 맞게 조절할 수 있습니다. 꼭 확인해 보세요!"
followUsers: "관심사가 맞는 유저를 팔로우하여 타임라인을 가꾸어 봅시다."
pushNotificationDescription: "푸시 알림을 활성화하면 {name}의 알림을 나의 기기에서 받아볼 수 있게 됩니다."
initialAccountSettingCompleted: "초기 설정을 모두 마쳤습니다!"
haveFun: "{name}와 함께 즐거운 시간 보내세요!"
youCanContinueTutorial: "이대로 {name}(Misskey)의 사용법에 대해 튜토리얼을 진행할 수도 있지만, 여기서 중단하고 바로 시작할 수도 있습니다."
startTutorial: "튜토리얼 시작"
skipAreYouSure: "초기 설정을 중단하시겠습니까?"
laterAreYouSure: "초기 설정을 나중에 진행하시겠습니까?"
mustBeSetBotOwner: "봇 계정은 반드시 관리자를 지정해야 합니다. 아래에서 관리자 계정을 선택해 주세요."
_initialTutorial:
launchTutorial: "튜토리얼 보기"
title: "튜토리얼"
@ -1401,32 +1385,38 @@ _initialTutorial:
sensitiveSucceeded: "파일을 첨부할 때에는 서버의 가이드라인에 따라 적절히 열람주의를 설정해 주시기 바랍니다."
doItToContinue: "이미지를 열람 주의로 설정하면 다음으로 넘어갈 수 있게 됩니다."
_pushNotification:
description: "プッシュ通知を有効にすると{name}の通知をお使いのデバイスで受け取ることができます。"
description: "푸시 알림을 활성화하면 {name}의 알림을 나의 기기에서 받아볼 수 있게 됩니다."
_privacySettings:
title: "プライバシー設定"
description1: "多くのユーザーが利用しているプライバシー関連の設定項目をリストアップしました。必要に応じて変更してください。"
theseSettingsCanEditLater: "これらの設定は後から変更できます。"
youCanEditMoreSettingsInSettingsPageLater: "この他にも様々な設定を「設定」ページから行えます。ぜひ後で確認してみてください。"
title: "프라이버시 설정"
description: "대부분의 초기 사용자가 설정하는 것을 권장하는 옵션들입니다. 입맛에 맞게 변경해보세요."
theseSettingsCanEditLater: "이 설정들은 나중에도 변경할 수 있습니다."
youCanEditMoreSettingsInSettingsPageLater: "이외의 옵션은 '설정' 페이지에 있으니, 나중에 꼭 확인해보시기 바랍니다."
_profileSettings:
title: "나를 소개해봅시다!"
description: "노트를 올리기 전에, 나에 대한 설명을 하는 곳입니다."
theseSettingsCanEditLater: "이 설정들은 나중에도 변경할 수 있습니다."
youCanEditMoreSettingsInSettingsPageLater: "이외의 옵션은 '설정' 페이지에 있으니, 나중에 꼭 확인해보시기 바랍니다."
mustBeSetBotOwner: "Bot 계정은 반드시 관리자를 기재해야 합니다. 아래에서 관리자 계정을 선택하세요."
_done:
title: "튜토리얼이 끝났습니다! 🎉"
title: "튜토리얼이 완료! 🎉"
description: "여기에서 소개한 기능은 극히 일부에 지나지 않습니다. Misskey의 사용 방법을 더 자세히 알아보려면 {link}를 확인해 주세요!"
haveFun: "{name}をお楽しみください!"
youCanReferTutorialBy: "このチュートリアルは、「もっと!」→「情報」→「チュートリアルを見る」からいつでも見返すことができます。"
haveFun: "{name}에서 즐거운 시간 보내시기 바랍니다!"
youCanReferTutorialBy: "이 튜토리얼은 [더 보기! -> 정보 -> 튜토리얼 보기]에서 다시 볼 수 있습니다."
_onboardingLanding:
accountCreated: "アカウントの作成が完了しました!"
welcomeToX: "ようこそ、{name}へ!"
description: "「{name}に登録したは良いものの、どう使えばいいか分からない…💦」といったことを防ぐために、まずはMisskeyの基本的な使い方を学びましょう。"
takesAbout: "このチュートリアルの所要時間は{min}分程度です。\nチュートリアルを完了すると実績が解除されます。"
adminForcesToTakeTutorial: "このサーバーの管理者は新規ユーザーにチュートリアルを完了することを義務付けています。\nチュートリアルを完了するまでMisskeyを使い始めることはできません。"
accountCreated: "계정 생성을 완료했습니다!"
welcomeToX: "{name}에 오신 것을 환영합니다 😎"
description: "「{name}에 계정은 만들었는데, 도저히 사용법을 모르겠다...」\n같은 일이 일어나지 않도록, 기본적인 가이드를 배워봅시다."
takesAbout: "본 튜토리얼은 대략 {min}분 정도 소요됩니다.\n튜토리얼이 완료되면 도전 과제를 달성하게 됩니다."
adminForcesToTakeTutorial: "서버의 관리자가 튜토리얼 진행을 강제했습니다.\nMisskey를 계속 이용하려면 튜토리얼을 진행해주세요."
_onboardingDone:
description: "お疲れ様でした!次のステップに進んで、{name}をもっと楽しめるようにしましょう。"
backToOriginalPath: "元のページに戻る"
backToOriginalPathDescription: "あなたがアクセスしようとしていたページに戻ります。"
profile: "プロフィール設定"
profileDescription: "他のユーザーが親しみやすいように、プロフィールをつくりましょう。"
exploreDescription: "人気のノートやユーザーを見つけて交流をはじめましょう。"
goToTimeline: "ホーム画面に進む"
goToTimelineDescription: "設定等を行わず、通常のホーム画面(タイムライン)に進みます。"
description: "수고하셨습니다! {name}에서 할 만한 것들을 아래에 모아봤습니다."
backToOriginalPath: "원래 있던 페이지로"
backToOriginalPathDescription: "튜토리얼에 진입하기 전에 보고 있던 페이지로 이동합니다."
profile: "프로필 설정"
profileDescription: "더 많은 프로필 관련 설정 (배너, 추가 정보, 고양이...) 을 진행합니다."
exploreDescription: "지금 여기에서 인기 있는 노트 또는 사용자를 더 탐색해봅니다."
goToTimeline: "타임라인으로"
goToTimelineDescription: "설정을 더 진행하지 않고, 홈 타임라인으로 돌아갑니다."
_timelineDescription:
home: "홈 타임라인에서는, 내가 팔로우한 계정의 게시물을 볼 수 있습니다."
local: "로컬 타임라인에서는, 이 서버의 모든 유저의 게시물을 볼 수 있습니다."

View File

@ -12,7 +12,7 @@ import { version, lang, updateLocale, locale } from '@/config.js';
import { applyTheme } from '@/scripts/theme.js';
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js';
import { updateI18n } from '@/i18n.js';
import { $i, iAmModerator, refreshAccount, login } from '@/account.js';
import { $i, iAmAdmin, refreshAccount, login } from '@/account.js';
import { defaultStore, ColdDeviceStorage } from '@/store.js';
import { fetchInstance, instance } from '@/instance.js';
import { deviceKind } from '@/scripts/device-kind.js';
@ -21,7 +21,6 @@ import { getUrlWithoutLoginId } from '@/scripts/login-id.js';
import { getAccountFromId } from '@/scripts/get-account-from-id.js';
import { deckStore } from '@/ui/deck/deck-store.js';
import { miLocalStorage } from '@/local-storage.js';
import { claimedAchievements } from '@/scripts/achievements.js';
import { fetchCustomEmojis } from '@/custom-emojis.js';
import { setupRouter } from '@/router/definition.js';
@ -120,7 +119,7 @@ export async function common(createVue: () => App<Element>) {
await deckStore.ready;
// 2024年4月1日JST以降に作成されたアカウントで、チュートリアルを完了していない通常ユーザーの場合、チュートリアルにリダイレクト
if (!instance.canSkipInitialTutorial && $i && !iAmModerator && defaultStore.state.accountSetupWizard !== -1 && !location.pathname.startsWith('/onboarding') && !location.pathname.startsWith('/signup-complete')) {
if (!instance.canSkipInitialTutorial && $i && !iAmAdmin && defaultStore.state.accountSetupWizard !== -1 && !location.pathname.startsWith('/onboarding') && !location.pathname.startsWith('/signup-complete')) {
const param = new URLSearchParams();
param.set('redirected_from', location.pathname + location.search + location.hash);
location.replace('/onboarding?' + param.toString());

View File

@ -5,7 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<div class="_gaps">
<MkInfo>{{ i18n.ts._initialAccountSetting.theseSettingsCanEditLater }}</MkInfo>
<div style="word-break: auto-phrase; text-align: center; padding: 0 16px;">{{ i18n.ts._initialTutorial._profileSettings.description }}</div>
<MkInfo>{{ i18n.ts._initialTutorial._profileSettings.theseSettingsCanEditLater }}</MkInfo>
<FormSlot>
<template #label>{{ i18n.ts.avatar }}</template>
@ -31,7 +33,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div v-if="useAsBot" class="_gaps_m">
<div>
<MkInfo>{{ i18n.ts._initialAccountSetting.mustBeSetBotOwner }}</MkInfo>
<MkInfo>{{ i18n.ts._initialTutorial._profileSettings.mustBeSetBotOwner }}</MkInfo>
</div>
<div>
<MkButton @click="selectBotOwner">{{ i18n.ts.selectUser }}</MkButton>
@ -39,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</div>
<MkInfo>{{ i18n.ts._initialAccountSetting.youCanEditMoreSettingsInSettingsPageLater }}</MkInfo>
<MkInfo>{{ i18n.ts._initialTutorial._profileSettings.youCanEditMoreSettingsInSettingsPageLater }}</MkInfo>
</div>
</template>

View File

@ -80,6 +80,15 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</div>
<div v-else-if="page === 7" key="tutorialPage_7" :class="$style.pageContainer">
<div :class="$style.pageRoot">
<MkSpacer :marginMin="20" :marginMax="28" :class="$style.pageMain">
<div class="_gaps">
<XProfileSettings/>
</div>
</MkSpacer>
</div>
</div>
<div v-else-if="page === 8" key="tutorialPage_8" :class="$style.pageContainer">
<div :class="$style.pageRoot">
<MkSpacer :marginMin="20" :marginMax="28" :class="$style.pageMain">
<div class="_gaps">
@ -88,7 +97,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkSpacer>
</div>
</div>
<slot v-else-if="page === 8" key="tutorialPage_8" name="finish" :close="() => emit('close')" :prev="prev">
<slot v-else-if="page === 9" key="tutorialPage_9" name="finish" :close="() => emit('close')" :prev="prev">
<div :class="$style.centerPage">
<MkAnimBg style="position: absolute; top: 0;" :scale="1.5"/>
<MkSpacer :marginMin="20" :marginMax="28">
@ -124,7 +133,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts">
//
export const MAX_PAGE = 8;
export const MAX_PAGE = 9;
</script>
@ -136,8 +145,10 @@ import XTimeline from '@/components/MkTutorial.Timeline.vue';
import XFollowUsers from '@/components/MkTutorial.FollowUsers.vue';
import XPostNote from '@/components/MkTutorial.PostNote.vue';
import XSensitive from '@/components/MkTutorial.Sensitive.vue';
import XProfileSettings from '@/components/MkTutorial.Profile.vue';
import XPrivacySettings from '@/components/MkTutorial.PrivacySettings.vue';
import MkAnimBg from '@/components/MkAnimBg.vue';
import { defaultStore } from '@/store.js';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
import { host } from '@/config.js';
@ -164,6 +175,7 @@ const page = ref(props.initialPage ?? 0);
watch(page, (to) => {
if (to === MAX_PAGE) {
claimAchievement('tutorialCompleted');
defaultStore.set('accountSetupWizard', -1);
}
});

View File

@ -15,7 +15,8 @@ SPDX-License-Identifier: AGPL-3.0-only
<span v-else-if="page === 4"><i class="ti ti-user-plus"></i> {{ i18n.ts.follow }}</span>
<span v-else-if="page === 5"><i class="ti ti-pencil-plus"></i> {{ i18n.ts._initialTutorial._postNote.title }}</span>
<span v-else-if="page === 6"><i class="ti ti-eye-exclamation"></i> {{ i18n.ts._initialTutorial._howToMakeAttachmentsSensitive.title }}</span>
<span v-else-if="page === 7"><i class="ti ti-lock"></i> {{ i18n.ts.privacy }}</span>
<span v-else-if="page === 7"><i class="ti ti-user"></i> {{ i18n.ts._initialTutorial._profileSettings.title }}</span>
<span v-else-if="page === 8"><i class="ti ti-lock"></i> {{ i18n.ts._initialTutorial._privacySettings.title }}</span>
<span v-else-if="page === MAX_PAGE"><!-- なんもなし --></span>
<span v-else>{{ i18n.ts._initialTutorial.title }}</span>
</div>
@ -126,6 +127,7 @@ import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
import { host } from '@/config.js';
import { confirm as osConfirm } from '@/os.js';
import { defaultStore } from '@/store.js';
import MkAnimBg from '@/components/MkAnimBg.vue';
import MkButton from '@/components/MkButton.vue';
@ -155,6 +157,7 @@ async function cancel() {
if (confirm.canceled) return;
defaultStore.set('accountSetupWizard', -1);
location.href = '/';
}
@ -232,8 +235,8 @@ onMounted(() => {
// #endregion
definePageMetadata(() => ({
title: 'Onboarding',
description: 'Welcome to Misskey!',
title: i18n.ts.onboarding,
description: i18n.ts.headlineMisskey,
}));
</script>

View File

@ -24,7 +24,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</MkSpacer>
<MkFooterSpacer/>
</mkstickycontainer>
</MkStickyContainer>
</template>
<script setup lang="ts">

View File

@ -10,6 +10,7 @@ import { instance } from '@/instance.js';
import { host } from '@/config.js';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import { defaultStore } from '@/store.js';
function toolsMenuItems(): MenuItem[] {
return [{
@ -112,7 +113,8 @@ export function openInstanceMenu(ev: MouseEvent) {
text: i18n.ts._initialTutorial.launchTutorial,
icon: 'ti ti-presentation',
action: () => {
os.popup(defineAsyncComponent(() => import('@/components/MkTutorialDialog.vue')), {}, {}, 'closed');
defaultStore.set('accountSetupWizard', 0);
location.href = '/onboarding';
},
} : undefined, {
type: 'link',