Fix bug
This commit is contained in:
		
							parent
							
								
									2e6905c74c
								
							
						
					
					
						commit
						b20b975935
					
				
					 48 changed files with 146 additions and 158 deletions
				
			
		|  | @ -7,7 +7,7 @@ import locale from '../../locales'; | |||
| export default class Replacer { | ||||
| 	private lang: string; | ||||
| 
 | ||||
| 	public pattern = /%i18n:([a-z0-9_\-\.\/\|\!]+?)%/g; | ||||
| 	public pattern = /%i18n:([a-z0-9_\-\.\/\|]+?)%/g; | ||||
| 
 | ||||
| 	constructor(lang: string) { | ||||
| 		this.lang = lang; | ||||
|  | @ -56,11 +56,6 @@ export default class Replacer { | |||
| 	public replacement(match, key) { | ||||
| 		let path = null; | ||||
| 
 | ||||
| 		const shouldEscape = key[0] == '!'; | ||||
| 		if (shouldEscape) { | ||||
| 			key = key.substr(1); | ||||
| 		} | ||||
| 
 | ||||
| 		if (key.indexOf('|') != -1) { | ||||
| 			path = key.split('|')[0]; | ||||
| 			key = key.split('|')[1]; | ||||
|  | @ -68,8 +63,6 @@ export default class Replacer { | |||
| 
 | ||||
| 		const txt = this.get(path, key); | ||||
| 
 | ||||
| 		return shouldEscape | ||||
| 			? txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22') | ||||
| 			: txt.replace(/"/g, '"'); | ||||
| 		return txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22'); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ export default async function(mios: MiOS, force = false, silent = false) { | |||
| 		} | ||||
| 
 | ||||
| 		if (!silent) { | ||||
| 			alert('%i18n:!common.update-available%'.replace('{newer}', newer).replace('{current}', current)); | ||||
| 			alert('%i18n:common.update-available%'.replace('{newer}', newer).replace('{current}', current)); | ||||
| 		} | ||||
| 
 | ||||
| 		return newer; | ||||
|  |  | |||
|  | @ -62,7 +62,7 @@ export class HomeStream extends Stream { | |||
| 		// トークンが再生成されたとき
 | ||||
| 		// このままではMisskeyが利用できないので強制的にサインアウトさせる
 | ||||
| 		this.on('my_token_regenerated', () => { | ||||
| 			alert('%i18n:!common.my-token-regenerated%'); | ||||
| 			alert('%i18n:common.my-token-regenerated%'); | ||||
| 			os.signout(); | ||||
| 		}); | ||||
| 	} | ||||
|  |  | |||
|  | @ -8,21 +8,21 @@ | |||
| 					<template v-if="network">%fa:check%</template> | ||||
| 					<template v-if="!network">%fa:times%</template> | ||||
| 				</template> | ||||
| 				{{ network == null ? '%i18n:!@checking-network%' : '%i18n:!@network%' }}<mk-ellipsis v-if="network == null"/> | ||||
| 				{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/> | ||||
| 			</p> | ||||
| 			<p v-if="network == true" :data-wip="internet == null"> | ||||
| 				<template v-if="internet != null"> | ||||
| 					<template v-if="internet">%fa:check%</template> | ||||
| 					<template v-if="!internet">%fa:times%</template> | ||||
| 				</template> | ||||
| 				{{ internet == null ? '%i18n:!@checking-internet%' : '%i18n:!@internet%' }}<mk-ellipsis v-if="internet == null"/> | ||||
| 				{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/> | ||||
| 			</p> | ||||
| 			<p v-if="internet == true" :data-wip="server == null"> | ||||
| 				<template v-if="server != null"> | ||||
| 					<template v-if="server">%fa:check%</template> | ||||
| 					<template v-if="!server">%fa:times%</template> | ||||
| 				</template> | ||||
| 				{{ server == null ? '%i18n:!@checking-server%' : '%i18n:!@server%' }}<mk-ellipsis v-if="server == null"/> | ||||
| 				{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/> | ||||
| 			</p> | ||||
| 		</div> | ||||
| 		<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p> | ||||
|  |  | |||
|  | @ -3,9 +3,9 @@ | |||
| 	<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/> | ||||
| 	<h1>%i18n:@title%</h1> | ||||
| 	<p class="text"> | ||||
| 		<span>{{ '%i18n:!@description%'.substr(0, '%i18n:!@description%'.indexOf('{')) }}</span> | ||||
| 		<a @click="reload">{{ '%i18n:!@description%'.match(/\{(.+?)\}/)[1] }}</a> | ||||
| 		<span>{{ '%i18n:!@description%'.substr('%i18n:!@description%'.indexOf('}') + 1) }}</span> | ||||
| 		<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span> | ||||
| 		<a @click="reload">{{ '%i18n:@description%'.match(/\{(.+?)\}/)[1] }}</a> | ||||
| 		<span>{{ '%i18n:@description%'.substr('%i18n:@description%'.indexOf('}') + 1) }}</span> | ||||
| 	</p> | ||||
| 	<button v-if="!troubleshooting" @click="troubleshooting = true">%i18n:@troubleshoot%</button> | ||||
| 	<x-troubleshooter v-if="troubleshooting"/> | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| 		<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> | ||||
| 		<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> | ||||
| 		<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages"> | ||||
| 			<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:!common.loading%' : '%i18n:!@more%' }} | ||||
| 			<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }} | ||||
| 		</button> | ||||
| 		<template v-for="(message, i) in _messages"> | ||||
| 			<x-message :message="message" :key="message.id"/> | ||||
|  | @ -172,7 +172,7 @@ export default Vue.extend({ | |||
| 				}); | ||||
| 			} else if (message.userId != (this as any).os.i.id) { | ||||
| 				// Notify | ||||
| 				this.notify('%i18n:!@new-message%'); | ||||
| 				this.notify('%i18n:@new-message%'); | ||||
| 			} | ||||
| 		}, | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 	</p> | ||||
| 	<ul ref="choices"> | ||||
| 		<li v-for="(choice, i) in choices"> | ||||
| 			<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:!@choice-n%'.replace('{}', i + 1)"> | ||||
| 			<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)"> | ||||
| 			<button @click="remove(i)" title="%i18n:@remove%"> | ||||
| 				%fa:times% | ||||
| 			</button> | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| <template> | ||||
| <div class="mk-poll" :data-is-voted="isVoted"> | ||||
| 	<ul> | ||||
| 		<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:!@vote-to%'.replace('{}', choice.text) : ''"> | ||||
| 		<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''"> | ||||
| 			<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div> | ||||
| 			<span> | ||||
| 				<template v-if="choice.isVoted">%fa:check%</template> | ||||
| 				<span>{{ choice.text }}</span> | ||||
| 				<span class="votes" v-if="showResult">({{ '%i18n:!@vote-count%'.replace('{}', choice.votes) }})</span> | ||||
| 				<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span> | ||||
| 			</span> | ||||
| 		</li> | ||||
| 	</ul> | ||||
| 	<p v-if="total > 0"> | ||||
| 		<span>{{ '%i18n:!@total-users%'.replace('{}', total) }}</span> | ||||
| 		<span>{{ '%i18n:@total-users%'.replace('{}', total) }}</span> | ||||
| 		<span>・</span> | ||||
| 		<a v-if="!isVoted" @click="toggleShowResult">{{ showResult ? '%i18n:!@vote%' : '%i18n:!@show-result%' }}</a> | ||||
| 		<a v-if="!isVoted" @click="toggleShowResult">{{ showResult ? '%i18n:@vote%' : '%i18n:@show-result%' }}</a> | ||||
| 		<span v-if="isVoted">%i18n:@voted%</span> | ||||
| 	</p> | ||||
| </div> | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ | |||
| import Vue from 'vue'; | ||||
| import * as anime from 'animejs'; | ||||
| 
 | ||||
| const placeholder = '%i18n:!@choose-reaction%'; | ||||
| const placeholder = '%i18n:@choose-reaction%'; | ||||
| 
 | ||||
| export default Vue.extend({ | ||||
| 	props: ['note', 'source', 'compact', 'cb'], | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ | |||
| 	<label class="token" v-if="user && user.twoFactorEnabled"> | ||||
| 		<input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock% | ||||
| 	</label> | ||||
| 	<button type="submit" :disabled="signing">{{ signing ? '%i18n:!@signing-in%' : '%i18n:!@signin%' }}</button> | ||||
| 	<button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</button> | ||||
| 	もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> | ||||
| </form> | ||||
| </template> | ||||
|  |  | |||
|  | @ -127,7 +127,7 @@ export default Vue.extend({ | |||
| 					location.href = '/'; | ||||
| 				}); | ||||
| 			}).catch(() => { | ||||
| 				alert('%i18n:!@some-error%'); | ||||
| 				alert('%i18n:@some-error%'); | ||||
| 
 | ||||
| 				(window as any).grecaptcha.reset(); | ||||
| 				this.recaptchaed = false; | ||||
|  |  | |||
|  | @ -44,16 +44,16 @@ export default Vue.extend({ | |||
| 			const time = this._time; | ||||
| 			const ago = (this.now.getTime() - time.getTime()) / 1000/*ms*/; | ||||
| 			return ( | ||||
| 				ago >= 31536000 ? '%i18n:!common.time.years_ago%'  .replace('{}', (~~(ago / 31536000)).toString()) : | ||||
| 				ago >= 2592000  ? '%i18n:!common.time.months_ago%' .replace('{}', (~~(ago / 2592000)).toString()) : | ||||
| 				ago >= 604800   ? '%i18n:!common.time.weeks_ago%'  .replace('{}', (~~(ago / 604800)).toString()) : | ||||
| 				ago >= 86400    ? '%i18n:!common.time.days_ago%'   .replace('{}', (~~(ago / 86400)).toString()) : | ||||
| 				ago >= 3600     ? '%i18n:!common.time.hours_ago%'  .replace('{}', (~~(ago / 3600)).toString()) : | ||||
| 				ago >= 60       ? '%i18n:!common.time.minutes_ago%'.replace('{}', (~~(ago / 60)).toString()) : | ||||
| 				ago >= 10       ? '%i18n:!common.time.seconds_ago%'.replace('{}', (~~(ago % 60)).toString()) : | ||||
| 				ago >= 0        ? '%i18n:!common.time.just_now%' : | ||||
| 				ago <  0        ? '%i18n:!common.time.future%' : | ||||
| 				'%i18n:!common.time.unknown%'); | ||||
| 				ago >= 31536000 ? '%i18n:common.time.years_ago%'  .replace('{}', (~~(ago / 31536000)).toString()) : | ||||
| 				ago >= 2592000  ? '%i18n:common.time.months_ago%' .replace('{}', (~~(ago / 2592000)).toString()) : | ||||
| 				ago >= 604800   ? '%i18n:common.time.weeks_ago%'  .replace('{}', (~~(ago / 604800)).toString()) : | ||||
| 				ago >= 86400    ? '%i18n:common.time.days_ago%'   .replace('{}', (~~(ago / 86400)).toString()) : | ||||
| 				ago >= 3600     ? '%i18n:common.time.hours_ago%'  .replace('{}', (~~(ago / 3600)).toString()) : | ||||
| 				ago >= 60       ? '%i18n:common.time.minutes_ago%'.replace('{}', (~~(ago / 60)).toString()) : | ||||
| 				ago >= 10       ? '%i18n:common.time.seconds_ago%'.replace('{}', (~~(ago % 60)).toString()) : | ||||
| 				ago >= 0        ? '%i18n:common.time.just_now%' : | ||||
| 				ago <  0        ? '%i18n:common.time.future%' : | ||||
| 				'%i18n:common.time.unknown%'); | ||||
| 		} | ||||
| 	}, | ||||
| 	created() { | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| 	<p>%i18n:@description%<a :href="`${docsUrl}/link-to-twitter`" target="_blank">%i18n:@detail%</a></p> | ||||
| 	<p class="account" v-if="os.i.twitter" :title="`Twitter ID: ${os.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p> | ||||
| 	<p> | ||||
| 		<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:!@reconnect%' : '%i18n:!@connect%' }}</a> | ||||
| 		<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a> | ||||
| 		<span v-if="os.i.twitter"> or </span> | ||||
| 		<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a> | ||||
| 	</p> | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
| 		</svg> | ||||
| 	</div> | ||||
| 	<p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> | ||||
| 	<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:!@no-broadcasts%' : broadcasts[i].title }}</h1> | ||||
| 	<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:@no-broadcasts%' : broadcasts[i].title }}</h1> | ||||
| 	<p v-if="!fetching"> | ||||
| 		<span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span> | ||||
| 		<template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template> | ||||
|  |  | |||
|  | @ -3,9 +3,9 @@ | |||
| 	<article> | ||||
| 		<h1>%fa:heart%%i18n:@title%</h1> | ||||
| 		<p> | ||||
| 			{{ '%i18n:!@text%'.substr(0, '%i18n:!@text%'.indexOf('{')) }} | ||||
| 			{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} | ||||
| 			<a href="https://syuilo.com">@syuilo</a> | ||||
| 			{{ '%i18n:!@text%'.substr('%i18n:!@text%'.indexOf('}') + 1) }} | ||||
| 			{{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} | ||||
| 		</p> | ||||
| 	</article> | ||||
| </div> | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| <div class="mk-calendar" :data-melt="design == 4 || design == 5"> | ||||
| 	<template v-if="design == 0 || design == 1"> | ||||
| 		<button @click="prev" title="%i18n:@prev%">%fa:chevron-circle-left%</button> | ||||
| 		<p class="title">{{ '%i18n:!@title%'.replace('{1}', year).replace('{2}', month) }}</p> | ||||
| 		<p class="title">{{ '%i18n:@title%'.replace('{1}', year).replace('{2}', month) }}</p> | ||||
| 		<button @click="next" title="%i18n:@next%">%fa:chevron-circle-right%</button> | ||||
| 	</template> | ||||
| 
 | ||||
|  | @ -21,7 +21,7 @@ | |||
| 			:data-is-out-of-range="isOutOfRange(i + 1)" | ||||
| 			:data-is-donichi="isDonichi(i + 1)" | ||||
| 			@click="go(i + 1)" | ||||
| 			:title="isOutOfRange(i + 1) ? null : '%i18n:!@go%'" | ||||
| 			:title="isOutOfRange(i + 1) ? null : '%i18n:@go%'" | ||||
| 		> | ||||
| 			<div>{{ i + 1 }}</div> | ||||
| 		</div> | ||||
|  | @ -58,13 +58,13 @@ export default Vue.extend({ | |||
| 			month: new Date().getMonth() + 1, | ||||
| 			selected: new Date(), | ||||
| 			weekdayText: [ | ||||
| 				'%i18n:!common.weekday-short.sunday%', | ||||
| 				'%i18n:!common.weekday-short.monday%', | ||||
| 				'%i18n:!common.weekday-short.tuesday%', | ||||
| 				'%i18n:!common.weekday-short.wednesday%', | ||||
| 				'%i18n:!common.weekday-short.thursday%', | ||||
| 				'%i18n:!common.weekday-short.friday%', | ||||
| 				'%i18n:!common.weekday-short.saturday%' | ||||
| 				'%i18n:common.weekday-short.sunday%', | ||||
| 				'%i18n:common.weekday-short.monday%', | ||||
| 				'%i18n:common.weekday-short.tuesday%', | ||||
| 				'%i18n:common.weekday-short.wednesday%', | ||||
| 				'%i18n:common.weekday-short.thursday%', | ||||
| 				'%i18n:common.weekday-short.friday%', | ||||
| 				'%i18n:common.weekday-short.saturday%' | ||||
| 			] | ||||
| 		}; | ||||
| 	}, | ||||
|  |  | |||
|  | @ -64,46 +64,46 @@ export default Vue.extend({ | |||
| 			this.isContextmenuShowing = true; | ||||
| 			contextmenu(e, [{ | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.rename%', | ||||
| 				text: '%i18n:@contextmenu.rename%', | ||||
| 				icon: '%fa:i-cursor%', | ||||
| 				onClick: this.rename | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.copy-url%', | ||||
| 				text: '%i18n:@contextmenu.copy-url%', | ||||
| 				icon: '%fa:link%', | ||||
| 				onClick: this.copyUrl | ||||
| 			}, { | ||||
| 				type: 'link', | ||||
| 				href: `${this.file.url}?download`, | ||||
| 				text: '%i18n:!@contextmenu.download%', | ||||
| 				text: '%i18n:@contextmenu.download%', | ||||
| 				icon: '%fa:download%', | ||||
| 			}, { | ||||
| 				type: 'divider', | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!common.delete%', | ||||
| 				text: '%i18n:common.delete%', | ||||
| 				icon: '%fa:R trash-alt%', | ||||
| 				onClick: this.deleteFile | ||||
| 			}, { | ||||
| 				type: 'divider', | ||||
| 			}, { | ||||
| 				type: 'nest', | ||||
| 				text: '%i18n:!@contextmenu.else-files%', | ||||
| 				text: '%i18n:@contextmenu.else-files%', | ||||
| 				menu: [{ | ||||
| 					type: 'item', | ||||
| 					text: '%i18n:!@contextmenu.set-as-avatar%', | ||||
| 					text: '%i18n:@contextmenu.set-as-avatar%', | ||||
| 					onClick: this.setAsAvatar | ||||
| 				}, { | ||||
| 					type: 'item', | ||||
| 					text: '%i18n:!@contextmenu.set-as-banner%', | ||||
| 					text: '%i18n:@contextmenu.set-as-banner%', | ||||
| 					onClick: this.setAsBanner | ||||
| 				}] | ||||
| 			}, { | ||||
| 				type: 'nest', | ||||
| 				text: '%i18n:!@contextmenu.open-in-app%', | ||||
| 				text: '%i18n:@contextmenu.open-in-app%', | ||||
| 				menu: [{ | ||||
| 					type: 'item', | ||||
| 					text: '%i18n:!@contextmenu.add-app%...', | ||||
| 					text: '%i18n:@contextmenu.add-app%...', | ||||
| 					onClick: this.addApp | ||||
| 				}] | ||||
| 			}], { | ||||
|  | @ -141,8 +141,8 @@ export default Vue.extend({ | |||
| 
 | ||||
| 		rename() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@contextmenu.rename-file%', | ||||
| 				placeholder: '%i18n:!@contextmenu.input-new-file-name%', | ||||
| 				title: '%i18n:@contextmenu.rename-file%', | ||||
| 				placeholder: '%i18n:@contextmenu.input-new-file-name%', | ||||
| 				default: this.file.name, | ||||
| 				allowEmpty: false | ||||
| 			}).then(name => { | ||||
|  | @ -157,9 +157,9 @@ export default Vue.extend({ | |||
| 			copyToClipboard(this.file.url); | ||||
| 			(this as any).apis.dialog({ | ||||
| 				title: '%fa:check%%i18n:@contextmenu.copied%', | ||||
| 				text: '%i18n:!@contextmenu.copied-url-to-clipboard%', | ||||
| 				text: '%i18n:@contextmenu.copied-url-to-clipboard%', | ||||
| 				actions: [{ | ||||
| 					text: '%i18n:!common.ok%' | ||||
| 					text: '%i18n:common.ok%' | ||||
| 				}] | ||||
| 			}); | ||||
| 		}, | ||||
|  |  | |||
|  | @ -54,26 +54,26 @@ export default Vue.extend({ | |||
| 			this.isContextmenuShowing = true; | ||||
| 			contextmenu(e, [{ | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.move-to-this-folder%', | ||||
| 				text: '%i18n:@contextmenu.move-to-this-folder%', | ||||
| 				icon: '%fa:arrow-right%', | ||||
| 				onClick: this.go | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.show-in-new-window%', | ||||
| 				text: '%i18n:@contextmenu.show-in-new-window%', | ||||
| 				icon: '%fa:R window-restore%', | ||||
| 				onClick: this.newWindow | ||||
| 			}, { | ||||
| 				type: 'divider', | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.rename%', | ||||
| 				text: '%i18n:@contextmenu.rename%', | ||||
| 				icon: '%fa:i-cursor%', | ||||
| 				onClick: this.rename | ||||
| 			}, { | ||||
| 				type: 'divider', | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!common.delete%', | ||||
| 				text: '%i18n:common.delete%', | ||||
| 				icon: '%fa:R trash-alt%', | ||||
| 				onClick: this.deleteFolder | ||||
| 			}], { | ||||
|  | @ -159,15 +159,15 @@ export default Vue.extend({ | |||
| 					switch (err) { | ||||
| 						case 'detected-circular-definition': | ||||
| 							(this as any).apis.dialog({ | ||||
| 								title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%', | ||||
| 								text: '%i18n:!@circular-reference-detected%', | ||||
| 								title: '%fa:exclamation-triangle%%i18n:@unable-to-process%', | ||||
| 								text: '%i18n:@circular-reference-detected%', | ||||
| 								actions: [{ | ||||
| 									text: '%i18n:!common.ok%' | ||||
| 									text: '%i18n:common.ok%' | ||||
| 								}] | ||||
| 							}); | ||||
| 							break; | ||||
| 						default: | ||||
| 							alert('%i18n:!@unhandled-error% ' + err); | ||||
| 							alert('%i18n:@unhandled-error% ' + err); | ||||
| 					} | ||||
| 				}); | ||||
| 			} | ||||
|  | @ -199,8 +199,8 @@ export default Vue.extend({ | |||
| 
 | ||||
| 		rename() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@contextmenu.rename-folder%', | ||||
| 				placeholder: '%i18n:!@contextmenu.input-new-folder-name%', | ||||
| 				title: '%i18n:@contextmenu.rename-folder%', | ||||
| 				placeholder: '%i18n:@contextmenu.input-new-folder-name%', | ||||
| 				default: this.folder.name | ||||
| 			}).then(name => { | ||||
| 				(this as any).api('drive/folders/update', { | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| 	@drop.stop="onDrop" | ||||
| > | ||||
| 	<template v-if="folder == null">%fa:cloud%</template> | ||||
| 	<span>{{ folder == null ? '%i18n:!@drive%' : folder.name }}</span> | ||||
| 	<span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span> | ||||
| </div> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -138,17 +138,17 @@ export default Vue.extend({ | |||
| 		onContextmenu(e) { | ||||
| 			contextmenu(e, [{ | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.create-folder%', | ||||
| 				text: '%i18n:@contextmenu.create-folder%', | ||||
| 				icon: '%fa:R folder%', | ||||
| 				onClick: this.createFolder | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.upload%', | ||||
| 				text: '%i18n:@contextmenu.upload%', | ||||
| 				icon: '%fa:upload%', | ||||
| 				onClick: this.selectLocalFile | ||||
| 			}, { | ||||
| 				type: 'item', | ||||
| 				text: '%i18n:!@contextmenu.url-upload%', | ||||
| 				text: '%i18n:@contextmenu.url-upload%', | ||||
| 				icon: '%fa:cloud-upload-alt%', | ||||
| 				onClick: this.urlUpload | ||||
| 			}]); | ||||
|  | @ -306,15 +306,15 @@ export default Vue.extend({ | |||
| 					switch (err) { | ||||
| 						case 'detected-circular-definition': | ||||
| 							(this as any).apis.dialog({ | ||||
| 								title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%', | ||||
| 								text: '%i18n:!@circular-reference-detected%', | ||||
| 								title: '%fa:exclamation-triangle%%i18n:@unable-to-process%', | ||||
| 								text: '%i18n:@circular-reference-detected%', | ||||
| 								actions: [{ | ||||
| 									text: '%i18n:!common.ok%' | ||||
| 									text: '%i18n:common.ok%' | ||||
| 								}] | ||||
| 							}); | ||||
| 							break; | ||||
| 						default: | ||||
| 							alert('%i18n:!@unhandled-error% ' + err); | ||||
| 							alert('%i18n:@unhandled-error% ' + err); | ||||
| 					} | ||||
| 				}); | ||||
| 			} | ||||
|  | @ -327,8 +327,8 @@ export default Vue.extend({ | |||
| 
 | ||||
| 		urlUpload() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@url-upload%', | ||||
| 				placeholder: '%i18n:!@url-of-file%' | ||||
| 				title: '%i18n:@url-upload%', | ||||
| 				placeholder: '%i18n:@url-of-file%' | ||||
| 			}).then(url => { | ||||
| 				(this as any).api('drive/files/upload_from_url', { | ||||
| 					url: url, | ||||
|  | @ -337,9 +337,9 @@ export default Vue.extend({ | |||
| 
 | ||||
| 				(this as any).apis.dialog({ | ||||
| 					title: '%fa:check%%i18n:@url-upload-requested%', | ||||
| 					text: '%i18n:!@may-take-time%', | ||||
| 					text: '%i18n:@may-take-time%', | ||||
| 					actions: [{ | ||||
| 						text: '%i18n:!common.ok%' | ||||
| 						text: '%i18n:common.ok%' | ||||
| 					}] | ||||
| 				}); | ||||
| 			}); | ||||
|  | @ -347,8 +347,8 @@ export default Vue.extend({ | |||
| 
 | ||||
| 		createFolder() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@create-folder%', | ||||
| 				placeholder: '%i18n:!@folder-name%' | ||||
| 				title: '%i18n:@create-folder%', | ||||
| 				placeholder: '%i18n:@folder-name%' | ||||
| 			}).then(name => { | ||||
| 				(this as any).api('drive/folders/create', { | ||||
| 					name: name, | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| <template> | ||||
| <mk-window width="400px" height="550px" @closed="$destroy"> | ||||
| 	<span slot="header" :class="$style.header"> | ||||
| 		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@followers%.replace('{}', {{ user | userName }}) | ||||
| 		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:@followers%.replace('{}', {{ user | userName }}) | ||||
| 	</span> | ||||
| 	<mk-followers :user="user"/> | ||||
| </mk-window> | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| <template> | ||||
| <mk-window width="400px" height="550px" @closed="$destroy"> | ||||
| 	<span slot="header" :class="$style.header"> | ||||
| 		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@following%.replace('{}', {{ user | userName }}) | ||||
| 		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:@following%.replace('{}', {{ user | userName }}) | ||||
| 	</span> | ||||
| 	<mk-following :user="user"/> | ||||
| </mk-window> | ||||
|  |  | |||
|  | @ -6,9 +6,9 @@ | |||
| 	<div class="renote" v-if="isRenote"> | ||||
| 		<mk-avatar class="avatar" :user="note.user"/> | ||||
| 		%fa:retweet% | ||||
| 		<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span> | ||||
| 		<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span> | ||||
| 		<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a> | ||||
| 		<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span> | ||||
| 		<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span> | ||||
| 		<mk-time :time="note.createdAt"/> | ||||
| 	</div> | ||||
| 	<article> | ||||
|  |  | |||
|  | @ -81,7 +81,7 @@ | |||
| 		</transition-group> | ||||
| 	</div> | ||||
| 	<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> | ||||
| 		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }} | ||||
| 		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} | ||||
| 	</button> | ||||
| 	<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p> | ||||
| 	<p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> | ||||
|  |  | |||
|  | @ -4,8 +4,8 @@ | |||
| 		<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span> | ||||
| 		<span v-if="!reply">%i18n:@note%</span> | ||||
| 		<span v-if="reply">%i18n:@reply%</span> | ||||
| 		<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:!@attaches%'.replace('{}', media.length) }}</span> | ||||
| 		<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:!@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> | ||||
| 		<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span> | ||||
| 		<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> | ||||
| 	</span> | ||||
| 
 | ||||
| 	<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/> | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ | |||
| 	<button class="visibility" title="公開範囲" @click="setVisibility" ref="visibilityButton">%fa:lock%</button> | ||||
| 	<p class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</p> | ||||
| 	<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post"> | ||||
| 		{{ posting ? '%i18n:!@posting%' : submitText }}<mk-ellipsis v-if="posting"/> | ||||
| 		{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/> | ||||
| 	</button> | ||||
| 	<input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/> | ||||
| 	<div class="dropzone" v-if="draghover"></div> | ||||
|  | @ -86,18 +86,18 @@ export default Vue.extend({ | |||
| 
 | ||||
| 		placeholder(): string { | ||||
| 			return this.renote | ||||
| 				? '%i18n:!@quote-placeholder%' | ||||
| 				? '%i18n:@quote-placeholder%' | ||||
| 				: this.reply | ||||
| 					? '%i18n:!@reply-placeholder%' | ||||
| 					: '%i18n:!@note-placeholder%'; | ||||
| 					? '%i18n:@reply-placeholder%' | ||||
| 					: '%i18n:@note-placeholder%'; | ||||
| 		}, | ||||
| 
 | ||||
| 		submitText(): string { | ||||
| 			return this.renote | ||||
| 				? '%i18n:!@renote%' | ||||
| 				? '%i18n:@renote%' | ||||
| 				: this.reply | ||||
| 					? '%i18n:!@reply%' | ||||
| 					: '%i18n:!@note%'; | ||||
| 					? '%i18n:@reply%' | ||||
| 					: '%i18n:@note%'; | ||||
| 		}, | ||||
| 
 | ||||
| 		canPost(): boolean { | ||||
|  | @ -304,16 +304,16 @@ export default Vue.extend({ | |||
| 				this.deleteDraft(); | ||||
| 				this.$emit('posted'); | ||||
| 				(this as any).apis.notify(this.renote | ||||
| 					? '%i18n:!@reposted%' | ||||
| 					? '%i18n:@reposted%' | ||||
| 					: this.reply | ||||
| 						? '%i18n:!@replied%' | ||||
| 						: '%i18n:!@posted%'); | ||||
| 						? '%i18n:@replied%' | ||||
| 						: '%i18n:@posted%'); | ||||
| 			}).catch(err => { | ||||
| 				(this as any).apis.notify(this.renote | ||||
| 					? '%i18n:!@renote-failed%' | ||||
| 					? '%i18n:@renote-failed%' | ||||
| 					: this.reply | ||||
| 						? '%i18n:!@reply-failed%' | ||||
| 						: '%i18n:!@note-failed%'); | ||||
| 						? '%i18n:@reply-failed%' | ||||
| 						: '%i18n:@note-failed%'); | ||||
| 			}).then(() => { | ||||
| 				this.posting = false; | ||||
| 			}); | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 		<footer> | ||||
| 			<a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a> | ||||
| 			<button class="ui cancel" @click="cancel">%i18n:@cancel%</button> | ||||
| 			<button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:!@reposting%' : '%i18n:!@renote%' }}</button> | ||||
| 			<button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:@reposting%' : '%i18n:@renote%' }}</button> | ||||
| 		</footer> | ||||
| 	</template> | ||||
| 	<template v-if="quote"> | ||||
|  | @ -32,9 +32,9 @@ export default Vue.extend({ | |||
| 				renoteId: this.note.id | ||||
| 			}).then(data => { | ||||
| 				this.$emit('posted'); | ||||
| 				(this as any).apis.notify('%i18n:!@success%'); | ||||
| 				(this as any).apis.notify('%i18n:@success%'); | ||||
| 			}).catch(err => { | ||||
| 				(this as any).apis.notify('%i18n:!@failure%'); | ||||
| 				(this as any).apis.notify('%i18n:@failure%'); | ||||
| 			}).then(() => { | ||||
| 				this.wait = false; | ||||
| 			}); | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ export default Vue.extend({ | |||
| 	methods: { | ||||
| 		register() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@enter-password%', | ||||
| 				title: '%i18n:@enter-password%', | ||||
| 				type: 'password' | ||||
| 			}).then(password => { | ||||
| 				(this as any).api('i/2fa/register', { | ||||
|  | @ -47,13 +47,13 @@ export default Vue.extend({ | |||
| 
 | ||||
| 		unregister() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@enter-password%', | ||||
| 				title: '%i18n:@enter-password%', | ||||
| 				type: 'password' | ||||
| 			}).then(password => { | ||||
| 				(this as any).api('i/2fa/unregister', { | ||||
| 					password: password | ||||
| 				}).then(() => { | ||||
| 					(this as any).apis.notify('%i18n:!@unregistered%'); | ||||
| 					(this as any).apis.notify('%i18n:@unregistered%'); | ||||
| 					(this as any).os.i.twoFactorEnabled = false; | ||||
| 				}); | ||||
| 			}); | ||||
|  | @ -63,10 +63,10 @@ export default Vue.extend({ | |||
| 			(this as any).api('i/2fa/done', { | ||||
| 				token: this.token | ||||
| 			}).then(() => { | ||||
| 				(this as any).apis.notify('%i18n:!@success%'); | ||||
| 				(this as any).apis.notify('%i18n:@success%'); | ||||
| 				(this as any).os.i.twoFactorEnabled = true; | ||||
| 			}).catch(() => { | ||||
| 				(this as any).apis.notify('%i18n:!@failed%'); | ||||
| 				(this as any).apis.notify('%i18n:@failed%'); | ||||
| 			}); | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ export default Vue.extend({ | |||
| 	methods: { | ||||
| 		regenerateToken() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@enter-password%', | ||||
| 				title: '%i18n:@enter-password%', | ||||
| 				type: 'password' | ||||
| 			}).then(password => { | ||||
| 				(this as any).api('i/regenerate_token', { | ||||
|  |  | |||
|  | @ -11,21 +11,21 @@ export default Vue.extend({ | |||
| 	methods: { | ||||
| 		reset() { | ||||
| 			(this as any).apis.input({ | ||||
| 				title: '%i18n:!@enter-current-password%', | ||||
| 				title: '%i18n:@enter-current-password%', | ||||
| 				type: 'password' | ||||
| 			}).then(currentPassword => { | ||||
| 				(this as any).apis.input({ | ||||
| 					title: '%i18n:!@enter-new-password%', | ||||
| 					title: '%i18n:@enter-new-password%', | ||||
| 					type: 'password' | ||||
| 				}).then(newPassword => { | ||||
| 					(this as any).apis.input({ | ||||
| 						title: '%i18n:!@enter-new-password-again%', | ||||
| 						title: '%i18n:@enter-new-password-again%', | ||||
| 						type: 'password' | ||||
| 					}).then(newPassword2 => { | ||||
| 						if (newPassword !== newPassword2) { | ||||
| 							(this as any).apis.dialog({ | ||||
| 								title: null, | ||||
| 								text: '%i18n:!@not-match%', | ||||
| 								text: '%i18n:@not-match%', | ||||
| 								actions: [{ | ||||
| 									text: 'OK' | ||||
| 								}] | ||||
|  | @ -36,7 +36,7 @@ export default Vue.extend({ | |||
| 							currentPasword: currentPassword, | ||||
| 							newPassword: newPassword | ||||
| 						}).then(() => { | ||||
| 							(this as any).apis.notify('%i18n:!@changed%'); | ||||
| 							(this as any).apis.notify('%i18n:@changed%'); | ||||
| 						}); | ||||
| 					}); | ||||
| 				}); | ||||
|  |  | |||
|  | @ -371,13 +371,13 @@ export default Vue.extend({ | |||
| 				this.latestVersion = newer; | ||||
| 				if (newer == null) { | ||||
| 					(this as any).apis.dialog({ | ||||
| 						title: '%i18n:!@no-updates%', | ||||
| 						text: '%i18n:!@no-updates-desc%' | ||||
| 						title: '%i18n:@no-updates%', | ||||
| 						text: '%i18n:@no-updates-desc%' | ||||
| 					}); | ||||
| 				} else { | ||||
| 					(this as any).apis.dialog({ | ||||
| 						title: '%i18n:!@update-available%', | ||||
| 						text: '%i18n:!@update-available-desc%' | ||||
| 						title: '%i18n:@update-available%', | ||||
| 						text: '%i18n:@update-available-desc%' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
|  | @ -385,8 +385,8 @@ export default Vue.extend({ | |||
| 		clean() { | ||||
| 			localStorage.clear(); | ||||
| 			(this as any).apis.dialog({ | ||||
| 				title: '%i18n:!@cache-cleared%', | ||||
| 				text: '%i18n:!@caache-cleared-desc%' | ||||
| 				title: '%i18n:@cache-cleared%', | ||||
| 				text: '%i18n:@caache-cleared-desc%' | ||||
| 			}); | ||||
| 		}, | ||||
| 		soundTest() { | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ export default Vue.extend({ | |||
| 		} | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		document.title = '%i18n:!@title%'; | ||||
| 		document.title = '%i18n:@title%'; | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		onSelected(file) { | ||||
|  |  | |||
|  | @ -113,7 +113,7 @@ html.setAttribute('lang', lang); | |||
| const head = document.getElementsByTagName('head')[0]; | ||||
| const meta = document.createElement('meta'); | ||||
| meta.setAttribute('name', 'description'); | ||||
| meta.setAttribute('content', '%i18n:!common.misskey%'); | ||||
| meta.setAttribute('content', '%i18n:common.misskey%'); | ||||
| head.appendChild(meta); | ||||
| //#endregion
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ | |||
| 		<div class="files" v-if="files.length > 0"> | ||||
| 			<x-file v-for="file in files" :key="file.id" :file="file"/> | ||||
| 			<button class="more" v-if="moreFiles" @click="fetchMoreFiles"> | ||||
| 				{{ fetchingMoreFiles ? '%i18n:!common.loading%' : '%i18n:!@load-more%' }} | ||||
| 				{{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }} | ||||
| 			</button> | ||||
| 		</div> | ||||
| 		<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching"> | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| 	<template v-if="!wait && user.isFollowing">%fa:minus%</template> | ||||
| 	<template v-if="!wait && !user.isFollowing">%fa:plus%</template> | ||||
| 	<template v-if="wait">%fa:spinner .pulse .fw%</template> | ||||
| 	{{ user.isFollowing ? '%i18n:!@unfollow%' : '%i18n:!@follow%' }} | ||||
| 	{{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }} | ||||
| </button> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,9 +6,9 @@ | |||
| 	<div class="renote" v-if="isRenote"> | ||||
| 		<mk-avatar class="avatar" :user="note.user"/> | ||||
| 		%fa:retweet% | ||||
| 		<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span> | ||||
| 		<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span> | ||||
| 		<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> | ||||
| 		<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span> | ||||
| 		<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span> | ||||
| 		<mk-time :time="note.createdAt"/> | ||||
| 	</div> | ||||
| 	<article> | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ | |||
| 
 | ||||
| 	<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> | ||||
| 		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template> | ||||
| 		{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }} | ||||
| 		{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} | ||||
| 	</button> | ||||
| 
 | ||||
| 	<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p> | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ | |||
| 			<a @click="addVisibleUser">+ユーザーを追加</a> | ||||
| 		</div> | ||||
| 		<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)"> | ||||
| 		<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:!@reply-placeholder%' : renote ? '%i18n:!@renote-placeholder%' : '%i18n:!@note-placeholder%'"></textarea> | ||||
| 		<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea> | ||||
| 		<div class="attaches" v-show="files.length != 0"> | ||||
| 			<x-draggable class="files" :list="files" :options="{ animation: 150 }"> | ||||
| 				<div class="file" v-for="file in files" :key="file.id"> | ||||
|  |  | |||
|  | @ -94,7 +94,7 @@ export default Vue.extend({ | |||
| 	}, | ||||
| 	methods: { | ||||
| 		search() { | ||||
| 			const query = window.prompt('%i18n:!@search%'); | ||||
| 			const query = window.prompt('%i18n:@search%'); | ||||
| 			if (query == null || query == '') return; | ||||
| 			this.$router.push('/search?q=' + encodeURIComponent(query)); | ||||
| 		}, | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| 	<mk-notes ref="timeline" :more="existMore ? more : null"> | ||||
| 		<div slot="empty"> | ||||
| 			%fa:R comments% | ||||
| 			{{ withMedia ? '%i18n:!@no-notes-with-media%' : '%i18n:!@no-notes%' }} | ||||
| 			{{ withMedia ? '%i18n:@no-notes-with-media%' : '%i18n:@no-notes%' }} | ||||
| 		</div> | ||||
| 	</mk-notes> | ||||
| </div> | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| <mk-ui> | ||||
| 	<template slot="header" v-if="!fetching"> | ||||
| 		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""> | ||||
| 		{{ '%i18n:!@followers-of%'.replace('{}', name) }} | ||||
| 		{{ '%i18n:@followers-of%'.replace('{}', name) }} | ||||
| 	</template> | ||||
| 	<mk-users-list | ||||
| 		v-if="!fetching" | ||||
|  | @ -49,7 +49,7 @@ export default Vue.extend({ | |||
| 				this.user = user; | ||||
| 				this.fetching = false; | ||||
| 
 | ||||
| 				document.title = '%i18n:!@followers-of%'.replace('{}', this.name) + ' | Misskey'; | ||||
| 				document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | Misskey'; | ||||
| 			}); | ||||
| 		}, | ||||
| 		onLoaded() { | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| <mk-ui> | ||||
| 	<template slot="header" v-if="!fetching"> | ||||
| 		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""> | ||||
| 		{{ '%i18n:!@following-of%'.replace('{}', name) }} | ||||
| 		{{ '%i18n:@following-of%'.replace('{}', name) }} | ||||
| 	</template> | ||||
| 	<mk-users-list | ||||
| 		v-if="!fetching" | ||||
|  | @ -48,7 +48,7 @@ export default Vue.extend({ | |||
| 				this.user = user; | ||||
| 				this.fetching = false; | ||||
| 
 | ||||
| 				document.title = '%i18n:!@followers-of%'.replace('{}', this.name) + ' | Misskey'; | ||||
| 				document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | Misskey'; | ||||
| 			}); | ||||
| 		}, | ||||
| 		onLoaded() { | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ export default Vue.extend({ | |||
| 	}, | ||||
| 	methods: { | ||||
| 		fn() { | ||||
| 			const ok = window.confirm('%i18n:!@read-all%'); | ||||
| 			const ok = window.confirm('%i18n:@read-all%'); | ||||
| 			if (!ok) return; | ||||
| 
 | ||||
| 			(this as any).api('notifications/markAsRead_all'); | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| 	<span slot="header">%fa:search% {{ q }}</span> | ||||
| 	<main v-if="!fetching"> | ||||
| 		<mk-notes :class="$style.notes" :notes="notes"> | ||||
| 			<span v-if="notes.length == 0">{{ '%i18n:!@empty%'.replace('{}', q) }}</span> | ||||
| 			<span v-if="notes.length == 0">{{ '%i18n:@empty%'.replace('{}', q) }}</span> | ||||
| 			<button v-if="existMore" @click="more" :disabled="fetching" slot="tail"> | ||||
| 				<span v-if="!fetching">%i18n:@load-more%</span> | ||||
| 				<span v-if="fetching">%i18n:common.loading%<mk-ellipsis/></span> | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ export default Vue.extend({ | |||
| 		} | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		document.title = '%i18n:!@title%'; | ||||
| 		document.title = '%i18n:@title%'; | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		onSelected(file) { | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| <mk-ui> | ||||
| 	<span slot="header">%fa:cog%%i18n:@settings%</span> | ||||
| 	<main> | ||||
| 		<p v-html="'%i18n:!@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p> | ||||
| 		<p v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p> | ||||
| 		<div> | ||||
| 			<x-profile/> | ||||
| 
 | ||||
|  | @ -91,7 +91,7 @@ | |||
| 				<md-card-content> | ||||
| 					<p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p> | ||||
| 					<p> | ||||
| 						<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:!@twitter-reconnect%' : '%i18n:!@twitter-connect%' }}</a> | ||||
| 						<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> | ||||
| 						<span v-if="os.i.twitter"> or </span> | ||||
| 						<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a> | ||||
| 					</p> | ||||
|  | @ -223,13 +223,13 @@ export default Vue.extend({ | |||
| 				this.latestVersion = newer; | ||||
| 				if (newer == null) { | ||||
| 					(this as any).apis.dialog({ | ||||
| 						title: '%i18n:!@no-updates%', | ||||
| 						text: '%i18n:!@no-updates-desc%' | ||||
| 						title: '%i18n:@no-updates%', | ||||
| 						text: '%i18n:@no-updates-desc%' | ||||
| 					}); | ||||
| 				} else { | ||||
| 					(this as any).apis.dialog({ | ||||
| 						title: '%i18n:!@update-available%', | ||||
| 						text: '%i18n:!@update-available-desc%' | ||||
| 						title: '%i18n:@update-available%', | ||||
| 						text: '%i18n:@update-available-desc%' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
|  |  | |||
|  | @ -158,7 +158,7 @@ export default Vue.extend({ | |||
| 				(this as any).os.i.bannerId = i.bannerId; | ||||
| 				(this as any).os.i.bannerUrl = i.bannerUrl; | ||||
| 
 | ||||
| 				alert('%i18n:!@saved%'); | ||||
| 				alert('%i18n:@saved%'); | ||||
| 			}); | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -2,17 +2,12 @@ | |||
|  * Replace i18n texts | ||||
|  */ | ||||
| 
 | ||||
| export const pattern = /%i18n:([a-z0-9_\-@\.\!]+?)%/g; | ||||
| export const pattern = /%i18n:([a-z0-9_\-@\.]+?)%/g; | ||||
| 
 | ||||
| export const replacement = (ctx, match, key) => { | ||||
| 	const client = '/src/client/app/'; | ||||
| 	let name = null; | ||||
| 
 | ||||
| 	const shouldEscape = key[0] == '!'; | ||||
| 	if (shouldEscape) { | ||||
| 		key = key.substr(1); | ||||
| 	} | ||||
| 
 | ||||
| 	if (key[0] == '@') { | ||||
| 		name = ctx.src.substr(ctx.src.indexOf(client) + client.length); | ||||
| 		key = key.substr(1); | ||||
|  | @ -20,5 +15,5 @@ export const replacement = (ctx, match, key) => { | |||
| 
 | ||||
| 	const path = name ? `${name}|${key}` : key; | ||||
| 
 | ||||
| 	return shouldEscape ? `%i18n:!${path}%` : `%i18n:${path}%`; | ||||
| 	return `%i18n:${path}%`; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue