diff --git a/CHANGELOG.md b/CHANGELOG.md
index 718c7d97c..5bb56be2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,8 +7,30 @@
-->
+## 12.x.x (unreleased)
+
+### Improvements
+
+### Bugfixes
+- 投稿のNSFW画像を表示したあとにリアクションが更新されると画像が非表示になる問題を修正
+- 「クリップ」ページが開かない問題を修正
+- トレンドウィジェットが動作しないのを修正
+- リアクション設定で絵文字ピッカーが開かないのを修正
+- DMページでメンションが含まれる問題を修正
+- 投稿フォームのハッシュタグ保持フィールドが動作しない問題を修正
+- Add `img-src` and `media-src` directives to `Content-Security-Policy` for
+ files and media proxy
+
+## 12.102.1 (2022/01/27)
+### Bugfixes
+- チャットが表示できない問題を修正
+
## 12.102.0 (2022/01/27)
+### NOTE
+アップデート後、一部カスタム絵文字が表示できなくなる場合があります。その場合、一旦絵文字管理ページから絵文字を一括エクスポートし、再度コントロールパネルから一括インポートすると直ります。
+⚠ 12.102.0以前にエクスポートされたzipとは互換性がありません。アップデートしてからエクスポートを行なってください。
+
### Changes
- Room機能が削除されました
- 後日別リポジトリとして復活予定です
diff --git a/cypress/integration/basic.js b/cypress/integration/basic.js
index aca44ef15..7d27b649f 100644
--- a/cypress/integration/basic.js
+++ b/cypress/integration/basic.js
@@ -176,3 +176,7 @@ describe('After user singed in', () => {
cy.contains('Hello, Misskey!');
});
});
+
+// TODO: 投稿フォームの公開範囲指定のテスト
+// TODO: 投稿フォームのファイル添付のテスト
+// TODO: 投稿フォームのハッシュタグ保持フィールドのテスト
diff --git a/package.json b/package.json
index f32fb4a17..f6e05af4e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "misskey",
- "version": "12.102.0-simkey",
+ "version": "12.102.1-simkey",
"codename": "indigo",
"repository": {
"type": "git",
diff --git a/packages/backend/src/server/file/index.ts b/packages/backend/src/server/file/index.ts
index a455acd1c..6fe6110dc 100644
--- a/packages/backend/src/server/file/index.ts
+++ b/packages/backend/src/server/file/index.ts
@@ -18,7 +18,7 @@ const _dirname = dirname(_filename);
const app = new Koa();
app.use(cors());
app.use(async (ctx, next) => {
- ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`);
+ ctx.set('Content-Security-Policy', `default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'`);
await next();
});
diff --git a/packages/backend/src/server/proxy/index.ts b/packages/backend/src/server/proxy/index.ts
index b8993f19f..7a3094311 100644
--- a/packages/backend/src/server/proxy/index.ts
+++ b/packages/backend/src/server/proxy/index.ts
@@ -11,7 +11,7 @@ import { proxyMedia } from './proxy-media';
const app = new Koa();
app.use(cors());
app.use(async (ctx, next) => {
- ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`);
+ ctx.set('Content-Security-Policy', `default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'`);
await next();
});
diff --git a/packages/client/src/account.ts b/packages/client/src/account.ts
index 5a935e1dc..4aeceecca 100644
--- a/packages/client/src/account.ts
+++ b/packages/client/src/account.ts
@@ -192,31 +192,31 @@ export async function openAccountMenu(opts: {
if (opts.withExtraOperation) {
popupMenu([...[{
type: 'link',
- text: i18n.locale.profile,
+ text: i18n.ts.profile,
to: `/@${ $i.username }`,
avatar: $i,
}, null, ...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises, {
icon: 'fas fa-plus',
- text: i18n.locale.addAccount,
+ text: i18n.ts.addAccount,
action: () => {
popupMenu([{
- text: i18n.locale.existingAccount,
+ text: i18n.ts.existingAccount,
action: () => { showSigninDialog(); },
}, {
- text: i18n.locale.createAccount,
+ text: i18n.ts.createAccount,
action: () => { createAccount(); },
- }], ev.currentTarget || ev.target);
+ }], ev.currentTarget ?? ev.target);
},
}, {
type: 'link',
icon: 'fas fa-users',
- text: i18n.locale.manageAccounts,
+ text: i18n.ts.manageAccounts,
to: `/settings/accounts`,
- }]], ev.currentTarget || ev.target, {
+ }]], ev.currentTarget ?? ev.target, {
align: 'left'
});
} else {
- popupMenu([...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises], ev.currentTarget || ev.target, {
+ popupMenu([...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises], ev.currentTarget ?? ev.target, {
align: 'left'
});
}
diff --git a/packages/client/src/components/abuse-report-window.vue b/packages/client/src/components/abuse-report-window.vue
index cd04f62bc..f2cb36980 100644
--- a/packages/client/src/components/abuse-report-window.vue
+++ b/packages/client/src/components/abuse-report-window.vue
@@ -2,7 +2,7 @@
-
+
@@ -11,12 +11,12 @@
- {{ i18n.locale.details }}
- {{ i18n.locale.fillAbuseReportDescription }}
+ {{ i18n.ts.details }}
+ {{ i18n.ts.fillAbuseReportDescription }}
- {{ i18n.locale.send }}
+ {{ i18n.ts.send }}
@@ -50,7 +50,7 @@ function send() {
}, undefined).then(res => {
os.alert({
type: 'success',
- text: i18n.locale.abuseReported
+ text: i18n.ts.abuseReported
});
window.value?.close();
emit('closed');
diff --git a/packages/client/src/components/autocomplete.vue b/packages/client/src/components/autocomplete.vue
index 7ba83b7cb..91a50ffa5 100644
--- a/packages/client/src/components/autocomplete.vue
+++ b/packages/client/src/components/autocomplete.vue
@@ -8,7 +8,7 @@
@{{ acct(user) }}
-
{{ i18n.locale.selectUser }}
+ {{ i18n.ts.selectUser }}
-
diff --git a/packages/client/src/components/captcha.vue b/packages/client/src/components/captcha.vue
index 307fc312b..963ae25f8 100644
--- a/packages/client/src/components/captcha.vue
+++ b/packages/client/src/components/captcha.vue
@@ -1,6 +1,6 @@
-
{{ i18n.locale.waiting }}
+
{{ i18n.ts.waiting }}
diff --git a/packages/client/src/components/channel-follow-button.vue b/packages/client/src/components/channel-follow-button.vue
index 0ad5384cd..7bbf5ae66 100644
--- a/packages/client/src/components/channel-follow-button.vue
+++ b/packages/client/src/components/channel-follow-button.vue
@@ -6,14 +6,14 @@
>
- {{ i18n.locale.unfollow }}
+ {{ i18n.ts.unfollow }}
- {{ i18n.locale.follow }}
+ {{ i18n.ts.follow }}
- {{ i18n.locale.processing }}
+ {{ i18n.ts.processing }}
diff --git a/packages/client/src/components/channel-preview.vue b/packages/client/src/components/channel-preview.vue
index 8d135a192..dd3794a65 100644
--- a/packages/client/src/components/channel-preview.vue
+++ b/packages/client/src/components/channel-preview.vue
@@ -6,7 +6,7 @@
-
+
{{ channel.usersCount }}
@@ -14,7 +14,7 @@
-
+
{{ channel.notesCount }}
@@ -27,7 +27,7 @@
diff --git a/packages/client/src/components/chart.vue b/packages/client/src/components/chart.vue
index 1959271f5..d17c0c9f3 100644
--- a/packages/client/src/components/chart.vue
+++ b/packages/client/src/components/chart.vue
@@ -143,6 +143,7 @@ export default defineComponent({
}
const gridColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
+ const vLineColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
// フォントカラー
Chart.defaults.color = getComputedStyle(document.documentElement).getPropertyValue('--fg');
@@ -255,6 +256,27 @@ export default defineComponent({
},
},
},
+ plugins: [{
+ id: 'vLine',
+ beforeDraw(chart, args, options) {
+ if (chart.tooltip._active && chart.tooltip._active.length) {
+ const activePoint = chart.tooltip._active[0];
+ const ctx = chart.ctx;
+ const x = activePoint.element.x;
+ const topY = chart.scales.y.top;
+ const bottomY = chart.scales.y.bottom;
+
+ ctx.save();
+ ctx.beginPath();
+ ctx.moveTo(x, bottomY);
+ ctx.lineTo(x, topY);
+ ctx.lineWidth = 1;
+ ctx.strokeStyle = vLineColor;
+ ctx.stroke();
+ ctx.restore();
+ }
+ }
+ }]
});
};
diff --git a/packages/client/src/components/cw-button.vue b/packages/client/src/components/cw-button.vue
index ccfd11462..e7c9aabe4 100644
--- a/packages/client/src/components/cw-button.vue
+++ b/packages/client/src/components/cw-button.vue
@@ -1,6 +1,6 @@
@@ -25,7 +25,7 @@ const label = computed(() => {
return concat([
props.note.text ? [i18n.t('_cw.chars', { count: length(props.note.text) })] : [],
props.note.files && props.note.files.length !== 0 ? [i18n.t('_cw.files', { count: props.note.files.length }) ] : [],
- props.note.poll != null ? [i18n.locale.poll] : []
+ props.note.poll != null ? [i18n.ts.poll] : []
] as string[][]).join(' / ');
});
diff --git a/packages/client/src/components/dialog.vue b/packages/client/src/components/dialog.vue
index b6b649cde..3e106a4f0 100644
--- a/packages/client/src/components/dialog.vue
+++ b/packages/client/src/components/dialog.vue
@@ -28,8 +28,8 @@
- {{ (showCancelButton || input || select) ? i18n.locale.ok : i18n.locale.gotIt }}
- {{ i18n.locale.cancel }}
+ {{ (showCancelButton || input || select) ? i18n.ts.ok : i18n.ts.gotIt }}
+ {{ i18n.ts.cancel }}
{ action.callback(); close(); }">{{ action.text }}
diff --git a/packages/client/src/components/drive-select-dialog.vue b/packages/client/src/components/drive-select-dialog.vue
index 6d8451127..f6c59457d 100644
--- a/packages/client/src/components/drive-select-dialog.vue
+++ b/packages/client/src/components/drive-select-dialog.vue
@@ -10,7 +10,7 @@
@closed="emit('closed')"
>
- {{ multiple ? ((type === 'file') ? i18n.locale.selectFiles : i18n.locale.selectFolders) : ((type === 'file') ? i18n.locale.selectFile : i18n.locale.selectFolder) }}
+ {{ multiple ? ((type === 'file') ? i18n.ts.selectFiles : i18n.ts.selectFolders) : ((type === 'file') ? i18n.ts.selectFile : i18n.ts.selectFolder) }}
({{ number(selected.length) }})
diff --git a/packages/client/src/components/drive-window.vue b/packages/client/src/components/drive-window.vue
index 8b60bf779..d08c5fb67 100644
--- a/packages/client/src/components/drive-window.vue
+++ b/packages/client/src/components/drive-window.vue
@@ -6,7 +6,7 @@
@closed="emit('closed')"
>
- {{ i18n.locale.drive }}
+ {{ i18n.ts.drive }}
diff --git a/packages/client/src/components/drive.file.vue b/packages/client/src/components/drive.file.vue
index fd6a81383..262eae0de 100644
--- a/packages/client/src/components/drive.file.vue
+++ b/packages/client/src/components/drive.file.vue
@@ -10,15 +10,15 @@
>

