Compare commits

..

122 Commits

Author SHA1 Message Date
2ab8a5bc0a 10.60.4 2018-12-03 20:27:47 +09:00
c222b9ae94 Update init.ts 2018-12-03 20:26:46 +09:00
53a0f3c794 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-12-03 20:26:38 +09:00
9ff349c548 Update post-form.vue 2018-12-03 20:21:05 +09:00
0935bd4bd4 Resolve #3281 (#3479) 2018-12-03 20:11:18 +09:00
45bee7cc2f Resolve #327 2018-12-03 20:08:18 +09:00
1c86a4bc26 Refactor 2018-12-03 19:44:03 +09:00
b385cf2a9f 10.60.3 2018-12-03 09:54:14 +09:00
40d3dc454d Merge pull request #3480 from syuilo/l10n_develop
New Crowdin translations
2018-12-03 09:53:40 +09:00
8e92848495 New translations ja-JP.yml (Korean) 2018-12-03 09:52:19 +09:00
2d94a22a30 New translations ja-JP.yml (French) 2018-12-03 09:52:15 +09:00
7a5a091c25 New translations ja-JP.yml (English) 2018-12-03 09:52:08 +09:00
2baf810c71 New translations ja-JP.yml (Chinese Simplified) 2018-12-03 09:52:01 +09:00
d1ecef13ef New translations ja-JP.yml (Norwegian) 2018-12-03 09:43:22 +09:00
495fa553ad New translations ja-JP.yml (Dutch) 2018-12-03 09:43:16 +09:00
854e649ea6 New translations ja-JP.yml (Japanese, Kansai) 2018-12-03 09:43:11 +09:00
c047324b42 🎨 2018-12-03 09:43:07 +09:00
daac865c72 New translations ja-JP.yml (Spanish) 2018-12-03 09:43:07 +09:00
63d059b8d1 New translations ja-JP.yml (Russian) 2018-12-03 09:43:01 +09:00
e3075a0dc7 New translations ja-JP.yml (Portuguese) 2018-12-03 09:42:57 +09:00
6b6e597b95 New translations ja-JP.yml (Polish) 2018-12-03 09:42:51 +09:00
eb0eadad5e New translations ja-JP.yml (Korean) 2018-12-03 09:42:46 +09:00
f600fee16d New translations ja-JP.yml (Italian) 2018-12-03 09:42:40 +09:00
7b88c54aa6 New translations ja-JP.yml (German) 2018-12-03 09:42:34 +09:00
623dd57cc3 New translations ja-JP.yml (French) 2018-12-03 09:42:27 +09:00
f6edd33adb New translations ja-JP.yml (English) 2018-12-03 09:42:23 +09:00
ac20d73222 New translations ja-JP.yml (Chinese Simplified) 2018-12-03 09:42:19 +09:00
c59374d79d New translations ja-JP.yml (Catalan) 2018-12-03 09:42:13 +09:00
0d478046de Improve usability 2018-12-03 09:41:22 +09:00
f3479d1b98 Refactor 2018-12-03 09:38:43 +09:00
2fdecb8a38 🎨 2018-12-03 09:14:17 +09:00
a95c3ee557 New translations ja-JP.yml (Korean) 2018-12-03 08:12:01 +09:00
67c439c70a New translations ja-JP.yml (French) 2018-12-03 03:01:46 +09:00
b96037cffa New translations ja-JP.yml (Chinese Simplified) 2018-12-03 00:23:03 +09:00
ebd8d34552 New translations ja-JP.yml (Chinese Simplified) 2018-12-03 00:13:13 +09:00
a653d9a83e New translations ja-JP.yml (Chinese Simplified) 2018-12-03 00:11:54 +09:00
07d6894c42 Clean up 2018-12-02 23:00:06 +09:00
03588b3fd6 Merge if-statements (#3478) 2018-12-02 22:32:09 +09:00
2e83440e70 10.60.2 2018-12-02 21:20:36 +09:00
2633873fcc Fix syntax error (#3477)
src/remote/activitypub/models/person.ts(326,4): error TS1005: ',' expected.
2018-12-02 21:19:28 +09:00
5f33713f53 10.60.1 2018-12-02 21:08:20 +09:00
fe84c5010c Merge pull request #3458 from syuilo/l10n_develop
New Crowdin translations
2018-12-02 20:43:52 +09:00
7f39df0713 New translations ja-JP.yml (English) 2018-12-02 20:43:12 +09:00
928d359dd2 Use takeWhile instead of some (#3475) 2018-12-02 20:28:22 +09:00
184eb00133 Remove self-assignment (#3476) 2018-12-02 20:26:15 +09:00
e264a49b08 [Client] Resolve #2596 2018-12-02 20:24:38 +09:00
8caf853c80 Merge branches 'develop', 'develop' and 'develop' of https://github.com/syuilo/misskey into develop 2018-12-02 20:11:03 +09:00
b451c04787 Use primitive type boolean (#3474) 2018-12-02 20:10:56 +09:00
1653977392 Improve input dialog 2018-12-02 20:10:53 +09:00
a0d9def98a Simplify expressions (#3473) 2018-12-02 19:35:41 +09:00
92701e5cec Fix #3445 (#3471) 2018-12-02 19:24:57 +09:00
0b6b6a4f2f Remove unneccesary casts 2018-12-02 19:05:08 +09:00
3a2dc95850 No MFM parsing when remote note (#3470)
* Use tag for hashtag detection of remote note

* No MFM parsing when remote note
2018-12-02 18:05:33 +09:00
163cf49f16 10.60.0 2018-12-02 15:39:46 +09:00
37fc3103f6 New translations ja-JP.yml (Norwegian) 2018-12-02 15:33:32 +09:00
b7bd1ff69f New translations ja-JP.yml (Dutch) 2018-12-02 15:33:28 +09:00
dc36134f10 New translations ja-JP.yml (Japanese, Kansai) 2018-12-02 15:33:22 +09:00
fea8821091 New translations ja-JP.yml (Spanish) 2018-12-02 15:33:17 +09:00
33faf40aca New translations ja-JP.yml (Russian) 2018-12-02 15:33:12 +09:00
4410f8d7f7 New translations ja-JP.yml (Portuguese) 2018-12-02 15:33:08 +09:00
3e6029e69d New translations ja-JP.yml (Polish) 2018-12-02 15:33:04 +09:00
96c7707e6c New translations ja-JP.yml (Korean) 2018-12-02 15:32:59 +09:00
d8e545db3c New translations ja-JP.yml (Italian) 2018-12-02 15:32:54 +09:00
a9a6ba0aed New translations ja-JP.yml (German) 2018-12-02 15:32:50 +09:00
a898c6ceab New translations ja-JP.yml (French) 2018-12-02 15:32:44 +09:00
0205c5c2d7 New translations ja-JP.yml (English) 2018-12-02 15:32:38 +09:00
f8074ab74b New translations ja-JP.yml (Chinese Simplified) 2018-12-02 15:32:34 +09:00
f15c491d5f New translations ja-JP.yml (Catalan) 2018-12-02 15:32:29 +09:00
c38a32dee9 🎨 2018-12-02 15:31:24 +09:00
4f5abed70d Fix 2018-12-02 15:30:48 +09:00
c9ac9923df Refactor: rename alert to dialog 2018-12-02 15:28:52 +09:00
bb14895fd8 [Client] Resolve #2225 2018-12-02 15:26:56 +09:00
6f92d601ec 🎨 2018-12-02 14:26:30 +09:00
345143b0c1 Suggest in CW (#3467) 2018-12-02 07:33:03 +09:00
dc80d5d376 10.59.4 2018-12-02 07:08:26 +09:00
d3544f9637 Update README.md [AUTOGEN] (#3466) 2018-12-02 07:05:22 +09:00
864b6ad1bd Resolve #1826 2018-12-02 07:02:08 +09:00
c58027e521 [MFM] Better hashtag detection 2018-12-02 06:53:57 +09:00
10fb399588 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-12-02 06:44:25 +09:00
10f466c895 Improve performance 2018-12-02 06:44:18 +09:00
32068b4bcc Update README.md [AUTOGEN] (#3465) 2018-12-02 06:16:24 +09:00
381f2b7fdf New translations ja-JP.yml (French) 2018-12-02 05:12:02 +09:00
1c3c733c6b New translations ja-JP.yml (French) 2018-12-02 05:02:46 +09:00
8bc5febe66 [Client] Add missing icon (#3464) 2018-12-02 03:43:05 +09:00
20335e23f9 Resolve external recommended users (#3462)
* Resolve external recommended users

* Skip unresolvable users

* Fix indent

* Use original for unresolvable users
2018-12-02 03:42:45 +09:00
9dbc9115c9 New translations ja-JP.yml (English) 2018-12-01 12:51:44 +09:00
fe707f88a4 [MFM] Better MFM parsing 2018-12-01 10:40:09 +09:00
9b23ebd4a3 🎨 2018-12-01 09:45:48 +09:00
bea450cc2c 10.59.3 2018-12-01 08:00:25 +09:00
e80709f7aa Disable update notification 2018-12-01 07:59:15 +09:00
cb71f92f42 [ImgBot] Optimize images (#3455)
*Total -- 1,383.25kb -> 1,231.27kb (10.99%)

/assets/apple-touch-icon.png -- 4.72kb -> 2.51kb (46.79%)
/assets/icons/256.png -- 4.72kb -> 2.51kb (46.79%)
/assets/title.png -- 6.63kb -> 3.80kb (42.73%)
/assets/favicon/favicon.png -- 6.83kb -> 3.93kb (42.45%)
/assets/icons/192.png -- 3.49kb -> 2.02kb (42.08%)
/assets/icons/128.png -- 2.29kb -> 1.50kb (34.81%)
/assets/about/ui.png -- 125.21kb -> 94.85kb (24.25%)
/assets/ai-orig.png -- 255.55kb -> 199.67kb (21.86%)
/assets/icons/64.png -- 1.21kb -> 0.99kb (18.34%)
/assets/about/drive.png -- 110.33kb -> 94.20kb (14.62%)
/assets/about/post.png -- 344.52kb -> 316.57kb (8.11%)
/assets/ai.png -- 243.43kb -> 234.93kb (3.49%)
/src/client/assets/pointer.png -- 274.33kb -> 273.80kb (0.19%)
2018-12-01 07:55:34 +09:00
2ca5348560 Fix "Mi"/"Misskey" logos (#3400)
* Fix mi.svg

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload
2018-12-01 07:52:15 +09:00
c8e98fdf8e Update vue-js-modal requirement from 1.3.26 to 1.3.27 (#3425)
Updates the requirements on [vue-js-modal](https://github.com/euvl/vue-js-modal) to permit the latest version.
- [Release notes](https://github.com/euvl/vue-js-modal/releases)
- [Commits](https://github.com/euvl/vue-js-modal/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-01 07:44:30 +09:00
0bfa041026 Merge pull request #3435 from syuilo/l10n_develop
New Crowdin translations
2018-12-01 07:20:03 +09:00
33bf474a1e Update @types/file-type requirement from 5.2.1 to 5.2.2 (#3450)
Updates the requirements on [@types/file-type](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-01 07:19:39 +09:00
53c559c001 Allow hyphens in the middle of remote usernames (#3440)
* Allow hyphens in the middle of remote usernames

refs: d797c29db462de4a3d69a5077a1ae4d03195b6f2

* Make options fallback better

* Make options flat
2018-12-01 07:19:17 +09:00
1c99ef454b Update webpack requirement from 4.26.0 to 4.26.1 (#3453)
Updates the requirements on [webpack](https://github.com/webpack/webpack) to permit the latest version.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/commits/v4.26.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-01 07:16:53 +09:00
cf4cecd4df Fix media video (#3452)
* Fix: Always show nsfw

* [Client] Add missing video play icon
2018-12-01 07:16:28 +09:00
6a8835b923 Exclude remote user or myself from talk user suggestions (#3449) 2018-12-01 07:15:55 +09:00
f2b1cf92e1 AP CW (#3448) 2018-12-01 07:15:10 +09:00
6b79618e74 New translations ja-JP.yml (Polish) 2018-12-01 02:22:34 +09:00
3db414add4 Use for-of instead of map
return values are not being used
2018-11-30 23:30:28 +09:00
9ef641b403 Remove consecutive blank line 2018-11-30 23:07:21 +09:00
6fa7819a44 Fix #3442 (#3443) 2018-11-30 18:13:55 +09:00
59a1b9adbe Trim notifications text (#3438)
* Trim notifications

* Remove needless colons

* Use single quote

* 🎨
2018-11-30 09:34:37 +09:00
3fbc7094f6 New translations ja-JP.yml (Korean) 2018-11-30 07:52:03 +09:00
56c6227bc2 New translations ja-JP.yml (English) 2018-11-30 05:02:18 +09:00
ee82f99f5a Better limit 2018-11-30 00:45:02 +09:00
789de130a2 New translations ja-JP.yml (Norwegian) 2018-11-30 00:14:31 +09:00
46c026ce70 New translations ja-JP.yml (Dutch) 2018-11-30 00:14:24 +09:00
82290f6e4e New translations ja-JP.yml (Japanese, Kansai) 2018-11-30 00:14:17 +09:00
8729525f95 New translations ja-JP.yml (Spanish) 2018-11-30 00:14:09 +09:00
df0115ffe8 New translations ja-JP.yml (Russian) 2018-11-30 00:14:04 +09:00
0275b4fc9e New translations ja-JP.yml (Portuguese) 2018-11-30 00:13:57 +09:00
9982fd71ba New translations ja-JP.yml (Polish) 2018-11-30 00:13:49 +09:00
081060b7db New translations ja-JP.yml (Korean) 2018-11-30 00:13:45 +09:00
0de64f1fc7 New translations ja-JP.yml (Italian) 2018-11-30 00:13:37 +09:00
f0508c0a90 New translations ja-JP.yml (German) 2018-11-30 00:13:32 +09:00
b51ae1dfaa New translations ja-JP.yml (French) 2018-11-30 00:13:24 +09:00
6e7233d41b New translations ja-JP.yml (English) 2018-11-30 00:13:19 +09:00
418041a56e New translations ja-JP.yml (Chinese Simplified) 2018-11-30 00:13:13 +09:00
17d20f5a18 New translations ja-JP.yml (Catalan) 2018-11-30 00:13:07 +09:00
124 changed files with 1057 additions and 1364 deletions

View File

@ -116,7 +116,7 @@ Please see [Contribution guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Tue, 27 Nov 2018 06:24:05 UTC
**Last updated:** Sat, 01 Dec 2018 22:05:05 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,108 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 135.46667 135.46667"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r15371"
sodipodi:docname="favicon.svg"
inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\16.png"
inkscape:export-xdpi="3"
inkscape:export-ydpi="3">
version="1.1"
viewBox="0 0 135.46667 135.46667"
height="512"
width="512">
<defs
id="defs2">
<inkscape:path-effect
effect="simplify"
id="path-effect5115"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
<inkscape:path-effect
effect="simplify"
id="path-effect5111"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
<inkscape:path-effect
effect="simplify"
id="path-effect5104"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="15.466544"
inkscape:cy="235.92965"
inkscape:document-units="px"
inkscape:current-layer="g4502"
showgrid="true"
units="px"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-center="true"
inkscape:snap-page="true"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="-8"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:object-paths="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
objecttolerance="1"
guidetolerance="1"
inkscape:snap-nodes="false"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid4504"
spacingx="4.2333334"
spacingy="4.2333334"
empcolor="#ff3fff"
empopacity="0.25098039"
empspacing="4" />
</sodipodi:namedview>
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
@ -116,32 +25,27 @@
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-30.809093,-111.78601)">
style="fill:#2fa3bc;fill-opacity:1"
transform="translate(-30.809093,-111.78601)"
id="layer1">
<g
id="g4502"
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
style="fill:#2fa3bc;fill-opacity:1"
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
id="g4502">
<g
style="fill:#2fa1bb;fill-opacity:1"
id="g5125">
id="g5125"
transform="translate(-1.3333333e-6,-1.3439941e-6)"
style="fill:#2fa3bc;fill-opacity:1">
<g
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
aria-label="Mi"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa3bc;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text4489"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
aria-label="Mi">
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
<path
sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
inkscape:connector-curvature="0"
id="path5210"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px"
d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
<path
inkscape:connector-curvature="0"
id="path5212"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px"
d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa3bc;fill-opacity:1;stroke-width:1.09609616px" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 B

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 774 B

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1015 B

View File

@ -1,108 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 135.46667 135.46667"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r15371"
sodipodi:docname="mi.svg"
inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
inkscape:export-xdpi="6"
inkscape:export-ydpi="6">
version="1.1"
viewBox="0 0 135.46667 135.46667"
height="512"
width="512">
<defs
id="defs2">
<inkscape:path-effect
effect="simplify"
id="path-effect5115"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
<inkscape:path-effect
effect="simplify"
id="path-effect5111"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
<inkscape:path-effect
effect="simplify"
id="path-effect5104"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="232.39583"
inkscape:cy="251.50613"
inkscape:document-units="px"
inkscape:current-layer="g4502"
showgrid="true"
units="px"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-center="true"
inkscape:snap-page="true"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="-8"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:object-paths="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
objecttolerance="1"
guidetolerance="1"
inkscape:snap-nodes="false"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid4504"
spacingx="4.2333334"
spacingy="4.2333334"
empcolor="#ff3fff"
empopacity="0.25098039"
empspacing="4" />
</sodipodi:namedview>
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
@ -111,32 +20,30 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-30.809093,-111.78601)">
transform="translate(-30.809093,-111.78601)"
id="layer1">
<g
id="g4502"
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
id="g4502">
<g
style="fill:#000000;fill-opacity:1"
id="g5125"
transform="translate(-1.3333333e-6,-1.3439941e-6)"
id="g5125">
style="fill:#000000;fill-opacity:1">
<g
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
id="text4489"
aria-label="Mi"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
aria-label="Mi">
id="text4489"
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:1.09609616px"
d="M 62.474609 76.585938 C 54.999059 76.585938 47.878825 77.832365 41.115234 80.324219 C 29.011968 84.595952 19.044417 92.249798 11.212891 103.28516 C 3.7373405 113.96451 0 125.88934 0 139.06055 L 0 372.93945 C 0 390.02642 6.0510264 404.79858 18.154297 417.25781 C 30.613543 429.36108 45.387643 435.41406 62.474609 435.41406 C 79.917556 435.41406 94.689698 429.36108 106.79297 417.25781 C 119.25222 404.79858 125.48242 390.02642 125.48242 372.93945 L 125.48242 330.4082 C 125.61683 321.19698 135.10492 323.61391 139.90039 330.4082 C 148.8815 345.96215 167.92265 359.32062 190.0918 359.24414 C 212.26095 359.16778 230.67374 348.20715 240.28516 330.4082 C 243.92497 326.11557 254.18418 318.80145 255.23633 330.4082 L 255.23633 372.93945 C 255.23633 390.02642 261.28735 404.79858 273.39062 417.25781 C 285.84985 429.36108 300.62397 435.41406 317.71094 435.41406 C 335.15388 435.41406 349.92603 429.36108 362.0293 417.25781 C 374.48853 404.79858 380.71875 390.02642 380.71875 372.93945 L 380.71875 139.06055 C 380.71875 125.88934 376.80415 113.96451 368.97266 103.28516 C 361.49709 92.249798 351.70678 84.595952 339.60352 80.324219 C 332.48396 77.832365 325.3637 76.585938 318.24414 76.585938 C 299.02128 76.585938 282.82549 84.062587 269.6543 99.013672 C 262.53473 107.20121 258.79542 111.11761 258.43945 110.76172 C 258.43945 110.76172 207.67587 172.14495 206.25195 173.21289 C 204.82804 174.2808 200.11102 182.44531 190.0918 182.44531 C 180.07257 182.44531 175.89071 174.2808 174.4668 173.21289 C 173.04288 172.14495 122.2793 110.76172 122.2793 110.76172 C 121.21136 110.40575 117.29484 106.48923 110.53125 99.013672 C 97.716024 84.062587 81.697447 76.585938 62.474609 76.585938 z M 457.53516 76.585938 C 442.58406 76.585937 429.7692 81.926117 419.08984 92.605469 C 408.76646 102.92885 403.60547 115.56648 403.60547 130.51758 C 403.60547 145.46868 408.76646 158.28354 419.08984 168.96289 C 429.7692 179.28627 442.58406 184.44922 457.53516 184.44922 C 472.48625 184.44922 485.30112 179.28627 495.98047 168.96289 C 506.65982 158.28354 512 145.46868 512 130.51758 C 512 115.56648 506.65982 102.92885 495.98047 92.605469 C 485.30112 81.926117 472.48625 76.585938 457.53516 76.585938 z M 458.06836 195.12695 C 443.11726 195.12695 430.3024 200.46713 419.62305 211.14648 C 408.94369 221.82584 403.60547 234.6407 403.60547 249.5918 L 403.60547 381.48242 C 403.60547 396.43352 408.94369 409.24838 419.62305 419.92773 C 430.3024 430.25112 443.11726 435.41406 458.06836 435.41406 C 473.01946 435.41406 485.65709 430.25112 495.98047 419.92773 C 506.65982 409.24838 512 396.43352 512 381.48242 L 512 249.5918 C 512 234.6407 506.65982 221.82584 495.98047 211.14648 C 485.65709 200.46713 473.01946 195.12695 458.06836 195.12695 z "
id="path5210"
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
id="path5210" />
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:1.09609616px" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert."
volume: "Lautstärke"
test: "Test"
language: "Sprache"
pick-language: "Sprache auswählen"
recommended: "Empfohlen"
auto: "Automatisch"
specify-language: "Sprache auswählen"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "Der Cache deines Benutzerkontos (Info, Beiträge, Antworten, Direktnachrichten, Einstellungen), die lokal im Browser gespeichert sind werden gelöscht.\nDu musst die Seite aktualisieren nachdem du aufgeräumt hast."
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "Sprache auswählen"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"

View File

@ -26,7 +26,7 @@ common:
close: "Close"
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
load-more: "Load more"
enter-password: "パスワードを入力してください"
enter-password: "Please enter the Password"
got-it: "Got it!"
customization-tips:
title: "Customization tips"
@ -268,7 +268,7 @@ common/views/components/theme.vue:
install: "Install"
installed: "\"{}\" has been installed"
create-a-theme: "Create a theme"
save-created-theme: "Save a theme"
save-created-theme: "Save theme"
primary-color: "Primary color"
secondary-color: "Secondary color"
text-color: "Text color"
@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{} users mentioned"
empty: "No popular hashtag trends"
common/views/components/language-settings.vue:
title: "Display Language"
pick-language: "Select a language"
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify language"
info: "You need to reload the page for the changes to take effect."
common/views/components/profile-editor.vue:
title: "Profile"
name: "Name"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
volume: "Volume"
test: "Test"
language: "Language"
pick-language: "Select a language"
recommended: "Recommended"
auto: "Automatic"
specify-language: "Specify language"
language-desc: "You need to reload the page for the changes to take effect."
cache: "Cache"
clean-cache: "Clear cache"
cache-warn: "The cache of account info/posts/replies/messages/settings stored in the browser will be deleted. You need to reload the page after cleaning up."
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "Used to confirm email and password reset etc."
enable-email: "Enable email delivery"
email: "Email Address"
smtp-use-ssl: "Use SSL for SMTP server"
smtp-secure: "Use implicit SSL/TLS in the SMTP connection"
smtp-secure-info: "Turn off STARTTLS when used that."
smtp-host: "SMTP Host"
smtp-port: "SMTP Port"
smtp-user: "SMTP User"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "Choose files"
mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}"
lang: "Language"
lang-tip: "You will need to reload the page for the changes to take effect."
recommended: "Recommended"
auto: "Auto"
specify-language: "Select your language"
design: "Design and display"
dark-mode: "Dark Mode"
i-am-under-limited-internet: "I'm in limited bandwidth"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "Block"
unblock: "Unblock"
years-old: "{age} years old"
push-to-list: "Add to list"
select-list: "Select a list"
list-pushed: "Successfully added {user} to {list}."
mobile/views/pages/user/home.vue:
recent-notes: "Recent notes"
images: "Images"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"

View File

@ -26,7 +26,7 @@ common:
close: "Fermer"
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
load-more: "Charger plus"
enter-password: "パスワードを入力してください"
enter-password: "Veuillez entrer le mot de passe"
got-it: "Jai compris !"
customization-tips:
title: "Conseils de personnalisation"
@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{} utilisateurs·rices mentionnés·es"
empty: "Aucune tendance"
common/views/components/language-settings.vue:
title: "Langue "
pick-language: "Sélectionner une langue"
recommended: "Recommandé"
auto: "Automatique"
specify-language: "Spécifier la langue"
info: "Le rechargement de la page est requis afin d'appliquer les modifications."
common/views/components/profile-editor.vue:
title: "Profil"
name: "Nom"
@ -458,10 +465,10 @@ common/views/components/profile-editor.vue:
saved: "Profil mis à jour avec succès"
uploading: "En cours d'envoi …"
upload-failed: "Échec de l'envoi"
email: "メール設定"
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
email: "Paramètres de messagerie"
email-address: "Adresse de courrier électronique"
email-verified: "Ladresse du courrier électronique a été vérifiée."
email-not-verified: "Adresse de courriel nest pas confirmée. Veuillez vérifier votre boite de réception."
common/views/widgets/broadcast.vue:
fetching: "Récupération"
no-broadcasts: "Aucune annonce"
@ -736,8 +743,8 @@ desktop/views/components/settings.vue:
note-visibility: "Visibilité de la publication"
default-note-visibility: "Visibilité par défaut"
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: ": https://www.google.com/?#q={{query}}"
web-search-engine: "Moteur de recherche Web"
web-search-engine-desc: "Exemple: https://www.google.com/?#q={{query}}"
auto-popout: "Fenêtre contextuelle automatique"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "Paramètres avancés"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
volume: "Volume"
test: "Test"
language: "Langue"
pick-language: "Sélectionner une langue"
recommended: "Recommandé"
auto: "Automatique"
specify-language: "Spécifier la langue"
language-desc: "Le rechargement de la page est requis afin d'appliquer les modifications."
cache: "Cache"
clean-cache: "Nettoyage"
cache-warn: "Le nettoyage du cache du compte supprime les informations stockées dans le navigateur comme les messages, les réponses ainsi que dautres données (y compris les paramètres de configuration). Après le nettoyage, vous devez recharger la page."
@ -1004,15 +1005,16 @@ admin/views/instance.vue:
external-user-recommendation-engine-desc: "Exemple: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
external-user-recommendation-timeout: "Délai dexpiration"
external-user-recommendation-timeout-desc: "En millisecondes (par exemple : 300000)"
email-config: "メールサーバーの設定"
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
email-config: "Paramètres du serveur de messagerie"
email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe."
enable-email: "Activation de la distribution du courrier"
email: "Adresse de courrier électronique"
smtp-secure: "Utiliser SSL/TLS implicitement dans la connexion SMTP"
smtp-secure-info: "Désactiver STARTTLS lorsque celui-ci est utilisé."
smtp-host: "Hôte SMTP"
smtp-port: "Port SMTP"
smtp-user: "Utilisateur SMTP"
smtp-pass: "Mot de passe SMTP"
admin/views/charts.vue:
title: "Graph"
per-day: "par jour"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "Choisissez un fichier"
mobile/views/pages/settings.vue:
signed-in-as: "Connecté·e en tant que {}"
lang: "Langue"
lang-tip: "Le rechargement de la page est requis afin d'appliquer les modifications."
recommended: "Recommandé"
auto: "Automatique"
specify-language: "Sélectionnez votre langue"
design: "Affichage et design"
dark-mode: "Mode nuit"
i-am-under-limited-internet: "J'ai un accès Internet limité"
@ -1387,8 +1384,8 @@ mobile/views/pages/settings.vue:
note-visibility: "Visibilité de la publication"
default-note-visibility: "Visibilité par défaut"
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: ": https://www.google.com/?#q={{query}}"
web-search-engine: "Moteur de recherche Web"
web-search-engine-desc: "Exemple: https://www.google.com/?#q={{query}}"
disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'"
load-raw-images: "Afficher les photos jointes en haute qualité"
load-remote-media: "Afficher les médias sur le serveur distant"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "Bloquer"
unblock: "Débloquer"
years-old: "{age} ans"
push-to-list: "Ajouter à la liste"
select-list: "Sélectionnez une liste"
list-pushed: "Vous avez ajouté {user} à la liste {list} avec succès."
mobile/views/pages/user/home.vue:
recent-notes: "Notes récentes"
images: "Images"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"

View File

@ -440,13 +440,11 @@ common/views/components/stream-indicator.vue:
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Twitterと接続する"
common/views/components/integration-settings.vue:
title: "サービス連携"
connect: "接続する"
disconnect: "切断する"
connected-to: "次のアカウントに接続されています"
common/views/components/github-setting.vue:
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
@ -485,12 +483,21 @@ common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
language: "言語"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
@ -870,13 +877,6 @@ desktop/views/components/settings.vue:
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1554,11 +1554,6 @@ mobile/views/pages/selectdrive.vue:
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1586,18 +1581,6 @@ mobile/views/pages/settings.vue:
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
load-raw-images: "添付された画像を高画質で表示する"
load-remote-media: "リモートサーバーのメディアを表示する"
twitter: "Twitter連携"
twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
github: "GitHub連携"
github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する"
github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
@ -1628,6 +1611,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "流行は自分で作るんや"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージもろたとき、音鳴らしたるわ。大丈夫や、この設定はブラウザが覚えてくれとる。"
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語選んでや"
recommended: "おすすめ"
auto: "自動"
specify-language: "言語選んでくれ"
language-desc: "変更はページの再度読み込み後に反映されんで。"
cache: "キャッシュ"
clean-cache: "お掃除"
cache-warn: "お掃除するとな、ブラウザが覚えてくれとるアカウントのあれこれや書きかけの投稿・返信・メッセージや設定情報なんかのデータが全部飛んでいくんや。これやったらページ再読込しといてな。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイル選んでや"
mobile/views/pages/settings.vue:
signed-in-as: "あんたは橋の下で拾った{}や!"
lang: "言語"
lang-tip: "ページもっぺん読み込んだら反映したるで。"
recommended: "これええで"
auto: "勝手にやる"
specify-language: "言語選びや"
design: "見た感じ"
dark-mode: "ナイトゲームや!"
i-am-under-limited-internet: "電波と阪神がザコいんや"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロックやめたる"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近儲かりまっか?"
images: "画像"

View File

@ -26,7 +26,7 @@ common:
close: "닫기"
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
load-more: "더보기"
enter-password: "パスワードを入力してください"
enter-password: "비밀번호를 입력하여 주십시오"
got-it: "알겠습니다"
customization-tips:
title: "커스터마이징 도움말"
@ -124,7 +124,7 @@ common:
is-remote-user: "이 유저 정보는 복사본입니다."
is-remote-post: "이 글 정보는 복사본입니다."
view-on-remote: "정확한 정보 보기"
renoted-by: "{user} Renote"
renoted-by: "{user}이(가) Renote"
error:
title: '오류가 발생했습니다'
retry: '다시 시도'
@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}명이 언급함"
empty: "트렌드 없음"
common/views/components/language-settings.vue:
title: "표시 언어"
pick-language: "언어 설정"
recommended: "추천"
auto: "자동"
specify-language: "언어 지정"
info: "변경사항은 페이지를 새로고침한 뒤에 반영됩니다."
common/views/components/profile-editor.vue:
title: "프로필"
name: "이름"
@ -458,10 +465,10 @@ common/views/components/profile-editor.vue:
saved: "프로필을 저장하였습니다"
uploading: "업로드 중"
upload-failed: "업로드에 실패하였습니다"
email: "メール設定"
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
email: "메일 설정"
email-address: "메일 주소"
email-verified: "매일 주소가 확인되었습니다"
email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
common/views/widgets/broadcast.vue:
fetching: "확인중"
no-broadcasts: "공지사항이 없습니다"
@ -736,8 +743,8 @@ desktop/views/components/settings.vue:
note-visibility: "게시물의 공개 범위"
default-note-visibility: "기본 공개 범위"
remember-note-visibility: "글의 공개 범위를 기억하기"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: ": https://www.google.com/?#q={{query}}"
web-search-engine: "웹 검색엔진"
web-search-engine-desc: ": https://www.google.com/?#q={{query}}"
auto-popout: "창 자동 팝아웃"
auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
advanced: "고급 설정"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "글이나 메시지를 송수신하였을 때 소리를 재생합니다. 이 설정은 브라우저에 저장됩니다."
volume: "음량"
test: "테스트"
language: "언어"
pick-language: "언어 설정"
recommended: "추천"
auto: "자동"
specify-language: "언어 지정"
language-desc: "변경사항은 페이지를 새로고침한 뒤에 반영됩니다."
cache: "캐시"
clean-cache: "지우기"
cache-warn: "지우기를 실행하면 브라우저에 저장된 계정 정보 캐시, 글이나 답글 및 메시지의 임시 저장, 그 외 데이터 (설정 정보 포함) 가 삭제 됩니다. 지우기 작업을 수행한 후 페이지를 다시 로드해야 합니다."
@ -1004,15 +1005,16 @@ admin/views/instance.vue:
external-user-recommendation-engine-desc: "예: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
external-user-recommendation-timeout: "타임 아웃"
external-user-recommendation-timeout-desc: "밀리초 (예: 300000)"
email-config: "メールサーバーの設定"
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
email-config: "메일 서버 설정"
email-config-info: "메일 주소 확인 혹은 암호 재설정에 사용 됩니다."
enable-email: "메일 발신 활성화"
email: "메일 주소"
smtp-secure: "SMTP 연결에 암시적으로 SSL/TLS를 사용"
smtp-secure-info: "STARTTLS를 사용 시 ON으로 합니다."
smtp-host: "SMTP 호스트"
smtp-port: "SMTP 포트"
smtp-user: "SMTP 사용자"
smtp-pass: "SMTP 비밀번호"
admin/views/charts.vue:
title: "차트"
per-day: "1일마다"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "파일 선택"
mobile/views/pages/settings.vue:
signed-in-as: "{}(으)로 로그인"
lang: "언어"
lang-tip: "변경사항은 페이지를 새로고침한 뒤에 반영됩니다."
recommended: "추천"
auto: "자동"
specify-language: "언어 지정"
design: "디자인 및 표시"
dark-mode: "다크 모드"
i-am-under-limited-internet: "저는 통신 대역폭이 제한되어 있습니다"
@ -1387,8 +1384,8 @@ mobile/views/pages/settings.vue:
note-visibility: "게시물의 공개 범위"
default-note-visibility: "기본 공개 범위"
remember-note-visibility: "글의 공개 범위를 기억하기"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: ": https://www.google.com/?#q={{query}}"
web-search-engine: "웹 검색엔진"
web-search-engine-desc: ": https://www.google.com/?#q={{query}}"
disable-via-mobile: "작성하는 글에 \"모바일에서 작성함\" 을 붙이지 않음"
load-raw-images: "첨부 이미지를 고품질로 표시"
load-remote-media: "원격 서버의 미디어를 표시"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "차단"
unblock: "차단 해제"
years-old: "{age}세"
push-to-list: "리스트에 추가"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "최근 글"
images: "이미지"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "Een geluid afspelen bij het ontvangen van een bericht. Deze instelling wordt opgeslagen in je browser."
volume: "Volume"
test: "Testen"
language: "Taal"
pick-language: "Selecteer een taal"
recommended: "Aanbevolen"
auto: "Automatisch"
specify-language: "Taal opgeven"
language-desc: "Je moet de pagina herladen om de wijzigingen toe te passen."
cache: "Cache"
clean-cache: "Opschonen"
cache-warn: "De cache van je accountinformatie/berichten/antwoorden/instellingen wordt verwijderd. Je moet de pagina herladen na het opschonen."
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "Kies een bestand"
mobile/views/pages/settings.vue:
signed-in-as: "Ingelogd als {}"
lang: "Taal"
lang-tip: "Je moet de pagina herladen om de wijzigingen toe te passen."
recommended: "Aanbevolen"
auto: "Automatisch"
specify-language: "Taal opgeven"
design: "Ontwerp en weergave"
dark-mode: "Donkere modus"
i-am-under-limited-internet: "Ik heb beperkt internet"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "Recente notities"
images: "Afbeeldingen"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "Volum"
test: "Test"
language: "Språk"
pick-language: "Velg språk"
recommended: "Anbefalt"
auto: "Automatisk"
specify-language: "Angi språk"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "Hurtiglager"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "Språk"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "Anbefalt"
auto: "Automatisk"
specify-language: "Angi språk"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "Nylige innlegg"
images: "Bilder"

View File

@ -16,7 +16,7 @@ common:
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
ui: "Interfejs"
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
drive: "ドライブ"
drive: "Dysk"
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
adblock:
@ -53,7 +53,7 @@ common:
years_ago: "{} lat temu"
month-and-day: "{month}-{day}"
trash: "Kosz"
drive: "ドライブ"
drive: "Dysk"
messaging: "トーク"
weekday-short:
sunday: "N"
@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
volume: "Głośność"
test: "Test"
language: "Język"
pick-language: "Wybierz język"
recommended: "Zalecane"
auto: "Automatycznie"
specify-language: "Wybierz język"
language-desc: "Aby zmiany zostały uwzględnione, odśwież stronę."
cache: "Pamięć podręczna"
clean-cache: "Wyczyść"
cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu."
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "Wybierz plik"
mobile/views/pages/settings.vue:
signed-in-as: "Zalogowany jako {}"
lang: "Język"
lang-tip: "Aby zmiany zostały uwzględnione, odśwież stronę."
recommended: "Zalecany"
auto: "Automatycznie"
specify-language: "Wybierz język"
design: "Wygląd i wyświetlanie"
dark-mode: "Tryb ciemny"
i-am-under-limited-internet: "Ograniczaj zużycie transferu"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age} lat"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "Ostatnie wpisy"
images: "Zdjęcia"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "Notas recentes"
images: "Imagens"

View File

@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{}人が投稿"
empty: "トレンドなし"
common/views/components/language-settings.vue:
title: "表示言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
@ -1008,7 +1009,8 @@ admin/views/instance.vue:
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
smtp-secure-info: "STARTTLS使用時はオフにします。"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "ブロック"
unblock: "ブロック解除"
years-old: "{age}歳"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"

View File

@ -26,7 +26,7 @@ common:
close: "关闭"
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
load-more: "加载更多"
enter-password: "パスワードを入力してください"
enter-password: "请输入您的密码"
got-it: "没问题"
customization-tips:
title: "客制化提示"
@ -439,6 +439,13 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue:
count: "{} 被提到"
empty: "没有流行的标签"
common/views/components/language-settings.vue:
title: "显示语言"
pick-language: "选择一个语言"
recommended: "推荐"
auto: "自动"
specify-language: "指定语言"
info: "你需要刷新这个页面来应用更改。"
common/views/components/profile-editor.vue:
title: "简况"
name: "名称"
@ -458,10 +465,10 @@ common/views/components/profile-editor.vue:
saved: "更新配置文件成功"
uploading: "正在上传"
upload-failed: "上传失败"
email: "メール設定"
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
email: "邮件设置"
email-address: "电子邮件地址"
email-verified: "电子邮件地址已验证"
email-not-verified: "电子邮件地址还没有验证哦, 请检查一下收信箱吧~"
common/views/widgets/broadcast.vue:
fetching: "确认中"
no-broadcasts: "没有公告"
@ -736,8 +743,8 @@ desktop/views/components/settings.vue:
note-visibility: "帖子可见性"
default-note-visibility: "默认可见性"
remember-note-visibility: "记住帖子可见性"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
web-search-engine: "搜索引擎"
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
auto-popout: "自动弹出窗口"
auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
advanced: "更多设置"
@ -774,12 +781,6 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "收到帖子/留言时播放声音。 此设置将被存储在浏览器中。"
volume: "音量"
test: "测试"
language: "语言"
pick-language: "选择一个语言"
recommended: "推荐"
auto: "自动"
specify-language: "指定语言"
language-desc: "你需要刷新这个页面来应用更改。"
cache: "缓存"
clean-cache: "清除缓存"
cache-warn: "将删除存储在浏览器中的帐户信息/帖子/回复/消息/设置的缓存。 清理完毕后需要刷新页面。"
@ -1004,15 +1005,16 @@ admin/views/instance.vue:
external-user-recommendation-engine-desc: "例如: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
external-user-recommendation-timeout: "超时"
external-user-recommendation-timeout-desc: "单位为毫秒 (例如300000)"
email-config: "メールサーバーの設定"
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする"
email: "メールアドレス"
smtp-use-ssl: "SMTPサーバーはSSLを使用"
smtp-host: "SMTPホスト"
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
email-config: "电子邮件服务器设置"
email-config-info: "用于确认电子邮件和密码重置等。"
enable-email: "启用电子邮件送递"
email: "电子邮件地址"
smtp-secure: "SMTP 连接中使用隐式 SSL / TLS"
smtp-secure-info: "使用时关闭 STARTTLS。"
smtp-host: "SMTP 服务器地址 (主机名)"
smtp-port: "SMTP 端口"
smtp-user: "SMTP 用户名"
smtp-pass: "SMTP 密码"
admin/views/charts.vue:
title: "历史记录"
per-day: "每天"
@ -1360,11 +1362,6 @@ mobile/views/pages/selectdrive.vue:
select-file: "选择文件"
mobile/views/pages/settings.vue:
signed-in-as: "以{}登录"
lang: "语言"
lang-tip: "你需要刷新这个页面来应用更改。"
recommended: "推荐"
auto: "自动"
specify-language: "选择语言"
design: "设计与展示"
dark-mode: "夜间模式"
i-am-under-limited-internet: "我的带宽有限"
@ -1387,8 +1384,8 @@ mobile/views/pages/settings.vue:
note-visibility: "帖子可见性"
default-note-visibility: "默认可见性"
remember-note-visibility: "记住帖子可见性"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
web-search-engine: "搜索引擎"
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
disable-via-mobile: "不要将帖子标记为“来自手机”"
load-raw-images: "以原始质量显示附加图像"
load-remote-media: "显示来自远程服务器的媒体"
@ -1433,6 +1430,9 @@ mobile/views/pages/user.vue:
block: "屏蔽"
unblock: "取消屏蔽"
years-old: "{age}岁"
push-to-list: "添加至列表"
select-list: "选择一个列表"
list-pushed: "成功添加{user}到{list}"
mobile/views/pages/user/home.vue:
recent-notes: "最近的帖子"
images: "图片"

View File

@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "10.59.2",
"clientVersion": "2.0.12277",
"version": "10.60.4",
"clientVersion": "2.0.12401",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@ -35,7 +35,7 @@
"@types/deep-equal": "1.0.1",
"@types/double-ended-queue": "2.1.0",
"@types/elasticsearch": "5.0.28",
"@types/file-type": "5.2.1",
"@types/file-type": "5.2.2",
"@types/gulp": "3.8.36",
"@types/gulp-htmlmin": "1.3.32",
"@types/gulp-mocha": "0.0.32",
@ -156,6 +156,7 @@
"koa-send": "5.0.0",
"koa-slow": "2.1.0",
"koa-views": "6.1.4",
"langmap": "0.0.16",
"loader-utils": "1.1.0",
"minio": "7.0.1",
"mkdirp": "0.5.1",
@ -223,7 +224,7 @@
"vue-content-loading": "1.5.3",
"vue-cropperjs": "2.2.2",
"vue-i18n": "8.3.2",
"vue-js-modal": "1.3.26",
"vue-js-modal": "1.3.27",
"vue-loader": "15.4.2",
"vue-marquee-text-component": "1.1.0",
"vue-router": "3.0.2",
@ -236,7 +237,7 @@
"vuex-persistedstate": "2.5.4",
"web-push": "3.3.3",
"webfinger.js": "2.7.0",
"webpack": "4.26.0",
"webpack": "4.26.1",
"webpack-cli": "3.1.2",
"websocket": "1.0.28",
"ws": "6.1.2",

View File

@ -48,15 +48,15 @@ export default Vue.extend({
},
remove(i) {
this.$root.alert({
this.$root.dialog({
type: 'warning',
text: this.$t('_remove.are-you-sure').replace('$1', this.announcements.find((_, j) => j == i).title),
showCancelButton: true
}).then(res => {
if (!res) return;
}).then(({ canceled }) => {
if (canceled) return;
this.announcements = this.announcements.filter((_, j) => j !== i);
this.save(true);
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('_remove.removed')
});
@ -68,13 +68,13 @@ export default Vue.extend({
broadcasts: this.announcements
}).then(() => {
if (!silent) {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('saved')
});
}
}).catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e
});

View File

@ -75,13 +75,13 @@ export default Vue.extend({
url: this.url,
aliases: this.aliases.split(' ').filter(x => x.length > 0)
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('add-emoji.added')
});
this.fetchEmojis();
}).catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e
});
@ -103,12 +103,12 @@ export default Vue.extend({
url: emoji.url,
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('updated')
});
}).catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e
});
@ -116,23 +116,23 @@ export default Vue.extend({
},
removeEmoji(emoji) {
this.$root.alert({
this.$root.dialog({
type: 'warning',
text: this.$t('remove-emoji.are-you-sure').replace('$1', emoji.name),
showCancelButton: true
}).then(res => {
if (!res) return;
}).then(({ canceled }) => {
if (canceled) return;
this.$root.api('admin/emoji/remove', {
id: emoji.id
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('remove-emoji.removed')
});
this.fetchEmojis();
}).catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e
});

View File

@ -212,7 +212,7 @@ export default Vue.extend({
this.$root.api('admin/invite').then(x => {
this.inviteCode = x.code;
}).catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e
});
@ -258,12 +258,12 @@ export default Vue.extend({
smtpUser: this.smtpUser,
smtpPass: this.smtpPass
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('saved')
});
}).catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e
});

View File

@ -34,14 +34,14 @@ export default Vue.extend({
const process = async () => {
const user = await this.$root.api('users/show', parseAcct(this.username));
await this.$root.api('admin/moderators/add', { userId: user.id });
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('add-moderator.added')
});
};
await process().catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e.toString()
});

View File

@ -115,12 +115,12 @@ export default Vue.extend({
return await this.$root.api('users/show', this.target.startsWith('@') ? parseAcct(this.target) : { userId: this.target });
} catch (e) {
if (e == 'user not found') {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: this.$t('user-not-found')
});
} else {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e.toString()
});
@ -138,7 +138,7 @@ export default Vue.extend({
async resetPassword() {
const user = await this.fetchUser();
this.$root.api('admin/reset-password', { userId: user.id }).then(res => {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('password-updated', { password: res.password })
});
@ -151,14 +151,14 @@ export default Vue.extend({
const process = async () => {
const user = await this.fetchUser();
await this.$root.api('admin/verify-user', { userId: user.id });
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('verified')
});
};
await process().catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e.toString()
});
@ -173,14 +173,14 @@ export default Vue.extend({
const process = async () => {
const user = await this.fetchUser();
await this.$root.api('admin/unverify-user', { userId: user.id });
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('unverified')
});
};
await process().catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e.toString()
});
@ -195,14 +195,14 @@ export default Vue.extend({
const process = async () => {
const user = await this.fetchUser();
await this.$root.api('admin/suspend-user', { userId: user.id });
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('suspended')
});
};
await process().catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e.toString()
});
@ -217,14 +217,14 @@ export default Vue.extend({
const process = async () => {
const user = await this.fetchUser();
await this.$root.api('admin/unsuspend-user', { userId: user.id });
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('unsuspended')
});
};
await process().catch(e => {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: e.toString()
});

View File

@ -21,12 +21,12 @@ export default async function($root: any, force = false, silent = false) {
console.error(e);
}
if (!silent) {
$root.alert({
/*if (!silent) {
$root.dialog({
title: $root.$t('@.update-available-title'),
text: $root.$t('@.update-available', { newer, current })
});
}
}*/
return newer;
} else {

View File

@ -4,7 +4,7 @@ export default ($root: any) => {
require('fuckadblock');
function adBlockDetected() {
$root.alert({
$root.dialog({
title: $root.$t('@.adblock.detected'),
text: $root.$t('@.adblock.warning')
});

View File

@ -142,7 +142,7 @@ export default (opts: Opts = {}) => ({
this.$root.api('notes/favorites/create', {
noteId: this.appearNote.id
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
splash: true
});

View File

@ -50,10 +50,13 @@ export default Vue.extend({
methods: {
regenerateToken() {
this.$input({
this.$root.dialog({
title: this.$t('enter-password'),
type: 'password'
}).then(password => {
input: {
type: 'password'
}
}).then(({ canceled, result: password }) => {
if (canceled) return;
this.$root.api('i/regenerate_token', {
password: password
});

View File

@ -187,7 +187,8 @@ export default Vue.extend({
} else {
this.$root.api('users/search', {
query: this.q,
limit: 30
limit: 10,
detail: false
}).then(users => {
this.users = users;
this.fetching = false;

View File

@ -2,12 +2,17 @@
<div class="felqjxyj" :class="{ splash }">
<div class="bg" ref="bg" @click="onBgClick"></div>
<div class="main" ref="main">
<div class="icon" :class="type"><fa :icon="icon"/></div>
<div class="icon" v-if="!input && !select && !user" :class="type"><fa :icon="icon"/></div>
<header v-if="title" v-html="title"></header>
<div class="body" v-if="text" v-html="text"></div>
<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input>
<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><span slot="prefix">@</span></ui-input>
<ui-select v-if="select" v-model="selectedValue">
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
</ui-select>
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash">
<ui-button @click="ok" primary autofocus>OK</ui-button>
<ui-button @click="cancel" v-if="showCancelButton">Cancel</ui-button>
<ui-button @click="ok" primary :autofocus="!input && !select && !user">OK</ui-button>
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">Cancel</ui-button>
</ui-horizon-group>
</div>
</div>
@ -17,6 +22,7 @@
import Vue from 'vue';
import * as anime from 'animejs';
import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
import parseAcct from "../../../../../misc/acct/parse";
export default Vue.extend({
props: {
@ -33,6 +39,15 @@ export default Vue.extend({
type: String,
required: false
},
input: {
required: false
},
select: {
required: false
},
user: {
required: false
},
showCancelButton: {
type: Boolean,
default: false
@ -43,6 +58,14 @@ export default Vue.extend({
}
},
data() {
return {
inputValue: this.input && this.input.default ? this.input.default : null,
userInputValue: null,
selectedValue: null
};
},
computed: {
icon(): any {
switch (this.type) {
@ -82,9 +105,21 @@ export default Vue.extend({
},
methods: {
ok() {
this.$emit('ok');
this.close();
async ok() {
if (this.user) {
const user = await this.$root.api('users/show', parseAcct(this.userInputValue));
if (user) {
this.$emit('ok', user);
this.close();
}
} else {
const result =
this.input ? this.inputValue :
this.select ? this.selectedValue :
true;
this.$emit('ok', result);
this.close();
}
},
cancel() {
@ -114,6 +149,14 @@ export default Vue.extend({
onBgClick() {
this.cancel();
},
onInputKeydown(e) {
if (e.which == 13) { // Enter
e.preventDefault();
e.stopPropagation();
this.ok();
}
}
}
});
@ -180,8 +223,11 @@ export default Vue.extend({
display block
margin 0 auto
& + header
margin-top 16px
> header
margin 16px 0 8px 0
margin 0 0 8px 0
font-weight bold
font-size 20px

View File

@ -1,64 +0,0 @@
<template>
<div class="mk-discord-setting">
<p>{{ $t('description') }}</p>
<p class="account" v-if="$store.state.i.discord" :title="`Discord ID: ${$store.state.i.discord.id}`">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
<p>
<a :href="`${apiUrl}/connect/discord`" target="_blank" @click.prevent="connect">{{ $store.state.i.discord ? this.$t('reconnect') : this.$t('connect') }}</a>
<span v-if="$store.state.i.discord"> or </span>
<a :href="`${apiUrl}/disconnect/discord`" target="_blank" v-if="$store.state.i.discord" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
</p>
<p class="id" v-if="$store.state.i.discord">Discord ID: {{ $store.state.i.discord.id }}</p>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl } from '../../../config';
export default Vue.extend({
i18n: i18n('common/views/components/discord-setting.vue'),
data() {
return {
form: null,
apiUrl
};
},
mounted() {
this.$watch('$store.state.i', () => {
if (this.$store.state.i.discord && this.form)
this.form.close();
}, {
deep: true
});
},
methods: {
connect() {
this.form = window.open(apiUrl + '/connect/discord',
'discord_connect_window',
'height=570, width=520');
},
disconnect() {
window.open(apiUrl + '/disconnect/discord',
'discord_disconnect_window',
'height=570, width=520');
}
}
});
</script>
<style lang="stylus" scoped>
.mk-discord-setting
.account
border solid 1px #e1e8ed
border-radius 4px
padding 16px
a
font-weight bold
color inherit
.id
color #8899a6
</style>

View File

@ -99,23 +99,22 @@ export default Vue.extend({
this.$emit('go', game);
},
match() {
this.$input({
title: this.$t('enter-username')
}).then(username => {
this.$root.api('users/show', {
username
}).then(user => {
this.$root.api('games/reversi/match', {
userId: user.id
}).then(res => {
if (res == null) {
this.$emit('matching', user);
} else {
this.$emit('go', res);
}
});
});
async match() {
const { result: user } = await this.$root.dialog({
title: this.$t('enter-username'),
user: {
local: true
}
});
if (user == null) return;
this.$root.api('games/reversi/match', {
userId: user.id
}).then(res => {
if (res == null) {
this.$emit('matching', user);
} else {
this.$emit('go', res);
}
});
},

View File

@ -1,64 +0,0 @@
<template>
<div class="mk-github-setting">
<p>{{ $t('description') }}</p>
<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
<p>
<a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? this.$t('reconnect') : this.$t('connect') }}</a>
<span v-if="$store.state.i.github"> or </span>
<a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
</p>
<p class="id" v-if="$store.state.i.github">GitHub ID: {{ $store.state.i.github.id }}</p>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl } from '../../../config';
export default Vue.extend({
i18n: i18n('common/views/components/github-setting.vue'),
data() {
return {
form: null,
apiUrl
};
},
mounted() {
this.$watch('$store.state.i', () => {
if (this.$store.state.i.github && this.form)
this.form.close();
}, {
deep: true
});
},
methods: {
connect() {
this.form = window.open(apiUrl + '/connect/github',
'github_connect_window',
'height=570, width=520');
},
disconnect() {
window.open(apiUrl + '/disconnect/github',
'github_disconnect_window',
'height=570, width=520');
}
}
});
</script>
<style lang="stylus" scoped>
.mk-github-setting
.account
border solid 1px #e1e8ed
border-radius 4px
padding 16px
a
font-weight bold
color inherit
.id
color #8899a6
</style>

View File

@ -0,0 +1,96 @@
<template>
<ui-card>
<div slot="title"><fa icon="share-alt"/> {{ $t('title') }}</div>
<section>
<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
</section>
<section>
<header><fa :icon="['fab', 'discord']"/> Discord</header>
<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discord.com/${$store.state.i.discord.screenName}`" target="_blank">@{{ $store.state.i.discord.screenName }}</a></p>
<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
</section>
<section>
<header><fa :icon="['fab', 'github']"/> GitHub</header>
<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.screenName}`" target="_blank">@{{ $store.state.i.github.screenName }}</a></p>
<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectGithub">{{ $t('connect') }}</ui-button>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl } from '../../../config';
export default Vue.extend({
i18n: i18n('common/views/components/integration-settings.vue'),
data() {
return {
apiUrl,
twitterForm: null,
discordForm: null,
githubForm: null,
};
},
mounted() {
this.$watch('$store.state.i', () => {
if (this.$store.state.i.twitter) {
if (this.twitterForm) this.twitterForm.close();
}
}, {
deep: true
});
},
methods: {
connectTwitter() {
this.twitterForm = window.open(apiUrl + '/connect/twitter',
'twitter_connect_window',
'height=570, width=520');
},
disconnectTwitter() {
window.open(apiUrl + '/disconnect/twitter',
'twitter_disconnect_window',
'height=570, width=520');
},
connectDiscord() {
this.discordForm = window.open(apiUrl + '/connect/discord',
'discord_connect_window',
'height=570, width=520');
},
disconnectDiscord() {
window.open(apiUrl + '/disconnect/discord',
'discord_disconnect_window',
'height=570, width=520');
},
connectGithub() {
this.githubForm = window.open(apiUrl + '/connect/github',
'github_connect_window',
'height=570, width=520');
},
disconnectGithub() {
window.open(apiUrl + '/disconnect/github',
'github_disconnect_window',
'height=570, width=520');
},
}
});
</script>
<style lang="stylus" scoped>
</style>

View File

@ -0,0 +1,54 @@
<template>
<ui-card>
<div slot="title"><fa icon="language"/> {{ $t('title') }}</div>
<section class="fit-top">
<ui-select v-model="lang" :placeholder="$t('pick-language')">
<optgroup :label="$t('recommended')">
<option value="">{{ $t('auto') }}</option>
</optgroup>
<optgroup :label="$t('specify-language')">
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
</optgroup>
</ui-select>
<ui-info>Current: <i>{{ currentLanguage }}</i></ui-info>
<ui-info warn>{{ $t('info') }}</ui-info>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { langs } from '../../../config';
export default Vue.extend({
i18n: i18n('common/views/components/language-settings.vue'),
data() {
return {
langs,
currentLanguage: 'Unknown',
};
},
computed: {
lang: {
get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
},
},
created() {
try {
const locale = JSON.parse(localStorage.getItem('locale') || "{}");
const localeKey = localStorage.getItem('localeKey');
this.currentLanguage = `${locale.meta.lang} (${localeKey})`;
} catch { }
},
methods: {
}
});
</script>

View File

@ -1,5 +1,5 @@
<template>
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv">
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv" :class="{ big: $root.isMobile }">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ hukidasi }" ref="popover">
<template v-for="item, i in items">
@ -125,6 +125,11 @@ export default Vue.extend({
position initial
&.big
> .popover
> button
font-size 15px
> .backdrop
position fixed
top 0

View File

@ -115,9 +115,11 @@ export default Vue.extend({
}
this.$root.api('users/search', {
query: this.q,
max: 5
localOnly: true,
limit: 10,
detail: false
}).then(users => {
this.result = users;
this.result = users.filter(user => user.id != this.$store.state.i.id);
});
},
navigate(user) {

View File

@ -78,7 +78,7 @@ export default Vue.extend({
this.$root.api('i/pin', {
noteId: this.note.id
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
splash: true
});
@ -95,12 +95,12 @@ export default Vue.extend({
},
del() {
this.$root.alert({
this.$root.dialog({
type: 'warning',
text: this.$t('delete-confirm'),
showCancelButton: true
}).then(res => {
if (!res) return;
}).then(({ canceled }) => {
if (canceled) return;
this.$root.api('notes/delete', {
noteId: this.note.id
@ -114,7 +114,7 @@ export default Vue.extend({
this.$root.api('notes/favorites/create', {
noteId: this.note.id
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
splash: true
});
@ -126,7 +126,7 @@ export default Vue.extend({
this.$root.api('notes/favorites/delete', {
noteId: this.note.id
}).then(() => {
this.$root.alert({
this.$root.dialog({
type: 'success',
splash: true
});

View File

@ -11,34 +11,43 @@ import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('common/views/components/password-settings.vue'),
methods: {
reset() {
this.$input({
async reset() {
const { canceled: canceled1, result: currentPassword } = await this.$root.dialog({
title: this.$t('enter-current-password'),
type: 'password'
}).then(currentPassword => {
this.$input({
title: this.$t('enter-new-password'),
input: {
type: 'password'
}).then(newPassword => {
this.$input({
title: this.$t('enter-new-password-again'),
type: 'password'
}).then(newPassword2 => {
if (newPassword !== newPassword2) {
this.$root.alert({
title: null,
text: this.$t('not-match')
});
return;
}
this.$root.api('i/change_password', {
currentPasword: currentPassword,
newPassword: newPassword
}).then(() => {
this.$notify(this.$t('changed'));
});
});
}
});
if (canceled1) return;
const { canceled: canceled2, result: newPassword } = await this.$root.dialog({
title: this.$t('enter-new-password'),
input: {
type: 'password'
}
});
if (canceled2) return;
const { canceled: canceled3, result: newPassword2 } = await this.$root.dialog({
title: this.$t('enter-new-password-again'),
input: {
type: 'password'
}
});
if (canceled3) return;
if (newPassword !== newPassword2) {
this.$root.dialog({
title: null,
text: this.$t('not-match')
});
return;
}
this.$root.api('i/change_password', {
currentPasword: currentPassword,
newPassword: newPassword
}).then(() => {
this.$notify(this.$t('changed'));
});
}
}

View File

@ -32,6 +32,12 @@
<span>{{ $t('description') }}</span>
</ui-textarea>
<ui-select v-model="lang">
<span slot="label">{{ $t('language') }}</span>
<span slot="icon"><fa icon="language"/></span>
<option v-for="lang in unique(Object.values(langmap).map(x => x.nativeName)).map(name => Object.keys(langmap).find(k => langmap[k].nativeName == name))" :value="lang" :key="lang">{{ langmap[lang].nativeName }}</option>
</ui-select>
<ui-input type="file" @change="onAvatarChange">
<span>{{ $t('avatar') }}</span>
<span slot="icon"><fa icon="image"/></span>
@ -87,12 +93,16 @@ import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl, host } from '../../../config';
import { toUnicode } from 'punycode';
import langmap from 'langmap';
import { unique } from '../../../../../prelude/array';
export default Vue.extend({
i18n: i18n('common/views/components/profile-editor.vue'),
data() {
return {
unique,
langmap,
host: toUnicode(host),
enableEmail: false,
email: null,
@ -100,6 +110,7 @@ export default Vue.extend({
username: null,
location: null,
description: null,
lang: null,
birthday: null,
avatarId: null,
bannerId: null,
@ -137,6 +148,7 @@ export default Vue.extend({
this.username = this.$store.state.i.username;
this.location = this.$store.state.i.profile.location;
this.description = this.$store.state.i.description;
this.lang = this.$store.state.i.lang;
this.birthday = this.$store.state.i.profile.birthday;
this.avatarId = this.$store.state.i.avatarId;
this.bannerId = this.$store.state.i.bannerId;
@ -198,6 +210,7 @@ export default Vue.extend({
name: this.name || null,
location: this.location || null,
description: this.description || null,
lang: this.lang,
birthday: this.birthday || null,
avatarId: this.avatarId || undefined,
bannerId: this.bannerId || undefined,
@ -213,7 +226,7 @@ export default Vue.extend({
this.$store.state.i.bannerUrl = i.bannerUrl;
if (notify) {
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('saved')
});
@ -222,10 +235,13 @@ export default Vue.extend({
},
updateEmail() {
this.$input({
this.$root.dialog({
title: this.$t('@.enter-password'),
type: 'password'
}).then(password => {
input: {
type: 'password'
}
}).then(({ canceled, result: password }) => {
if (canceled) return;
this.$root.api('i/update_email', {
password: password,
email: this.email == '' ? null : this.email

View File

@ -223,7 +223,7 @@ export default Vue.extend({
try {
theme = JSON5.parse(code);
} catch (e) {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: this.$t('invalid-theme')
});
@ -236,7 +236,7 @@ export default Vue.extend({
}
if (theme.id == null) {
this.$root.alert({
this.$root.dialog({
type: 'error',
text: this.$t('invalid-theme')
});
@ -244,7 +244,7 @@ export default Vue.extend({
}
if (this.$store.state.device.themes.some(t => t.id == theme.id)) {
this.$root.alert({
this.$root.dialog({
type: 'info',
text: this.$t('already-installed')
});
@ -256,7 +256,7 @@ export default Vue.extend({
key: 'themes', value: themes
});
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('installed').replace('{}', theme.name)
});
@ -269,7 +269,7 @@ export default Vue.extend({
key: 'themes', value: themes
});
this.$root.alert({
this.$root.dialog({
type: 'info',
text: this.$t('uninstalled').replace('{}', theme.name)
});
@ -306,7 +306,7 @@ export default Vue.extend({
const theme = this.myTheme;
if (theme.name == null || theme.name.trim() == '') {
this.$root.alert({
this.$root.dialog({
type: 'warning',
text: this.$t('theme-name-required')
});
@ -320,7 +320,7 @@ export default Vue.extend({
key: 'themes', value: themes
});
this.$root.alert({
this.$root.dialog({
type: 'success',
text: this.$t('saved')
});

View File

@ -1,65 +0,0 @@
<template>
<div class="mk-twitter-setting">
<p>{{ $t('description') }}</p>
<p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? this.$t('reconnect') : this.$t('connect') }}</a>
<span v-if="$store.state.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
</p>
<p class="id" v-if="$store.state.i.twitter">Twitter ID: {{ $store.state.i.twitter.userId }}</p>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl } from '../../../config';
export default Vue.extend({
i18n: i18n('common/views/components/twitter-setting.vue'),
data() {
return {
form: null,
apiUrl
};
},
mounted() {
this.$watch('$store.state.i', () => {
if (this.$store.state.i.twitter) {
if (this.form) this.form.close();
}
}, {
deep: true
});
},
methods: {
connect() {
this.form = window.open(apiUrl + '/connect/twitter',
'twitter_connect_window',
'height=570, width=520');
},
disconnect() {
window.open(apiUrl + '/disconnect/twitter',
'twitter_disconnect_window',
'height=570, width=520');
}
}
});
</script>
<style lang="stylus" scoped>
.mk-twitter-setting
.account
border solid 1px #e1e8ed
border-radius 4px
padding 16px
a
font-weight bold
color inherit
.id
color #8899a6
</style>

View File

@ -43,6 +43,7 @@ export default Vue.extend({
> *
flex 1
min-width 0 !important
> *:not(:last-child)
margin-right 16px !important

View File

@ -14,17 +14,19 @@
:disabled="disabled"
:required="required"
:readonly="readonly"
:placeholder="placeholder"
:pattern="pattern"
:autocomplete="autocomplete"
:spellcheck="spellcheck"
@focus="focused = true"
@blur="focused = false"
@keydown="$emit('keydown', $event)"
>
</template>
<template v-else>
<input ref="input"
type="text"
:value="placeholder"
:value="filePlaceholder"
readonly
@click="chooseFile"
>
@ -74,6 +76,15 @@ export default Vue.extend({
type: String,
required: false
},
placeholder: {
type: String,
required: false
},
autofocus: {
type: Boolean,
required: false,
default: false
},
autocomplete: {
required: false
},
@ -109,7 +120,7 @@ export default Vue.extend({
filled(): boolean {
return this.v != '' && this.v != null;
},
placeholder(): string {
filePlaceholder(): string {
if (this.type != 'file') return null;
if (this.v == null) return null;
@ -142,6 +153,12 @@ export default Vue.extend({
}
},
mounted() {
if (this.autofocus) {
this.$nextTick(() => {
this.$refs.input.focus();
});
}
this.$nextTick(() => {
if (this.$refs.prefix) {
this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';

View File

@ -8,7 +8,7 @@ export default ($root: any) => {
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
if (!regex.test(file.name) ) {
$root.alert({
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
text: null
});
@ -87,7 +87,7 @@ export default ($root: any) => {
value: i.avatarUrl
});
$root.alert({
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
text: null
});

View File

@ -87,7 +87,7 @@ export default ($root: any) => {
value: i.bannerUrl
});
$root.alert({
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.banner-updated%',
text: null
});

View File

@ -34,7 +34,6 @@ import PostFormWindow from './views/components/post-form-window.vue';
import RenoteFormWindow from './views/components/renote-form-window.vue';
import MkChooseFileFromDriveWindow from './views/components/choose-file-from-drive-window.vue';
import MkChooseFolderFromDriveWindow from './views/components/choose-folder-from-drive-window.vue';
import InputDialog from './views/components/input-dialog.vue';
import Notification from './views/components/ui-notification.vue';
import { url } from '../config';
@ -113,22 +112,6 @@ init(async (launch) => {
});
},
$input(opts) {
return new Promise<string>((res, rej) => {
const o = opts || {};
const d = this.$root.new(InputDialog, {
title: o.title,
placeholder: o.placeholder,
default: o.default,
type: o.type || 'text',
allowEmpty: o.allowEmpty
});
d.$once('done', text => {
res(text);
});
});
},
$notify(message) {
this.$root.new(Notification, {
message

View File

@ -148,12 +148,15 @@ export default Vue.extend({
},
rename() {
this.$input({
this.$root.dialog({
title: this.$t('contextmenu.rename-file'),
placeholder: this.$t('contextmenu.input-new-file-name'),
default: this.file.name,
allowEmpty: false
}).then(name => {
input: {
placeholder: this.$t('contextmenu.input-new-file-name'),
default: this.file.name,
allowEmpty: false
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/files/update', {
fileId: this.file.id,
name: name
@ -170,7 +173,7 @@ export default Vue.extend({
copyUrl() {
copyToClipboard(this.file.url);
this.$root.alert({
this.$root.dialog({
title: this.$t('contextmenu.copied'),
text: this.$t('contextmenu.copied-url-to-clipboard')
});

View File

@ -155,7 +155,7 @@ export default Vue.extend({
}).catch(err => {
switch (err) {
case 'detected-circular-definition':
this.$root.alert({
this.$root.dialog({
title: this.$t('unable-to-process'),
text: this.$t('circular-reference-detected')
});
@ -192,11 +192,14 @@ export default Vue.extend({
},
rename() {
this.$input({
this.$root.dialog({
title: this.$t('contextmenu.rename-folder'),
placeholder: this.$t('contextmenu.input-new-folder-name'),
default: this.folder.name
}).then(name => {
input: {
placeholder: this.$t('contextmenu.input-new-folder-name'),
default: this.folder.name
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/folders/update', {
folderId: this.folder.id,
name: name

View File

@ -313,7 +313,7 @@ export default Vue.extend({
}).catch(err => {
switch (err) {
case 'detected-circular-definition':
this.$root.alert({
this.$root.dialog({
title: this.$t('unable-to-process'),
text: this.$t('circular-reference-detected')
});
@ -331,16 +331,19 @@ export default Vue.extend({
},
urlUpload() {
this.$input({
this.$root.dialog({
title: this.$t('url-upload'),
placeholder: this.$t('url-of-file')
}).then(url => {
input: {
placeholder: this.$t('url-of-file')
}
}).then(({ canceled, result: url }) => {
if (canceled) return;
this.$root.api('drive/files/upload_from_url', {
url: url,
folderId: this.folder ? this.folder.id : undefined
});
this.$root.alert({
this.$root.dialog({
title: this.$t('url-upload-requested'),
text: this.$t('may-take-time')
});
@ -348,10 +351,13 @@ export default Vue.extend({
},
createFolder() {
this.$input({
this.$root.dialog({
title: this.$t('create-folder'),
placeholder: this.$t('folder-name')
}).then(name => {
input: {
placeholder: this.$t('folder-name')
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/folders/create', {
name: name,
parentId: this.folder ? this.folder.id : undefined

View File

@ -186,7 +186,7 @@ export default Vue.extend({
methods: {
hint() {
this.$root.alert({
this.$root.dialog({
title: this.$t('@.customization-tips.title'),
text: this.$t('@.customization-tips.paragraph')
});

View File

@ -1,180 +0,0 @@
<template>
<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="destroyDom">
<span slot="header" :class="$style.header">
<fa icon="i-cursor"/>{{ title }}
</span>
<div :class="$style.body">
<input ref="text" v-model="text" :type="type" @keydown="onKeydown" :placeholder="placeholder"/>
</div>
<div :class="$style.actions">
<button :class="$style.cancel" @click="cancel">{{ $t('cancel') }}</button>
<button :class="$style.ok" :disabled="!allowEmpty && text.length == 0" @click="ok">{{ $t('ok') }}</button>
</div>
</mk-window>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('desktop/views/input-dialog.vue'),
props: {
title: {
type: String
},
placeholder: {
type: String
},
default: {
type: String
},
allowEmpty: {
default: true
},
type: {
default: 'text'
}
},
data() {
return {
done: false,
text: ''
};
},
mounted() {
if (this.default) this.text = this.default;
this.$nextTick(() => {
(this.$refs.text as any).focus();
});
},
methods: {
ok() {
if (!this.allowEmpty && this.text == '') return;
this.done = true;
(this.$refs.window as any).close();
},
cancel() {
this.done = false;
(this.$refs.window as any).close();
},
beforeClose() {
if (this.done) {
this.$emit('done', this.text);
} else {
this.$emit('canceled');
}
},
onKeydown(e) {
if (e.which == 13) { // Enter
e.preventDefault();
e.stopPropagation();
this.ok();
}
}
}
});
</script>
<style lang="stylus" module>
.header
> [data-icon]
margin-right 4px
.body
padding 16px
> input
display block
padding 8px
margin 0
width 100%
max-width 100%
min-width 100%
font-size 1em
color #333
background #fff
outline none
border solid 1px var(--primaryAlpha01)
border-radius 4px
transition border-color .3s ease
&:hover
border-color var(--primaryAlpha02)
transition border-color .1s ease
&:focus
color var(--primary)
border-color var(--primaryAlpha05)
transition border-color 0s ease
&::-webkit-input-placeholder
color var(--primaryAlpha03)
.actions
height 72px
background var(--primaryLighten95)
.ok
.cancel
display block
position absolute
bottom 16px
cursor pointer
padding 0
margin 0
width 120px
height 40px
font-size 1em
outline none
border-radius 4px
&:focus
&:after
content ""
pointer-events none
position absolute
top -5px
right -5px
bottom -5px
left -5px
border 2px solid var(--primaryAlpha03)
border-radius 8px
&:disabled
opacity 0.7
cursor default
.ok
right 16px
color var(--primaryForeground)
background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%)
border solid 1px var(--primaryLighten15)
&:not(:disabled)
font-weight bold
&:hover:not(:disabled)
background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%)
border-color var(--primary)
&:active:not(:disabled)
background var(--primary)
border-color var(--primary)
.cancel
right 148px
color #888
background linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
border solid 1px #e2e2e2
&:hover
background linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%)
border-color #dcdcdc
&:active
background #ececec
border-color #dcdcdc
</style>

View File

@ -1,5 +1,5 @@
<template>
<div class="uofhebxjdgksfmltszlxurtjnjjsvioh" v-if="video.isSensitive && hide" @click="hide = false">
<div class="uofhebxjdgksfmltszlxurtjnjjsvioh" v-if="video.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
<div>
<b><fa icon="exclamation-triangle"/> {{ $t('sensitive') }}</b>
<span>{{ $t('click-to-show') }}</span>

View File

@ -39,7 +39,7 @@
</header>
<div class="body">
<p v-if="appearNote.cw != null" class="cw">
<span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span>
<misskey-flavored-markdown v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$store.state.i" :custom-emojis="appearNote.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="appearNote.cw == null || showContent">

View File

@ -5,7 +5,7 @@
<mk-note-header class="header" :note="note" :mini="true"/>
<div class="body">
<p v-if="note.cw != null" class="cw">
<span class="text" v-if="note.cw != ''">{{ note.cw }}</span>
<misskey-flavored-markdown v-if="note.cw != ''" class="text" :text="note.cw" :author="note.user" :i="$store.state.i" :custom-emojis="note.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="note.cw == null || showContent">

View File

@ -5,7 +5,7 @@
<mk-note-header class="header" :note="note"/>
<div class="body">
<p v-if="note.cw != null" class="cw">
<span class="text" v-if="note.cw != ''">{{ note.cw }}</span>
<misskey-flavored-markdown v-if="note.cw != ''" class="text" :text="note.cw" :author="note.user" :i="$store.state.i" :custom-emojis="note.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="note.cw == null || showContent">

View File

@ -20,7 +20,7 @@
<mk-note-header class="header" :note="appearNote" :mini="mini"/>
<div class="body" v-if="appearNote.deletedAt == null">
<p v-if="appearNote.cw != null" class="cw">
<span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span>
<misskey-flavored-markdown v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$store.state.i" :custom-emojis="appearNote.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="appearNote.cw == null || showContent">

View File

@ -20,7 +20,7 @@
<mk-reaction-icon :reaction="notification.reaction"/>
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
</p>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -32,7 +32,7 @@
<p><fa icon="retweet"/>
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
</p>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note.renote)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -44,7 +44,7 @@
<p><fa icon="quote-left"/>
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
</p>
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
<router-link class="note-preview" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">{{ getNoteSummary(notification.note) }}</router-link>
</div>
</template>
@ -72,7 +72,7 @@
<p><fa icon="reply"/>
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
</p>
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
<router-link class="note-preview" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">{{ getNoteSummary(notification.note) }}</router-link>
</div>
</template>
@ -82,7 +82,7 @@
<p><fa icon="at"/>
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
</p>
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
<a class="note-preview" :href="notification.note | notePage" :title="getNoteSummary(notification.note)">{{ getNoteSummary(notification.note) }}</a>
</div>
</template>
@ -90,7 +90,7 @@
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p><fa icon="chart-pie"/><a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -219,7 +219,7 @@ export default Vue.extend({
margin 0
padding 16px
overflow-wrap break-word
font-size 13px
font-size 12px
border-bottom solid 1px var(--faceDivider)
&:last-child
@ -262,9 +262,18 @@ export default Vue.extend({
.note-preview
color var(--noteText)
display inline-block
overflow hidden
max-height 48px
word-break break-all
.note-ref
color var(--noteText)
display inline-block
width: 100%
overflow hidden
white-space nowrap
text-overflow ellipsis
[data-icon]
font-size 1em

View File

@ -15,7 +15,7 @@
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" :title="$t('click-to-tagging')">#{{ tag }}</a>
</div>
<div class="local-only" v-if="this.localOnly == true">{{ $t('local-only-message') }}</div>
<input v-show="useCw" v-model="cw" :placeholder="$t('annotations')">
<input v-show="useCw" ref="cw" v-model="cw" :placeholder="$t('annotations')" v-autocomplete="'cw'">
<div class="textarea">
<textarea :class="{ with: (files.length != 0 || poll) }"
ref="text" v-model="text" :disabled="posting"
@ -71,7 +71,6 @@ import parse from '../../../../../mfm/parse';
import { host } from '../../../config';
import { erase, unique } from '../../../../../prelude/array';
import { length } from 'stringz';
import parseAcct from '../../../../../misc/acct/parse';
import { toASCII } from 'punycode';
export default Vue.extend({
@ -384,13 +383,12 @@ export default Vue.extend({
},
addVisibleUser() {
this.$input({
title: this.$t('enter-username')
}).then(acct => {
if (acct.startsWith('@')) acct = acct.substr(1);
this.$root.api('users/show', parseAcct(acct)).then(user => {
this.visibleUsers.push(user);
});
this.$root.dialog({
title: this.$t('enter-username'),
user: true
}).then(({ canceled, result: user }) => {
if (canceled) return;
this.visibleUsers.push(user);
});
},

View File

@ -35,10 +35,13 @@ export default Vue.extend({
},
methods: {
register() {
this.$input({
this.$root.dialog({
title: this.$t('enter-password'),
type: 'password'
}).then(password => {
input: {
type: 'password'
}
}).then(({ canceled, result: password }) => {
if (canceled) return;
this.$root.api('i/2fa/register', {
password: password
}).then(data => {
@ -48,10 +51,13 @@ export default Vue.extend({
},
unregister() {
this.$input({
this.$root.dialog({
title: this.$t('enter-password'),
type: 'password'
}).then(password => {
input: {
type: 'password'
}
}).then(({ canceled, result: password }) => {
if (canceled) return;
this.$root.api('i/2fa/unregister', {
password: password
}).then(() => {

View File

@ -16,27 +16,7 @@
<div class="pages">
<div class="profile" v-show="page == 'profile'">
<x-profile-editor/>
<ui-card>
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
<section>
<x-twitter-setting/>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div>
<section>
<x-github-setting/>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord') }}</div>
<section>
<x-discord-setting/>
</section>
</ui-card>
<x-integration-settings/>
</div>
<ui-card class="theme" v-show="page == 'theme'">
@ -169,24 +149,7 @@
</section>
</ui-card>
<ui-card class="web" v-show="page == 'web'">
<div slot="title"><fa icon="language"/> {{ $t('language') }}</div>
<section class="fit-top">
<ui-select v-model="lang" :placeholder="$t('pick-language')">
<optgroup :label="$t('recommended')">
<option value="">{{ $t('auto') }}</option>
</optgroup>
<optgroup :label="$t('specify-language')">
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
</optgroup>
</ui-select>
<div class="none ui info">
<div>Current: <i>{{ this.currentLanguage }}</i></div>
<p><fa icon="info-circle"/>{{ $t('language-desc') }}</p>
</div>
</section>
</ui-card>
<x-language-settings v-show="page == 'web'"/>
<ui-card class="web" v-show="page == 'web'">
<div slot="title"><fa :icon="['far', 'trash-alt']"/> {{ $t('cache') }}</div>
@ -309,17 +272,16 @@ import X2fa from './settings.2fa.vue';
import XApps from './settings.apps.vue';
import XSignins from './settings.signins.vue';
import XTags from './settings.tags.vue';
import XTwitterSetting from '../../../common/views/components/twitter-setting.vue';
import XGithubSetting from '../../../common/views/components/github-setting.vue';
import XDiscordSetting from '../../../common/views/components/discord-setting.vue';
import XIntegrationSettings from '../../../common/views/components/integration-settings.vue';
import XTheme from '../../../common/views/components/theme.vue';
import XDriveSettings from '../../../common/views/components/drive-settings.vue';
import XMuteAndBlock from '../../../common/views/components/mute-and-block.vue';
import XPasswordSettings from '../../../common/views/components/password-settings.vue';
import XProfileEditor from '../../../common/views/components/profile-editor.vue';
import XApiSettings from '../../../common/views/components/api-settings.vue';
import XLanguageSettings from '../../../common/views/components/language-settings.vue';
import { url, langs, clientVersion as version } from '../../../config';
import { url, clientVersion as version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update';
export default Vue.extend({
@ -329,15 +291,14 @@ export default Vue.extend({
XApps,
XSignins,
XTags,
XTwitterSetting,
XGithubSetting,
XDiscordSetting,
XIntegrationSettings,
XTheme,
XDriveSettings,
XMuteAndBlock,
XPasswordSettings,
XProfileEditor,
XApiSettings,
XLanguageSettings,
},
props: {
initialPage: {
@ -350,8 +311,6 @@ export default Vue.extend({
page: this.initialPage || 'profile',
meta: null,
version,
langs,
currentLanguage: 'Unknown',
latestVersion: undefined,
checkingForUpdate: false
};
@ -412,11 +371,6 @@ export default Vue.extend({
set(value) { this.$store.commit('device/set', { key: 'soundVolume', value }); }
},
lang: {
get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
},
preventUpdate: {
get() { return this.$store.state.device.preventUpdate; },
set(value) { this.$store.commit('device/set', { key: 'preventUpdate', value }); }
@ -556,12 +510,6 @@ export default Vue.extend({
this.$root.getMeta().then(meta => {
this.meta = meta;
});
try {
const locale = JSON.parse(localStorage.getItem('locale') || "{}");
const localeKey = localStorage.getItem('localeKey');
this.currentLanguage = `${locale.meta.lang} (${localeKey})`;
} catch { }
},
methods: {
readAllUnreadNotes() {
@ -596,12 +544,12 @@ export default Vue.extend({
this.checkingForUpdate = false;
this.latestVersion = newer;
if (newer == null) {
this.$root.alert({
this.$root.dialog({
title: this.$t('no-updates'),
text: this.$t('no-updates-desc')
});
} else {
this.$root.alert({
this.$root.dialog({
title: this.$t('update-available'),
text: this.$t('update-available-desc')
});
@ -610,7 +558,7 @@ export default Vue.extend({
},
clean() {
localStorage.clear();
this.$root.alert({
this.$root.dialog({
title: this.$t('cache-cleared'),
text: this.$t('cache-cleared-desc')
});

View File

@ -109,9 +109,11 @@ export default Vue.extend({
icon: 'plus',
text: this.$t('add-list'),
action: () => {
this.$input({
this.$root.dialog({
title: this.$t('list-name'),
}).then(async title => {
input: true
}).then(async ({ canceled, result: title }) => {
if (canceled) return;
const list = await this.$root.api('users/lists/create', {
title
});

View File

@ -29,9 +29,11 @@ export default Vue.extend({
},
methods: {
add() {
this.$input({
this.$root.dialog({
title: this.$t('list-name'),
}).then(async title => {
input: true
}).then(async ({ canceled, result: title }) => {
if (canceled) return;
const list = await this.$root.api('users/lists/create', {
title
});

View File

@ -156,7 +156,7 @@ export default Vue.extend({
> .follow-button
position absolute
top 92px
top 8px
right 8px
</style>

View File

@ -167,11 +167,14 @@ export default Vue.extend({
icon: 'pencil-alt',
text: this.$t('rename'),
action: () => {
this.$input({
this.$root.dialog({
title: this.$t('rename'),
default: this.name,
allowEmpty: false
}).then(name => {
input: {
default: this.name,
allowEmpty: false
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$store.dispatch('settings/renameDeckColumn', { id: this.column.id, name });
});
}

View File

@ -8,7 +8,7 @@
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}
<fa icon="quote-right"/>
</router-link>
@ -23,7 +23,7 @@
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note.renote)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -59,7 +59,7 @@
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -112,7 +112,7 @@ export default Vue.extend({
.dsfykdcjpuwfvpefwufddclpjhzktmpw
> .notification
padding 16px
font-size 13px
font-size 12px
overflow-wrap break-word
&:after
@ -150,6 +150,11 @@ export default Vue.extend({
> .note-ref
color var(--noteText)
display inline-block
width: 100%
overflow hidden
white-space nowrap
text-overflow ellipsis
[data-icon]
font-size 1em

View File

@ -307,7 +307,7 @@ export default Vue.extend({
listId: list.id,
userId: this.user.id
});
this.$root.alert({
this.$root.dialog({
type: 'success',
splash: true
});

View File

@ -252,9 +252,11 @@ export default Vue.extend({
icon: 'hashtag',
text: this.$t('@deck.hashtag'),
action: () => {
this.$input({
title: this.$t('enter-hashtag-tl-title')
}).then(title => {
this.$root.dialog({
title: this.$t('enter-hashtag-tl-title'),
input: true
}).then(({ canceled, result: title }) => {
if (canceled) return;
this.$store.dispatch('settings/addDeckColumn', {
id: uuid(),
type: 'hashtag',

View File

@ -1,7 +1,9 @@
<template>
<div class="lkafjvabenanajk17kwqpsatoushincb">
<span><fa :icon="['fab', 'discord']"/><a :href="`https://discordapp.com/users/${user.discord.id}`" target="_blank">@{{ user.discord.username }}#{{ user.discord.discriminator }}</a></span>
</div>
<a class="lkafjvabenanajk17kwqpsatoushincb" :href="`https://discordapp.com/users/${user.discord.id}`" target="_blank">
<div>
<span><fa :icon="['fab', 'discord']"/>@{{ user.discord.username }}#{{ user.discord.discriminator }}</span>
</div>
</a>
</template>
<script lang="ts">
@ -14,13 +16,13 @@ export default Vue.extend({
<style lang="stylus" scoped>
.lkafjvabenanajk17kwqpsatoushincb
padding 32px
background #7289da
border-radius 6px
margin-left 8px
color #fff
a
margin-left 8px
div
padding 32px
background #7289da
border-radius 6px
color #fff
</style>

View File

@ -1,7 +1,9 @@
<template>
<div class="aqooishiizumijmihokohinatamihoaz">
<span><fa :icon="['fab', 'github']"/><a :href="`https://github.com/${user.github.login}`" target="_blank">@{{ user.github.login }}</a></span>
</div>
<a class="aqooishiizumijmihokohinatamihoaz" :href="`https://github.com/${user.github.login}`" target="_blank">
<div>
<span><fa :icon="['fab', 'github']"/>@{{ user.github.login }}</span>
</div>
</a>
</template>
<script lang="ts">
@ -14,13 +16,13 @@ export default Vue.extend({
<style lang="stylus" scoped>
.aqooishiizumijmihokohinatamihoaz
padding 32px
background #171515
border-radius 6px
margin-left 8px
color #fff
a
margin-left 8px
div
padding 32px
background #171515
border-radius 6px
color #fff
</style>

View File

@ -73,12 +73,12 @@ export default Vue.extend({
},
block() {
this.$root.alert({
this.$root.dialog({
type: 'warning',
text: this.$t('block-confirm'),
showCancelButton: true
}).then(res => {
if (!res) return;
}).then(({ canceled }) => {
if (canceled) return;
this.$root.api('blocking/create', {
userId: this.user.id
@ -108,9 +108,13 @@ export default Vue.extend({
listId: list.id,
userId: this.user.id
});
this.$root.alert({
this.$root.dialog({
type: 'success',
title: 'Done!',
text: this.$t('list-pushed').replace('{user}', this.user.name).replace('{list}', list.title)
text: this.$t('list-pushed', {
user: this.user.name,
list: list.title
})
});
});
}

View File

@ -1,7 +1,9 @@
<template>
<div class="adsvaidqfznoartcbplullnejvxjphcn">
<span><fa :icon="['fab', 'twitter']"/><a :href="`https://twitter.com/${user.twitter.screenName}`" target="_blank">@{{ user.twitter.screenName }}</a></span>
</div>
<a class="adsvaidqfznoartcbplullnejvxjphcn" :href="`https://twitter.com/${user.twitter.screenName}`" target="_blank">
<div>
<span><fa :icon="['fab', 'twitter']"/>@{{ user.twitter.screenName }}</span>
</div>
</a>
</template>
<script lang="ts">
@ -14,13 +16,13 @@ export default Vue.extend({
<style lang="stylus" scoped>
.adsvaidqfznoartcbplullnejvxjphcn
padding 32px
background #1a94f2
border-radius 6px
margin-left 8px
color #fff
a
margin-left 8px
div
padding 32px
background #1a94f2
border-radius 6px
color #fff
</style>

View File

@ -15,7 +15,7 @@ import checkForUpdate from './common/scripts/check-for-update';
import MiOS from './mios';
import { clientVersion as version, codename, lang } from './config';
import { builtinThemes, lightTheme, applyTheme } from './theme';
import Alert from './common/views/components/alert.vue';
import Dialog from './common/views/components/dialog.vue';
if (localStorage.getItem('theme') == null) {
applyTheme(lightTheme);
@ -143,6 +143,9 @@ import {
faCalendarAlt as farCalendarAlt,
faHdd as farHdd,
faMoon as farMoon,
faPlayCircle as farPlayCircle,
faLightbulb as farLightbulb,
faStickyNote as farStickyNote,
} from '@fortawesome/free-regular-svg-icons';
import {
@ -248,7 +251,7 @@ library.add(
faSync,
faArrowLeft,
faMapMarker,
faRobot,
faRobot,
farBell,
farEnvelope,
@ -268,6 +271,9 @@ library.add(
farCalendarAlt,
farHdd,
farMoon,
farPlayCircle,
farLightbulb,
farStickyNote,
fabTwitter,
fabGithub,
@ -451,11 +457,11 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
document.body.appendChild(x.$el);
return x;
},
alert(opts) {
dialog(opts) {
const vm = this.new(Dialog, opts);
return new Promise((res) => {
const vm = this.new(Alert, opts);
vm.$once('ok', () => res(true));
vm.$once('cancel', () => res(false));
vm.$once('ok', result => res({ canceled: false, result }));
vm.$once('cancel', () => res({ canceled: true }));
});
}
},

View File

@ -41,6 +41,12 @@ import FolderChooser from './views/components/drive-folder-chooser.vue';
*/
init((launch) => {
Vue.mixin({
data() {
return {
isMobile: true
};
},
methods: {
$post(opts) {
const o = opts || {};
@ -89,15 +95,6 @@ init((launch) => {
});
},
$input(opts) {
return new Promise<string>((res, rej) => {
const x = window.prompt(opts.title);
if (x) {
res(x);
}
});
},
$notify(message) {
alert(message);
}

View File

@ -1,5 +1,5 @@
<template>
<div class="icozogqfvdetwohsdglrbswgrejoxbdj" v-if="video.isSensitive && hide" @click="hide = false">
<div class="icozogqfvdetwohsdglrbswgrejoxbdj" v-if="video.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
<div>
<b><fa icon="exclamation-triangle"/> {{ $t('sensitive') }}</b>
<span>{{ $t('click-to-show') }}</span>

View File

@ -26,7 +26,7 @@
</header>
<div class="body">
<p v-if="appearNote.cw != null" class="cw">
<span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span>
<misskey-flavored-markdown v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$store.state.i" :custom-emojis="appearNote.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="appearNote.cw == null || showContent">
@ -152,7 +152,7 @@ export default Vue.extend({
text-align left
background var(--face)
border-radius 8px
box-shadow 0 0 2px rgba(#000, 0.1)
box-shadow 0 4px 16px rgba(#000, 0.1)
@media (min-width 500px)
box-shadow 0 8px 32px rgba(#000, 0.1)

View File

@ -5,7 +5,7 @@
<mk-note-header class="header" :note="note" :mini="true"/>
<div class="body">
<p v-if="note.cw != null" class="cw">
<span class="text" v-if="note.cw != ''">{{ note.cw }}</span>
<misskey-flavored-markdown v-if="note.cw != ''" class="text" :text="note.cw" :author="note.user" :i="$store.state.i" :custom-emojis="note.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="note.cw == null || showContent">

View File

@ -16,7 +16,7 @@
<mk-note-header class="header" :note="appearNote" :mini="true"/>
<div class="body" v-if="appearNote.deletedAt == null">
<p v-if="appearNote.cw != null" class="cw">
<span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span>
<misskey-flavored-markdown v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$store.state.i" :custom-emojis="appearNote.emojis" />
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="appearNote.cw == null || showContent">

View File

@ -186,7 +186,7 @@ export default Vue.extend({
overflow hidden
background var(--face)
border-radius 8px
box-shadow 0 0 2px rgba(#000, 0.1)
box-shadow 0 4px 16px rgba(#000, 0.1)
@media (min-width 500px)
box-shadow 0 8px 32px rgba(#000, 0.1)

View File

@ -8,7 +8,7 @@
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}
<fa icon="quote-right"/>
</router-link>
@ -23,7 +23,7 @@
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note.renote)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -59,7 +59,7 @@
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage">
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
</router-link>
</div>
@ -162,6 +162,11 @@ export default Vue.extend({
> .note-ref
color var(--noteText)
display inline-block
width: 100%
overflow hidden
white-space nowrap
text-overflow ellipsis
[data-icon]
font-size 1em

View File

@ -16,7 +16,7 @@
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">+{{ $t('add-visible-user') }}</a>
</div>
<input v-show="useCw" v-model="cw" :placeholder="$t('annotations')">
<input v-show="useCw" ref="cw" v-model="cw" :placeholder="$t('annotations')" v-autocomplete="'cw'">
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder" v-autocomplete="'text'"></textarea>
<div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
@ -62,7 +62,6 @@ import parse from '../../../../../mfm/parse';
import { host } from '../../../config';
import { erase, unique } from '../../../../../prelude/array';
import { length } from 'stringz';
import parseAcct from '../../../../../misc/acct/parse';
import { toASCII } from 'punycode';
export default Vue.extend({
@ -219,6 +218,16 @@ export default Vue.extend({
(this.$refs.text as any).focus();
},
addVisibleUser() {
this.$root.dialog({
title: this.$t('enter-username'),
user: true
}).then(({ canceled, result: user }) => {
if (canceled) return;
this.visibleUsers.push(user);
});
},
chooseFile() {
(this.$refs.file as any).click();
},

View File

@ -81,7 +81,7 @@ export default Vue.extend({
top 0
z-index 1024
width 100%
box-shadow 0 1px 0 rgba(#000, 0.075)
box-shadow 0 0px 8px rgba(0, 0, 0, 0.25)
&, *
user-select none

View File

@ -95,9 +95,13 @@ export default Vue.extend({
methods: {
search() {
const query = window.prompt(this.$t('search'));
if (query == null || query == '') return;
this.$router.push(`/search?q=${encodeURIComponent(query)}`);
this.$root.dialog({
title: this.$t('search'),
input: true
}).then(({ canceled, result: query }) => {
if (canceled) return;
this.$router.push(`/search?q=${encodeURIComponent(query)}`);
});
},
onReversiInvited() {

View File

@ -23,12 +23,12 @@ export default Vue.extend({
},
methods: {
fn() {
this.$root.alert({
this.$root.dialog({
type: 'warning',
text: this.$t('read-all'),
showCancelButton: true
}).then(res => {
if (!res) return;
}).then(({ canceled }) => {
if (canceled) return;
this.$root.api('notifications/mark_all_as_read');
});

View File

@ -105,62 +105,9 @@
</section>
</ui-card>
<ui-card>
<div slot="title"><fa icon="language"/> {{ $t('lang') }}</div>
<x-language-settings/>
<section class="fit-top">
<ui-select v-model="lang" :placeholder="$t('auto')">
<optgroup :label="$t('recommended')">
<option value="">{{ $t('auto') }}</option>
</optgroup>
<optgroup :label="$t('specify-language')">
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
</optgroup>
</ui-select>
<div>Current: <i>{{ this.currentLanguage }}</i></div>
<p><fa icon="info-circle"/> {{ $t('lang-tip') }}</p>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
<section>
<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? this.$t('twitter-reconnect') : this.$t('twitter-connect') }}</a>
<span v-if="$store.state.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">{{ $t('twitter-disconnect') }}</a>
</p>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div>
<section>
<p class="account" v-if="$store.state.i.github"><a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
<p>
<a :href="`${apiUrl}/connect/github`" target="_blank">{{ $store.state.i.github ? this.$t('github-reconnect') : this.$t('github-connect') }}</a>
<span v-if="$store.state.i.github"> or </span>
<a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github">{{ $t('github-disconnect') }}</a>
</p>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord') }}</div>
<section>
<p class="account" v-if="$store.state.i.discord"><a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
<p>
<a :href="`${apiUrl}/connect/discord`" target="_blank">{{ $store.state.i.discord ? this.$t('discord-reconnect') : this.$t('discord-connect') }}</a>
<span v-if="$store.state.i.discord"> or </span>
<a :href="`${apiUrl}/disconnect/discord`" target="_blank" v-if="$store.state.i.discord">{{ $t('discord-disconnect') }}</a>
</p>
</section>
</ui-card>
<x-integration-settings/>
<x-api-settings />
@ -199,7 +146,7 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl, clientVersion as version, codename, langs } from '../../../config';
import { apiUrl, clientVersion as version, codename } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update';
import XTheme from '../../../common/views/components/theme.vue';
import XDriveSettings from '../../../common/views/components/drive-settings.vue';
@ -207,6 +154,8 @@ import XMuteAndBlock from '../../../common/views/components/mute-and-block.vue';
import XPasswordSettings from '../../../common/views/components/password-settings.vue';
import XProfileEditor from '../../../common/views/components/profile-editor.vue';
import XApiSettings from '../../../common/views/components/api-settings.vue';
import XLanguageSettings from '../../../common/views/components/language-settings.vue';
import XIntegrationSettings from '../../../common/views/components/integration-settings.vue';
export default Vue.extend({
i18n: i18n('mobile/views/pages/settings.vue'),
@ -218,6 +167,8 @@ export default Vue.extend({
XPasswordSettings,
XProfileEditor,
XApiSettings,
XLanguageSettings,
XIntegrationSettings,
},
data() {
@ -225,8 +176,6 @@ export default Vue.extend({
apiUrl,
version,
codename,
langs,
currentLanguage: 'Unknown',
latestVersion: undefined,
checkingForUpdate: false
};
@ -277,11 +226,6 @@ export default Vue.extend({
set(value) { this.$store.commit('device/set', { key: 'loadRawImages', value }); }
},
lang: {
get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
},
enableSounds: {
get() { return this.$store.state.device.enableSounds; },
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
@ -327,7 +271,6 @@ export default Vue.extend({
set(value) { this.$store.dispatch('settings/set', { key: 'showVia', value }); }
},
iLikeSushi: {
get() { return this.$store.state.settings.iLikeSushi; },
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
@ -379,14 +322,6 @@ export default Vue.extend({
},
},
created() {
try {
const locale = JSON.parse(localStorage.getItem('locale') || "{}");
const localeKey = localStorage.getItem('localeKey');
this.currentLanguage = `${locale.meta.lang} (${localeKey})`;
} catch { }
},
mounted() {
document.title = this.$t('settings');
},
@ -402,12 +337,12 @@ export default Vue.extend({
this.checkingForUpdate = false;
this.latestVersion = newer;
if (newer == null) {
this.$root.alert({
this.$root.dialog({
title: this.$t('no-updates'),
text: this.$t('no-updates-desc')
});
} else {
this.$root.alert({
this.$root.dialog({
title: this.$t('update-available'),
text: this.$t('update-available-desc')
});

Some files were not shown because too many files have changed in this diff Show More