Merge branch 'master' into patch-player

This commit is contained in:
Acid Chicken (硫酸鶏) 2018-08-11 19:56:05 +09:00 committed by GitHub
commit 9252c59d90
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 184 additions and 109 deletions

View file

@ -39,7 +39,7 @@ common:
weeks_ago: "Hace {} semana(s)" weeks_ago: "Hace {} semana(s)"
months_ago: "Hace {} mes(es)" months_ago: "Hace {} mes(es)"
years_ago: "Hace {} año(s)" years_ago: "Hace {} año(s)"
month-and-day: "{month}月 {day}日" month-and-day: "{day} de {month}"
trash: "Papelera" trash: "Papelera"
weekday-short: weekday-short:
sunday: "domingo" sunday: "domingo"
@ -235,13 +235,13 @@ common/views/components/messaging-room.vue:
no-history: "El historial se ha acabado" no-history: "El historial se ha acabado"
resize-form: "Arrastra para redimensionar" resize-form: "Arrastra para redimensionar"
new-message: "Nuevo mensaje" new-message: "Nuevo mensaje"
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです" only-one-file-attached: "Un único archivo se puede conectar al mensaje"
common/views/components/messaging-room.form.vue: common/views/components/messaging-room.form.vue:
input-message-here: "Escribe el mensaje aquí" input-message-here: "Escribe el mensaje aquí"
send: "Enviar" send: "Enviar"
attach-from-local: "Adjunta ficheros desde tu PC" attach-from-local: "Adjunta ficheros desde tu PC"
attach-from-drive: "Adjunta ficheros desde tu disco" attach-from-drive: "Adjunta ficheros desde tu disco"
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです" only-one-file-attached: "Un único archivo se puede conectar al mensaje"
common/views/components/messaging-room.message.vue: common/views/components/messaging-room.message.vue:
is-read: "Leer" is-read: "Leer"
deleted: "El mensaje se ha borrado" deleted: "El mensaje se ha borrado"
@ -378,56 +378,56 @@ common/views/widgets/tips.vue:
tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas" tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas"
tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\"" tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\""
tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad." tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad."
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "Cuando personalizas el inicio puedas dar click derecho a un accesorio y cambiar el diseño."
tips-line17: "「**」でテキストを囲むと**強調表示**されます" tips-line17: "Al colocar ** delante y luego del texto, lo estarás destacando en negrillas"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" tips-line19: "Algunas ventanas pueden ser separadas fuera del navegador"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" tips-line20: "El porcentaje mostrando en el accesorio de calendario indica el porcentaje de tiempo transcurrido."
tips-line21: "APIを利用してbotの開発なども行えます" tips-line21: "También puedes usar la API para desarrollar tus propios bots."
tips-line23: "まゆかわいいよまゆ" tips-line23: "Mayu is tan bonito con sus cejas."
tips-line24: "Misskeyは2014年にサービスを開始しました" tips-line24: "Misskey inició en 2014."
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます" tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
common/views/pages/follow.vue: common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "Autenticado como {}"
following: "フォロー中" following: "Siguiendo"
follow: "フォロー" follow: "Seguir"
request-pending: "フォロー許可待ち" request-pending: "Solicitud pendiente"
follow-request: "フォロー申請" follow-request: "Solicitar suscripción"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "Corta la parte que aparece como un banner"
banner: "バナー" banner: "Banner"
uploading-banner: "新しいバナーをアップロードしています" uploading-banner: "Cargando un nuevo banner"
banner-updated: "バナーを更新しました" banner-updated: "Banner actualizado"
choose-banner: "バナーにする画像を選択" choose-banner: "Escoge un banner"
avatar-crop-title: "アバターとして表示する部分を選択" avatar-crop-title: "Corta la parte que aparece como un avatar"
avatar: "アバター" avatar: "Avatar"
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "Cargando un nuevo avatar"
avatar-updated: "アバターを更新しました" avatar-updated: "Avatar actualizado"
choose-avatar: "アバターにする画像を選択" choose-avatar: "Escoge una imagen de avatar"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Negro ... Total"
notes: "Blue ... Notes" notes: "Azul ... Notas"
replies: "Red ... Replies" replies: "Rojo ... Respuestas"
renotes: "Green ... Renotes" renotes: "Verde ... Republicaciones"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "Actividad"
toggle: "表示を切り替え" toggle: "Alternar vistas"
desktop/views/components/calendar.vue: desktop/views/components/calendar.vue:
title: "{1}年 {2}月" title: "{1} / {2}"
prev: "前の月" prev: "Mes anterior"
next: "次の月" next: "Próximo mes"
go: "クリックして時間遡行" go: "Click para navegar"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "Escoger archivos"
upload: "PCからドライブにファイルをアップロード" upload: "Cargar archivos de tu dispositivo"
cancel: "キャンセル" cancel: "Cancelar"
ok: "決定" ok: "OK"
choose-prompt: "ファイルを選択" choose-prompt: "Escoger archivos"
desktop/views/components/choose-folder-from-drive-window.vue: desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル" cancel: "Cancelar"
ok: "決定" ok: "OK"
choose-prompt: "Escoge una Carpeta" choose-prompt: "Escoge una Carpeta"
desktop/views/components/crop-window.vue: desktop/views/components/crop-window.vue:
skip: "クロップをスキップ" skip: "Ignorar el cortado"
cancel: "Cancelar" cancel: "Cancelar"
ok: "OK" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
@ -438,8 +438,8 @@ desktop/views/components/drive.file.vue:
banner: "Banner" banner: "Banner"
contextmenu: contextmenu:
rename: "Renombrar" rename: "Renombrar"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "Marcar como 'sensible'"
unmark-as-sensitive: "閲覧注意を解除" unmark-as-sensitive: "Desmarcar como 'sensible'"
copy-url: "Copia la URL" copy-url: "Copia la URL"
download: "Descargar" download: "Descargar"
else-files: "Otros" else-files: "Otros"
@ -484,8 +484,8 @@ desktop/views/components/drive.vue:
upload: "Subir fichero" upload: "Subir fichero"
url-upload: "Subir desde una URL" url-upload: "Subir desde una URL"
desktop/views/components/media-image.vue: desktop/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')"
click-to-show: "クリックして表示" click-to-show: "Click para mostrar"
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -652,26 +652,26 @@ desktop/views/components/settings.vue:
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中" update-checking: "アップデートを確認中"
do-update: "アップデートを確認" do-update: "Chequear por actualizaciones"
update-settings: "詳細設定" update-settings: "Configuración avanzada"
prevent-update: "アップデートを延期する(非推奨)" prevent-update: "Posponer actualizaciones (no recomendado)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。" prevent-update-desc: "Incluso si activas esta configuración, algunas actualizaciones podrían aplicarse. Esta configuración está habilitada sólo para este dispositivo."
no-updates: "利用可能な更新はありません" no-updates: "No hay actualizaciones disponibles"
no-updates-desc: "お使いのMisskeyは最新です。" no-updates-desc: "Tu Misskey está actualizado"
update-available: "新しいバージョンが利用可能です" update-available: "Una nueva versión está disponible"
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "Las actualizaciones se aplicarán cuando actualices la página nuevamente."
advanced-settings: "高度な設定" advanced-settings: "Avanzado"
debug-mode: "デバッグモードを有効にする" debug-mode: "Habilitar modo de depuración"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "Esta configuración se ha guardado en el navegador."
experimental: "実験的機能を有効にする" experimental: "Habilitar herramientas experimentales"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "Activar esto puede hacer que tu cliente de Misskey se vuelva inestable. La configuración se ha guardado en el navegador."
tools: "ツール" tools: "Herramientas"
task-manager: "タスクマネージャ" task-manager: "Navegador de tareas"
third-parties: "サードパーティ" third-parties: "Servicios externos"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "Ver detalles..."
url: "https://www.google.co.jp/intl/ja/landing/2step/" url: "https://www.google.com/landing/2step/"
caution: "Si pierdes acceso al dispositivo, no podrás conectarte a Misskey." caution: "Si pierdes acceso al dispositivo, no podrás conectarte a Misskey."
register: "Registrar un dispositivo" register: "Registrar un dispositivo"
already-registered: "Un dispositivo ya fue registrado" already-registered: "Un dispositivo ya fue registrado"
@ -704,19 +704,19 @@ desktop/views/components/settings.password.vue:
reset: "Cambiar contraseña" reset: "Cambiar contraseña"
enter-current-password: "Ingresar contraseña actual" enter-current-password: "Ingresar contraseña actual"
enter-new-password: "Ingresar nueva contraseña" enter-new-password: "Ingresar nueva contraseña"
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "Ingresar nueva contraseña de nuevo"
not-match: "新しいパスワードが一致しません" not-match: "Las nuevas contraseñas no se corresponden consigo mismas"
changed: "パスワードを変更しました" changed: "Contraseña actualizada"
desktop/views/components/settings.profile.vue: desktop/views/components/settings.profile.vue:
avatar: "アイコン" avatar: "Avatar"
choice-avatar: "画像を選択" choice-avatar: "Escoger una imagen"
name: "名前" name: "Nombre"
location: "場所" location: "Localización"
description: "自己紹介" description: "Descripción"
birthday: "誕生日" birthday: "Fecha de nacimiento"
save: "保存" save: "Perfil actualizado"
locked-account: "アカウントの保護" locked-account: "Protege tu cuenta"
is-locked: "投稿を非公開にする" is-locked: "Crear una nota privada"
other: "その他" other: "その他"
is-bot: "このアカウントはBotです" is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです" is-cat: "このアカウントはCatです"

View file

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "5.20.0", "version": "5.21.0",
"clientVersion": "1.0.8099", "clientVersion": "1.0.8117",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -59,7 +59,7 @@
"@types/mocha": "5.2.3", "@types/mocha": "5.2.3",
"@types/mongodb": "3.1.3", "@types/mongodb": "3.1.3",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.5.7", "@types/node": "10.5.8",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
"@types/qrcode": "1.2.0", "@types/qrcode": "1.2.0",
@ -98,7 +98,7 @@
"diskusage": "0.2.4", "diskusage": "0.2.4",
"dompurify": "1.0.5", "dompurify": "1.0.5",
"elasticsearch": "15.1.1", "elasticsearch": "15.1.1",
"element-ui": "2.4.5", "element-ui": "2.4.6",
"emojilib": "2.3.0", "emojilib": "2.3.0",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "5.0.1", "eslint": "5.0.1",
@ -106,7 +106,7 @@
"eventemitter3": "3.1.0", "eventemitter3": "3.1.0",
"exif-js": "2.3.0", "exif-js": "2.3.0",
"file-loader": "1.1.11", "file-loader": "1.1.11",
"file-type": "8.1.0", "file-type": "9.0.0",
"fuckadblock": "3.2.1", "fuckadblock": "3.2.1",
"gulp": "3.9.1", "gulp": "3.9.1",
"gulp-cssnano": "2.1.3", "gulp-cssnano": "2.1.3",
@ -154,7 +154,7 @@
"monk": "6.0.6", "monk": "6.0.6",
"ms": "2.1.1", "ms": "2.1.1",
"nan": "2.10.0", "nan": "2.10.0",
"node-sass": "4.9.2", "node-sass": "4.9.3",
"node-sass-json-importer": "3.3.1", "node-sass-json-importer": "3.3.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"object-assign-deep": "0.4.0", "object-assign-deep": "0.4.0",
@ -171,7 +171,7 @@
"recaptcha-promise": "0.1.3", "recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2", "reconnecting-websocket": "3.2.2",
"redis": "2.8.0", "redis": "2.8.0",
"request": "2.87.0", "request": "2.88.0",
"request-promise-native": "1.0.5", "request-promise-native": "1.0.5",
"rimraf": "2.6.2", "rimraf": "2.6.2",
"rndstr": "1.0.0", "rndstr": "1.0.0",
@ -187,7 +187,7 @@
"style-loader": "0.22.1", "style-loader": "0.22.1",
"stylus": "0.54.5", "stylus": "0.54.5",
"stylus-loader": "3.0.2", "stylus-loader": "3.0.2",
"summaly": "2.0.6", "summaly": "2.1.2",
"systeminformation": "3.42.9", "systeminformation": "3.42.9",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",