-
{{ i18n.locale.avatar }}
+
{{ i18n.ts.avatar }}

-
{{ i18n.locale.banner }}
+
{{ i18n.ts.banner }}

-
{{ i18n.locale.nsfw }}
+
{{ i18n.ts.nsfw }}
@@ -61,30 +61,30 @@ const title = computed(() => `${props.file.name}\n${props.file.type} ${bytes(pro
function getMenu() {
return [{
- text: i18n.locale.rename,
+ text: i18n.ts.rename,
icon: 'fas fa-i-cursor',
action: rename
}, {
- text: props.file.isSensitive ? i18n.locale.unmarkAsSensitive : i18n.locale.markAsSensitive,
+ text: props.file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive,
icon: props.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash',
action: toggleSensitive
}, {
- text: i18n.locale.describeFile,
+ text: i18n.ts.describeFile,
icon: 'fas fa-i-cursor',
action: describe
}, null, {
- text: i18n.locale.copyUrl,
+ text: i18n.ts.copyUrl,
icon: 'fas fa-link',
action: copyUrl
}, {
type: 'a',
href: props.file.url,
target: '_blank',
- text: i18n.locale.download,
+ text: i18n.ts.download,
icon: 'fas fa-download',
download: props.file.name
}, null, {
- text: i18n.locale.delete,
+ text: i18n.ts.delete,
icon: 'fas fa-trash-alt',
danger: true,
action: deleteFile
@@ -95,7 +95,7 @@ function onClick(ev: MouseEvent) {
if (props.selectMode) {
emit('chosen', props.file);
} else {
- os.popupMenu(getMenu(), (ev.currentTarget || ev.target || undefined) as HTMLElement | undefined);
+ os.popupMenu(getMenu(), (ev.currentTarget ?? ev.target ?? undefined) as HTMLElement | undefined);
}
}
@@ -120,8 +120,8 @@ function onDragend() {
function rename() {
os.inputText({
- title: i18n.locale.renameFile,
- placeholder: i18n.locale.inputNewFileName,
+ title: i18n.ts.renameFile,
+ placeholder: i18n.ts.inputNewFileName,
default: props.file.name,
}).then(({ canceled, result: name }) => {
if (canceled) return;
@@ -134,9 +134,9 @@ function rename() {
function describe() {
os.popup(import('@/components/media-caption.vue'), {
- title: i18n.locale.describeFile,
+ title: i18n.ts.describeFile,
input: {
- placeholder: i18n.locale.inputNewDescription,
+ placeholder: i18n.ts.inputNewDescription,
default: props.file.comment !== null ? props.file.comment : '',
},
image: props.file
diff --git a/packages/client/src/components/drive.folder.vue b/packages/client/src/components/drive.folder.vue
index 20a6343cf..57621bf09 100644
--- a/packages/client/src/components/drive.folder.vue
+++ b/packages/client/src/components/drive.folder.vue
@@ -20,7 +20,7 @@
{{ folder.name }}
- {{ i18n.locale.uploadFolder }}
+ {{ i18n.ts.uploadFolder }}
@@ -146,14 +146,14 @@ function onDrop(ev: DragEvent) {
switch (err) {
case 'detected-circular-definition':
os.alert({
- title: i18n.locale.unableToProcess,
- text: i18n.locale.circularReferenceFolder
+ title: i18n.ts.unableToProcess,
+ text: i18n.ts.circularReferenceFolder
});
break;
default:
os.alert({
type: 'error',
- text: i18n.locale.somethingHappened
+ text: i18n.ts.somethingHappened
});
}
});
@@ -184,8 +184,8 @@ function go() {
function rename() {
os.inputText({
- title: i18n.locale.renameFolder,
- placeholder: i18n.locale.inputNewFolderName,
+ title: i18n.ts.renameFolder,
+ placeholder: i18n.ts.inputNewFolderName,
default: props.folder.name
}).then(({ canceled, result: name }) => {
if (canceled) return;
@@ -208,14 +208,14 @@ function deleteFolder() {
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
os.alert({
type: 'error',
- title: i18n.locale.unableToDelete,
- text: i18n.locale.hasChildFilesOrFolders
+ title: i18n.ts.unableToDelete,
+ text: i18n.ts.hasChildFilesOrFolders
});
break;
default:
os.alert({
type: 'error',
- text: i18n.locale.unableToDelete
+ text: i18n.ts.unableToDelete
});
}
});
@@ -227,7 +227,7 @@ function setAsUploadFolder() {
function onContextmenu(ev: MouseEvent) {
os.contextMenu([{
- text: i18n.locale.openInWindow,
+ text: i18n.ts.openInWindow,
icon: 'fas fa-window-restore',
action: () => {
os.popup(import('./drive-window.vue'), {
@@ -236,11 +236,11 @@ function onContextmenu(ev: MouseEvent) {
}, 'closed');
}
}, null, {
- text: i18n.locale.rename,
+ text: i18n.ts.rename,
icon: 'fas fa-i-cursor',
action: rename,
}, null, {
- text: i18n.locale.delete,
+ text: i18n.ts.delete,
icon: 'fas fa-trash-alt',
danger: true,
action: deleteFolder,
diff --git a/packages/client/src/components/drive.nav-folder.vue b/packages/client/src/components/drive.nav-folder.vue
index 7c35c5d3d..67223267c 100644
--- a/packages/client/src/components/drive.nav-folder.vue
+++ b/packages/client/src/components/drive.nav-folder.vue
@@ -8,7 +8,7 @@
@drop.stop="onDrop"
>
- {{ folder == null ? i18n.locale.drive : folder.name }}
+ {{ folder == null ? i18n.ts.drive : folder.name }}
diff --git a/packages/client/src/components/drive.vue b/packages/client/src/components/drive.vue
index e27b0a5fb..e044c6752 100644
--- a/packages/client/src/components/drive.vue
+++ b/packages/client/src/components/drive.vue
@@ -54,7 +54,7 @@
/>
-
{{ i18n.locale.loadMore }}
+
{{ i18n.ts.loadMore }}
-
{{ i18n.locale.loadMore }}
+
{{ i18n.ts.loadMore }}
{{ i18n.t('empty-draghover') }}
-
{{ i18n.locale.emptyDrive }}
{{ i18n.t('empty-drive-description') }}
-
{{ i18n.locale.emptyFolder }}
+
{{ i18n.ts.emptyDrive }}
{{ i18n.t('empty-drive-description') }}
+
{{ i18n.ts.emptyFolder }}
@@ -253,14 +253,14 @@ function onDrop(e: DragEvent): any {
switch (err) {
case 'detected-circular-definition':
os.alert({
- title: i18n.locale.unableToProcess,
- text: i18n.locale.circularReferenceFolder
+ title: i18n.ts.unableToProcess,
+ text: i18n.ts.circularReferenceFolder
});
break;
default:
os.alert({
type: 'error',
- text: i18n.locale.somethingHappened
+ text: i18n.ts.somethingHappened
});
}
});
@@ -274,9 +274,9 @@ function selectLocalFile() {
function urlUpload() {
os.inputText({
- title: i18n.locale.uploadFromUrl,
+ title: i18n.ts.uploadFromUrl,
type: 'url',
- placeholder: i18n.locale.uploadFromUrlDescription
+ placeholder: i18n.ts.uploadFromUrlDescription
}).then(({ canceled, result: url }) => {
if (canceled || !url) return;
os.api('drive/files/upload-from-url', {
@@ -285,16 +285,16 @@ function urlUpload() {
});
os.alert({
- title: i18n.locale.uploadFromUrlRequested,
- text: i18n.locale.uploadFromUrlMayTakeTime
+ title: i18n.ts.uploadFromUrlRequested,
+ text: i18n.ts.uploadFromUrlMayTakeTime
});
});
}
function createFolder() {
os.inputText({
- title: i18n.locale.createFolder,
- placeholder: i18n.locale.folderName
+ title: i18n.ts.createFolder,
+ placeholder: i18n.ts.folderName
}).then(({ canceled, result: name }) => {
if (canceled) return;
os.api('drive/folders/create', {
@@ -308,8 +308,8 @@ function createFolder() {
function renameFolder(folderToRename: Misskey.entities.DriveFolder) {
os.inputText({
- title: i18n.locale.renameFolder,
- placeholder: i18n.locale.inputNewFolderName,
+ title: i18n.ts.renameFolder,
+ placeholder: i18n.ts.inputNewFolderName,
default: folderToRename.name
}).then(({ canceled, result: name }) => {
if (canceled) return;
@@ -334,14 +334,14 @@ function deleteFolder(folderToDelete: Misskey.entities.DriveFolder) {
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
os.alert({
type: 'error',
- title: i18n.locale.unableToDelete,
- text: i18n.locale.hasChildFilesOrFolders
+ title: i18n.ts.unableToDelete,
+ text: i18n.ts.hasChildFilesOrFolders
});
break;
default:
os.alert({
type: 'error',
- text: i18n.locale.unableToDelete
+ text: i18n.ts.unableToDelete
});
}
});
@@ -562,36 +562,36 @@ function fetchMoreFiles() {
function getMenu() {
return [{
- text: i18n.locale.addFile,
+ text: i18n.ts.addFile,
type: 'label'
}, {
- text: i18n.locale.upload,
+ text: i18n.ts.upload,
icon: 'fas fa-upload',
action: () => { selectLocalFile(); }
}, {
- text: i18n.locale.fromUrl,
+ text: i18n.ts.fromUrl,
icon: 'fas fa-link',
action: () => { urlUpload(); }
}, null, {
- text: folder.value ? folder.value.name : i18n.locale.drive,
+ text: folder.value ? folder.value.name : i18n.ts.drive,
type: 'label'
}, folder.value ? {
- text: i18n.locale.renameFolder,
+ text: i18n.ts.renameFolder,
icon: 'fas fa-i-cursor',
action: () => { renameFolder(folder.value); }
} : undefined, folder.value ? {
- text: i18n.locale.deleteFolder,
+ text: i18n.ts.deleteFolder,
icon: 'fas fa-trash-alt',
action: () => { deleteFolder(folder.value as Misskey.entities.DriveFolder); }
} : undefined, {
- text: i18n.locale.createFolder,
+ text: i18n.ts.createFolder,
icon: 'fas fa-folder-plus',
action: () => { createFolder(); }
}];
}
function showMenu(ev: MouseEvent) {
- os.popupMenu(getMenu(), (ev.currentTarget || ev.target || undefined) as HTMLElement | undefined);
+ os.popupMenu(getMenu(), (ev.currentTarget ?? ev.target ?? undefined) as HTMLElement | undefined);
}
function onContextmenu(ev: MouseEvent) {
diff --git a/packages/client/src/components/emoji-picker-dialog.vue b/packages/client/src/components/emoji-picker-dialog.vue
index f06a24636..2c0b2e9a8 100644
--- a/packages/client/src/components/emoji-picker-dialog.vue
+++ b/packages/client/src/components/emoji-picker-dialog.vue
@@ -32,20 +32,20 @@ import MkEmojiPicker from '@/components/emoji-picker.vue';
import { defaultStore } from '@/store';
withDefaults(defineProps<{
- manualShowing?: boolean;
+ manualShowing?: boolean | null;
src?: HTMLElement;
showPinned?: boolean;
asReactionPicker?: boolean;
}>(), {
- manualShowing: false,
+ manualShowing: null,
showPinned: true,
asReactionPicker: false,
});
const emit = defineEmits<{
- (e: 'done', v: any): void;
- (e: 'close'): void;
- (e: 'closed'): void;
+ (ev: 'done', v: any): void;
+ (ev: 'close'): void;
+ (ev: 'closed'): void;
}>();
const modal = ref>();
diff --git a/packages/client/src/components/emoji-picker.vue b/packages/client/src/components/emoji-picker.vue
index 96670fa58..6999ad651 100644
--- a/packages/client/src/components/emoji-picker.vue
+++ b/packages/client/src/components/emoji-picker.vue
@@ -1,6 +1,6 @@
-
+
@@ -43,7 +43,7 @@
- {{ i18n.locale.recentUsed }}
+
- {{ i18n.locale.customEmojis }}
- {{ category || i18n.locale.other }}
+ {{ i18n.ts.customEmojis }}
+ {{ category || i18n.ts.other }}
-
+
{{ category }}
@@ -280,7 +280,7 @@ function getKey(emoji: string | Misskey.entities.CustomEmoji | UnicodeEmojiDef):
}
function chosen(emoji: any, ev?: MouseEvent) {
- const el = ev && (ev.currentTarget || ev.target) as HTMLElement | null | undefined;
+ const el = ev && (ev.currentTarget ?? ev.target) as HTMLElement | null | undefined;
if (el) {
const rect = el.getBoundingClientRect();
const x = rect.left + (el.offsetWidth / 2);
diff --git a/packages/client/src/components/follow-button.vue b/packages/client/src/components/follow-button.vue
index 345edb644..93c9e891c 100644
--- a/packages/client/src/components/follow-button.vue
+++ b/packages/client/src/components/follow-button.vue
@@ -6,23 +6,23 @@
>
- {{ i18n.locale.followRequestPending }}
+ {{ i18n.ts.followRequestPending }}
- {{ i18n.locale.processing }}
+ {{ i18n.ts.processing }}
- {{ i18n.locale.unfollow }}
+ {{ i18n.ts.unfollow }}
- {{ i18n.locale.followRequest }}
+ {{ i18n.ts.followRequest }}
- {{ i18n.locale.follow }}
+ {{ i18n.ts.follow }}
- {{ i18n.locale.processing }}
+ {{ i18n.ts.processing }}
diff --git a/packages/client/src/components/forgot-password.vue b/packages/client/src/components/forgot-password.vue
index c74e1ac75..46cbf6bd7 100644
--- a/packages/client/src/components/forgot-password.vue
+++ b/packages/client/src/components/forgot-password.vue
@@ -5,28 +5,28 @@
@close="dialog.close()"
@closed="emit('closed')"
>
- {{ i18n.locale.forgotPassword }}
+ {{ i18n.ts.forgotPassword }}
- {{ i18n.locale._forgotPassword.contactAdmin }}
+ {{ i18n.ts._forgotPassword.contactAdmin }}
diff --git a/packages/client/src/components/global/a.vue b/packages/client/src/components/global/a.vue
index cf7385ca2..b1b6a0cda 100644
--- a/packages/client/src/components/global/a.vue
+++ b/packages/client/src/components/global/a.vue
@@ -43,31 +43,31 @@ function onContextmenu(ev) {
text: props.to,
}, {
icon: 'fas fa-window-maximize',
- text: i18n.locale.openInWindow,
+ text: i18n.ts.openInWindow,
action: () => {
os.pageWindow(props.to);
}
}, sideViewHook ? {
icon: 'fas fa-columns',
- text: i18n.locale.openInSideView,
+ text: i18n.ts.openInSideView,
action: () => {
sideViewHook(props.to);
}
} : undefined, {
icon: 'fas fa-expand-alt',
- text: i18n.locale.showInPage,
+ text: i18n.ts.showInPage,
action: () => {
router.push(props.to);
}
}, null, {
icon: 'fas fa-external-link-alt',
- text: i18n.locale.openInNewTab,
+ text: i18n.ts.openInNewTab,
action: () => {
window.open(props.to, '_blank');
}
}, {
icon: 'fas fa-link',
- text: i18n.locale.copyLink,
+ text: i18n.ts.copyLink,
action: () => {
copyToClipboard(`${url}${props.to}`);
}
diff --git a/packages/client/src/components/global/header.vue b/packages/client/src/components/global/header.vue
index a241ece40..e558614c1 100644
--- a/packages/client/src/components/global/header.vue
+++ b/packages/client/src/components/global/header.vue
@@ -104,7 +104,7 @@ export default defineComponent({
if (props.info.share) {
if (menu.length > 0) menu.push(null);
menu.push({
- text: i18n.locale.share,
+ text: i18n.ts.share,
icon: 'fas fa-share-alt',
action: share
});
@@ -113,7 +113,7 @@ export default defineComponent({
if (menu.length > 0) menu.push(null);
menu = menu.concat(props.menu);
}
- popupMenu(menu, ev.currentTarget || ev.target);
+ popupMenu(menu, ev.currentTarget ?? ev.target);
};
const showTabsPopup = (ev: MouseEvent) => {
@@ -126,7 +126,7 @@ export default defineComponent({
icon: tab.icon,
action: tab.onClick,
}));
- popupMenu(menu, ev.currentTarget || ev.target);
+ popupMenu(menu, ev.currentTarget ?? ev.target);
};
const preventDrag = (ev: TouchEvent) => {
diff --git a/packages/client/src/components/global/time.vue b/packages/client/src/components/global/time.vue
index d2788264c..5748d9de6 100644
--- a/packages/client/src/components/global/time.vue
+++ b/packages/client/src/components/global/time.vue
@@ -24,16 +24,16 @@ let now = $ref(new Date());
const relative = $computed(() => {
const ago = (now.getTime() - _time.getTime()) / 1000/*ms*/;
return (
- ago >= 31536000 ? i18n.t('_ago.yearsAgo', { n: (~~(ago / 31536000)).toString() }) :
- ago >= 2592000 ? i18n.t('_ago.monthsAgo', { n: (~~(ago / 2592000)).toString() }) :
- ago >= 604800 ? i18n.t('_ago.weeksAgo', { n: (~~(ago / 604800)).toString() }) :
- ago >= 86400 ? i18n.t('_ago.daysAgo', { n: (~~(ago / 86400)).toString() }) :
- ago >= 3600 ? i18n.t('_ago.hoursAgo', { n: (~~(ago / 3600)).toString() }) :
+ ago >= 31536000 ? i18n.t('_ago.yearsAgo', { n: Math.round(ago / 31536000).toString() }) :
+ ago >= 2592000 ? i18n.t('_ago.monthsAgo', { n: Math.round(ago / 2592000).toString() }) :
+ ago >= 604800 ? i18n.t('_ago.weeksAgo', { n: Math.round(ago / 604800).toString() }) :
+ ago >= 86400 ? i18n.t('_ago.daysAgo', { n: Math.round(ago / 86400).toString() }) :
+ ago >= 3600 ? i18n.t('_ago.hoursAgo', { n: Math.round(ago / 3600).toString() }) :
ago >= 60 ? i18n.t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
ago >= 10 ? i18n.t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
- ago >= -1 ? i18n.locale._ago.justNow :
- ago < -1 ? i18n.locale._ago.future :
- i18n.locale._ago.unknown);
+ ago >= -1 ? i18n.ts._ago.justNow :
+ ago < -1 ? i18n.ts._ago.future :
+ i18n.ts._ago.unknown);
});
function tick() {
diff --git a/packages/client/src/components/media-image.vue b/packages/client/src/components/media-image.vue
index 3e2cabae0..43639f677 100644
--- a/packages/client/src/components/media-image.vue
+++ b/packages/client/src/components/media-image.vue
@@ -20,52 +20,32 @@
-
diff --git a/packages/client/src/components/media-list.vue b/packages/client/src/components/media-list.vue
index efcbb1292..532627edb 100644
--- a/packages/client/src/components/media-list.vue
+++ b/packages/client/src/components/media-list.vue
@@ -12,8 +12,8 @@
-