View file

@ -1,6 +1,8 @@
<template> <template>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-if="disablePreview"></router-link> <span class="mk-avatar" :title="user | acct" :style="style" v-if="disableLink && !disablePreview" v-user-preview="user.id" @click="onClick"></span>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else v-user-preview="user.id"></router-link> <span class="mk-avatar" :title="user | acct" :style="style" v-else-if="disableLink && disablePreview" @click="onClick"></span>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else-if="!disableLink && !disablePreview" v-user-preview="user.id"></router-link>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else-if="!disableLink && disablePreview"></router-link>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -15,6 +17,10 @@ export default Vue.extend({
required: false, required: false,
default: null default: null
}, },
disableLink: {
required: false,
default: false
},
disablePreview: { disablePreview: {
required: false, required: false,
default: false default: false
@ -35,6 +41,11 @@ export default Vue.extend({
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
}; };
} }
},
methods: {
onClick(e) {
this.$emit('click', e);
}
} }
}); });
</script> </script>

View file

@ -73,18 +73,19 @@ export default Vue.extend({
twttr.ready = loadTweet; twttr.ready = loadTweet;
(window as any).twttr = twttr; (window as any).twttr = twttr;
} }
} else { return;
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { }
res.json().then(info => { fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
res.json().then(info => {
if (info.url != null) {
this.title = info.title; this.title = info.title;
this.description = info.description; this.description = info.description;
this.thumbnail = info.thumbnail; this.thumbnail = info.thumbnail;
this.player = info.player;
this.icon = info.icon; this.icon = info.icon;
this.sitename = info.sitename; this.sitename = info.sitename;
this.fetching = false; this.fetching = false;
}); }
}); });
} }
} }

View file

@ -18,7 +18,7 @@
<div class="about"> <div class="about">
<h1 v-if="name != 'Misskey'">{{ name }}</h1> <h1 v-if="name != 'Misskey'">{{ name }}</h1>
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
<p class="powerd-by" v-if="name != 'Misskey'">%i18n:@powered-by-misskey%</p> <p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p>
<p class="desc" v-html="description || '%i18n:common.about%'"></p> <p class="desc" v-html="description || '%i18n:common.about%'"></p>
<a ref="signup" @click="signup">📦 %i18n:@signup%</a> <a ref="signup" @click="signup">📦 %i18n:@signup%</a>
</div> </div>

View file

@ -6,10 +6,11 @@
<div class="banner" <div class="banner"
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''" :style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
title="%i18n:@update-banner%" title="%i18n:@update-banner%"
@click="os.apis.updateBanner" @click="() => os.apis.updateBanner()"
></div> ></div>
<mk-avatar class="avatar" :user="$store.state.i" <mk-avatar class="avatar" :user="$store.state.i"
@click="os.apis.updateAvatar" :disable-link="true"
@click="() => os.apis.updateAvatar()"
title="%i18n:@update-avatar%" title="%i18n:@update-avatar%"
/> />
<router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link> <router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>

View file

@ -0,0 +1,41 @@
name: "DriveFolder"
desc:
ja: "ドライブのフォルダを表します。"
en: "A folder of Drive."
props:
id:
type: "id"
optional: false
desc:
ja: "フォルダID"
en: "The ID of this folder"
createdAt:
type: "date"
optional: false
desc:
ja: "作成日時"
en: "The created date of this folder"
userId:
type: "id(User)"
optional: false
desc:
ja: "所有者ID"
en: "The ID of the owner of this folder"
parentId:
type: "entity(DriveFolder)"
optional: false
desc:
ja: "親フォルダのID (ルートなら null)"
en: "The ID of parent folder"
name:
type: "string"
optional: false
desc:
ja: "フォルダ名"
en: "The name of this folder"

View file

@ -10,7 +10,7 @@ import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumb
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files'); const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
DriveFile.createIndex('md5'); DriveFile.createIndex('md5');
DriveFile.createIndex('metadata.uri', { sparse: true, unique: true }); DriveFile.createIndex(['metadata.uri', 'metadata.userId'], { sparse: true, unique: true });
export default DriveFile; export default DriveFile;
export const DriveFileChunk = monkDb.get('driveFiles.chunks'); export const DriveFileChunk = monkDb.get('driveFiles.chunks');

View file

@ -7,7 +7,7 @@ export default async (job: bq.Job, done: any): Promise<void> => {
await request(job.data.user, job.data.to, job.data.content); await request(job.data.user, job.data.to, job.data.content);
done(); done();
} catch (res) { } catch (res) {
if (!res.hasOwnProperty('statusCode')) { if (res == null || !res.hasOwnProperty('statusCode')) {
console.warn(`deliver failed (unknown): ${res}`); console.warn(`deliver failed (unknown): ${res}`);
return done(); return done();
} }

View file

@ -14,7 +14,9 @@ module.exports = async (ctx: Koa.Context) => {
ctx.body = summary; ctx.body = summary;
} catch (e) { } catch (e) {
ctx.status = 500; ctx.status = 200;
ctx.set('Cache-Control', 'max-age=86400, immutable');
ctx.body = '{}';
} }
}; };

View file

@ -294,16 +294,35 @@ export default async function(
metadata.uri = uri; metadata.uri = uri;
} }
const driveFile = isLink let driveFile: IDriveFile;
? await DriveFile.insert({
length: 0, if (isLink) {
uploadDate: new Date(), try {
md5: hash, driveFile = await DriveFile.insert({
filename: detectedName, length: 0,
metadata: metadata, uploadDate: new Date(),
contentType: mime md5: hash,
}) filename: detectedName,
: await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata)); metadata: metadata,
contentType: mime
});
} catch (e) {
// duplicate key error (when already registered)
if (e.code === 11000) {
log(`already registered ${metadata.uri}`);
driveFile = await DriveFile.findOne({
'metadata.uri': metadata.uri,
'metadata.userId': user._id
});
} else {
console.error(e);
throw e;
}
}
} else {
driveFile = await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata));
}
log(`drive file has been created ${driveFile._id}`); log(`drive file has been created ${driveFile._id}`);