Compare commits

...

133 Commits

Author SHA1 Message Date
dae9c4288d 2.16.4 2018-05-23 16:00:08 +09:00
9f37149369 🎨 2018-05-23 15:58:53 +09:00
e476647ab8 🎨 2018-05-23 15:48:41 +09:00
eb23be979c oops 2018-05-23 15:47:51 +09:00
6d9d6a6779 oops 2018-05-23 15:46:20 +09:00
1c0cb1ae71 2.16.3 2018-05-23 15:27:31 +09:00
0ba5dc3900 Only show local posts in the timeline of top page 2018-05-23 15:25:15 +09:00
872717feeb Merge pull request #1638 from syuilo/l10n_master
New Crowdin translations
2018-05-23 14:07:36 +09:00
85b51f06a4 New translations ja.yml (English) 2018-05-23 14:01:15 +09:00
94df60d054 Merge pull request #1637 from syuilo/l10n_master
New Crowdin translations
2018-05-23 13:51:19 +09:00
7395284480 New translations ja.yml (English) 2018-05-23 13:50:54 +09:00
b537fa5467 Merge pull request #1636 from syuilo/l10n_master
New Crowdin translations
2018-05-22 23:55:42 +09:00
dca58c20d2 New translations ja.yml (Chinese Simplified) 2018-05-22 23:54:36 +09:00
0a3030f7d0 New translations ja.yml (English) 2018-05-22 19:35:05 +09:00
81cc6f3104 2.16.2 2018-05-22 18:20:49 +09:00
cc0b9c6933 oops 2018-05-22 18:19:02 +09:00
5671f1c6a4 2.16.1 2018-05-22 11:47:23 +09:00
89dee86f39 Fix bug and remove unnecessary query 2018-05-22 11:45:49 +09:00
b414068ada Refactor 2018-05-22 11:39:48 +09:00
3be7952e9f Improve avatar rendering 2018-05-22 11:34:40 +09:00
137b5da4aa Fix bug 2018-05-22 11:31:06 +09:00
2ee1639acb Merge pull request #1631 from syuilo/l10n_master
New Crowdin translations
2018-05-22 07:13:58 +09:00
a05b184595 New translations ja.yml (Polish) 2018-05-22 06:00:58 +09:00
f3bacae1dc 2.16.0 2018-05-21 21:52:10 +09:00
af5fb99fe6 Merge pull request #1629 from syuilo/l10n_master
New Crowdin translations
2018-05-21 21:51:39 +09:00
0ebe4ad7a3 New translations ja.yml (English) 2018-05-21 21:51:24 +09:00
0cf99037c8 Merge pull request #1628 from syuilo/l10n_master
New Crowdin translations
2018-05-21 21:41:46 +09:00
b913debc57 New translations ja.yml (Korean) 2018-05-21 21:41:26 +09:00
abe3f1f5e9 New translations ja.yml (Polish) 2018-05-21 21:41:23 +09:00
d30b88364c New translations ja.yml (Chinese Simplified) 2018-05-21 21:41:21 +09:00
4840b7acf7 New translations ja.yml (Italian) 2018-05-21 21:41:19 +09:00
f5bac11fae New translations ja.yml (Russian) 2018-05-21 21:41:17 +09:00
68a70a94fc New translations ja.yml (English) 2018-05-21 21:41:15 +09:00
bf7436ddf8 New translations ja.yml (Spanish) 2018-05-21 21:41:13 +09:00
b99155a084 New translations ja.yml (German) 2018-05-21 21:41:11 +09:00
027e62a6ea New translations ja.yml (French) 2018-05-21 21:41:08 +09:00
c6b6c8afbd Clean up 2018-05-21 21:41:06 +09:00
1236a09247 New welcome page 2018-05-21 21:39:46 +09:00
6a4d38045e Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-21 20:54:54 +09:00
281aed2797 Fix bug 2018-05-21 20:54:52 +09:00
3e47f9943a Merge pull request #1627 from syuilo/l10n_master
New Crowdin translations
2018-05-21 20:36:36 +09:00
f6d27dd17d [travis] Ignore l10n_master 2018-05-21 20:36:14 +09:00
073704c7af New translations ja.yml (Korean) 2018-05-21 20:31:48 +09:00
809db02ca2 New translations ja.yml (Polish) 2018-05-21 20:31:47 +09:00
2e45ff6a32 New translations ja.yml (Chinese Simplified) 2018-05-21 20:31:45 +09:00
02d6974be9 New translations ja.yml (Italian) 2018-05-21 20:31:43 +09:00
e530afb2fe New translations ja.yml (Russian) 2018-05-21 20:31:41 +09:00
dba15f0e8b New translations ja.yml (English) 2018-05-21 20:31:39 +09:00
8f771c60c5 New translations ja.yml (Spanish) 2018-05-21 20:31:37 +09:00
d9b1ca8c48 New translations ja.yml (German) 2018-05-21 20:31:35 +09:00
9e247c119a New translations ja.yml (French) 2018-05-21 20:31:33 +09:00
08b5e21e96 ✌️ 2018-05-21 20:30:42 +09:00
2101d3aa5b Update locales 2018-05-21 20:28:33 +09:00
aa80fb5d4a 2.15.0 2018-05-21 15:18:27 +09:00
63727f6514 Merge pull request #1626 from syuilo/l10n_master
New Crowdin translations
2018-05-21 15:11:13 +09:00
ade35cbb2d New translations ja.yml (Korean) 2018-05-21 15:10:59 +09:00
6ec9059ccc New translations ja.yml (Polish) 2018-05-21 15:10:57 +09:00
c93d1711cf New translations ja.yml (Chinese Simplified) 2018-05-21 15:10:55 +09:00
e734ad0413 New translations ja.yml (Italian) 2018-05-21 15:10:54 +09:00
047dee3a70 New translations ja.yml (Russian) 2018-05-21 15:10:52 +09:00
8c76089caf New translations ja.yml (English) 2018-05-21 15:10:50 +09:00
ab6cf2dba3 New translations ja.yml (Spanish) 2018-05-21 15:10:48 +09:00
65a309e605 New translations ja.yml (German) 2018-05-21 15:10:46 +09:00
f37e713640 New translations ja.yml (French) 2018-05-21 15:10:44 +09:00
bc1e9245bd ✌️ 2018-05-21 15:00:42 +09:00
2fa82bde16 🎨 2018-05-21 14:57:27 +09:00
140249172c Display isAdmin badge 2018-05-21 14:47:21 +09:00
9677d1288a 2.14.0 2018-05-21 11:16:17 +09:00
133ae7d171 Merge pull request #1625 from syuilo/l10n_master
New Crowdin translations
2018-05-21 11:15:45 +09:00
5b92a43361 Fix bug 2018-05-21 11:14:57 +09:00
b839bf6918 New translations ja.yml (Korean) 2018-05-21 11:11:10 +09:00
7ea4ba1d5a New translations ja.yml (Polish) 2018-05-21 11:11:08 +09:00
f000dbd657 New translations ja.yml (Chinese Simplified) 2018-05-21 11:11:06 +09:00
36e4a24527 New translations ja.yml (Italian) 2018-05-21 11:11:04 +09:00
861cc83014 New translations ja.yml (Russian) 2018-05-21 11:11:02 +09:00
d2b273dc3b New translations ja.yml (English) 2018-05-21 11:11:00 +09:00
e49ad120f3 New translations ja.yml (Spanish) 2018-05-21 11:10:58 +09:00
6f441f35ec New translations ja.yml (German) 2018-05-21 11:10:56 +09:00
14a5c429bb New translations ja.yml (French) 2018-05-21 11:10:54 +09:00
100125ad5a Fix bug 2018-05-21 11:08:14 +09:00
f8c414aafc #1621 2018-05-21 11:08:08 +09:00
14aedb07aa Update .eslintrc 2018-05-21 10:35:42 +09:00
40b01e0ad3 Merge pull request #1624 from syuilo/l10n_master
New Crowdin translations
2018-05-21 09:31:11 +09:00
f9f6718174 New translations ja.yml (Korean) 2018-05-21 09:30:52 +09:00
c41723b09f New translations ja.yml (Polish) 2018-05-21 09:30:50 +09:00
1b6effd369 New translations ja.yml (Chinese Simplified) 2018-05-21 09:30:49 +09:00
1bbf7a45a8 New translations ja.yml (Italian) 2018-05-21 09:30:47 +09:00
0a5e021128 New translations ja.yml (Russian) 2018-05-21 09:30:45 +09:00
52ebde60fc New translations ja.yml (English) 2018-05-21 09:30:43 +09:00
c77cf79f5d New translations ja.yml (Spanish) 2018-05-21 09:30:41 +09:00
1233abe5b0 New translations ja.yml (German) 2018-05-21 09:30:39 +09:00
f2f2b09ff1 New translations ja.yml (French) 2018-05-21 09:30:36 +09:00
5bf87b7efe Merge pull request #1623 from syuilo/l10n_master
New Crowdin translations
2018-05-21 09:27:57 +09:00
526321adb6 Merge pull request #1622 from m4sk1n/master
fix typo
2018-05-21 09:27:25 +09:00
f816daa59e New translations ja.yml (Polish) 2018-05-21 05:50:41 +09:00
5d6f75ec05 New translations ja.yml (Polish) 2018-05-21 05:41:13 +09:00
28994d001c fix typo
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-20 22:37:03 +02:00
9e7b6790fd 2.13.0 2018-05-21 03:21:47 +09:00
8fae064156 Merge pull request #1619 from syuilo/l10n_master
New Crowdin translations
2018-05-21 03:21:09 +09:00
8451f4830c New translations ja.yml (English) 2018-05-21 03:20:57 +09:00
deded2bcf7 Merge pull request #1618 from syuilo/l10n_master
New Crowdin translations
2018-05-21 03:11:52 +09:00
51fcaff90e New translations ja.yml (Korean) 2018-05-21 03:11:11 +09:00
ce8794f7dd New translations ja.yml (Polish) 2018-05-21 03:11:09 +09:00
c61abc3327 New translations ja.yml (Chinese Simplified) 2018-05-21 03:11:07 +09:00
2bff683d52 New translations ja.yml (Italian) 2018-05-21 03:11:05 +09:00
4c408c7330 New translations ja.yml (Russian) 2018-05-21 03:11:03 +09:00
4505a80383 New translations ja.yml (English) 2018-05-21 03:11:01 +09:00
ed3e46953d New translations ja.yml (Spanish) 2018-05-21 03:10:58 +09:00
79fd6c202b New translations ja.yml (German) 2018-05-21 03:10:56 +09:00
aef25ef565 New translations ja.yml (French) 2018-05-21 03:10:54 +09:00
a53d786515 投稿の表示スタイルを選択できるように 2018-05-21 03:08:51 +09:00
27b8b81d4e New translations ja.yml (Korean) 2018-05-21 02:21:21 +09:00
369d9d5641 New translations ja.yml (Polish) 2018-05-21 02:21:19 +09:00
56b77d3cf8 New translations ja.yml (Chinese Simplified) 2018-05-21 02:21:17 +09:00
0d2eb2c07c New translations ja.yml (Italian) 2018-05-21 02:21:15 +09:00
5bc1fe1f2c New translations ja.yml (Russian) 2018-05-21 02:21:13 +09:00
83bf229f5b New translations ja.yml (English) 2018-05-21 02:21:11 +09:00
492d550410 New translations ja.yml (Spanish) 2018-05-21 02:21:09 +09:00
22a72d87ea New translations ja.yml (German) 2018-05-21 02:21:08 +09:00
d5ef52ec17 New translations ja.yml (French) 2018-05-21 02:21:06 +09:00
42c811a523 Refactor 2018-05-21 02:13:39 +09:00
51e3c11acb Merge pull request #1617 from syuilo/l10n_master
New Crowdin translations
2018-05-21 00:08:58 +09:00
b9ab18f5a9 New translations ja.yml (English) 2018-05-20 23:30:48 +09:00
00357c2f07 New translations ja.yml (English) 2018-05-20 23:20:36 +09:00
2f756c9988 New translations ja.yml (English) 2018-05-20 23:16:48 +09:00
4c55a19c6d New translations ja.yml (English) 2018-05-20 23:00:53 +09:00
a6eb0971a4 New translations ja.yml (German) 2018-05-20 22:50:55 +09:00
2e25e000de New translations ja.yml (Polish) 2018-05-20 22:40:46 +09:00
e3a15532bf New translations ja.yml (German) 2018-05-20 22:40:44 +09:00
3dcf721c53 New translations ja.yml (Polish) 2018-05-20 22:30:56 +09:00
b20b975935 Fix bug 2018-05-20 20:26:38 +09:00
2e6905c74c Fix bug 2018-05-20 19:51:51 +09:00
8bb97f2e4c Better error reporting 2018-05-20 19:24:54 +09:00
92 changed files with 1041 additions and 798 deletions

View File

@ -22,6 +22,7 @@
"globals": {
"ENV": true,
"VERSION": true,
"API": true
"API": true,
"LANGS": true
}
}

View File

@ -4,6 +4,10 @@
notifications:
email: false
branches:
except:
- l10n_master
language: node_js
node_js:

140
assets/title-dark.svg Normal file
View File

@ -0,0 +1,140 @@
<?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="614.71039"
height="205.08009"
viewBox="0 0 162.64213 54.260776"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r15371"
sodipodi:docname="misskey.svg"
inkscape:export-filename="C:\Users\Takumiya_Cho\Desktop\misskey.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<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-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="0.9899495"
inkscape:cx="370.82839"
inkscape:cy="79.043895"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
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="1017"
inkscape:window-x="-8"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:object-paths="true"
inkscape:bbox-paths="true"
fit-margin-top="50"
fit-margin-left="50"
fit-margin-bottom="20"
fit-margin-right="50" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-11.097531,-173.29664)">
<g
transform="matrix(0.28612302,0,0,0.28612302,17.176981,141.74334)"
id="text4489-6"
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:#fff;fill-opacity:1;stroke:none;stroke-width:0.92471898px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
aria-label="Mi">
<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:#fff;fill-opacity:1;stroke-width:0.92471898px"
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:#fff;fill-opacity:1;stroke-width:0.92471898px"
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" />
</g>
<path
inkscape:connector-curvature="0"
id="path5199"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 72.022691,200.53715 q 0.968125,0.24203 2.420312,0.5244 2.420313,0.40339 3.791824,1.29083 2.581666,1.69422 2.581666,5.08266 0,2.74302 -1.815234,4.47758 -2.097604,2.01693 -5.849089,2.01693 -2.743021,0 -6.131458,-0.76644 -1.089141,-0.24203 -1.774896,-1.08914 -0.645417,-0.84711 -0.645417,-1.89591 0,-1.29083 0.887448,-2.17828 0.927786,-0.92779 2.178281,-0.92779 0.363047,0 0.685756,0.0807 1.169817,0.24203 4.477578,0.60508 0.443724,0 0.968125,-0.0403 0.201693,0 0.201693,-0.24203 0.04034,-0.20169 -0.242032,-0.28237 -1.37151,-0.24203 -2.541328,-0.5244 -1.331172,-0.28237 -1.895911,-0.48406 -1.12948,-0.32271 -1.895912,-0.84711 -2.581667,-1.69422 -2.622005,-5.08266 0,-2.70268 1.855573,-4.47758 2.258958,-2.17828 6.413828,-1.97659 2.783359,0.12102 5.566719,0.7261 1.048802,0.24203 1.734557,1.08914 0.685756,0.84711 0.685756,1.93625 0,1.25049 -0.927787,2.17828 -0.887448,0.88745 -2.178281,0.88745 -0.322709,0 -0.645417,-0.0807 -1.169818,-0.24203 -4.517917,-0.56474 -0.403385,-0.0403 -0.766432,0 -0.322708,0.0403 -0.322708,0.24203 0.04034,0.24203 0.322708,0.32271 z" />
<path
inkscape:connector-curvature="0"
id="path5201"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 89.577027,200.53715 q 0.968125,0.24203 2.420312,0.5244 2.420313,0.40339 3.791823,1.29083 2.581667,1.69422 2.581667,5.08266 0,2.74302 -1.815234,4.47758 -2.097604,2.01693 -5.849089,2.01693 -2.743021,0 -6.131458,-0.76644 -1.089141,-0.24203 -1.774896,-1.08914 -0.645417,-0.84711 -0.645417,-1.89591 0,-1.29083 0.887448,-2.17828 0.927786,-0.92779 2.178281,-0.92779 0.363047,0 0.685755,0.0807 1.169818,0.24203 4.477579,0.60508 0.443724,0 0.968125,-0.0403 0.201692,0 0.201692,-0.24203 0.04034,-0.20169 -0.242031,-0.28237 -1.37151,-0.24203 -2.541328,-0.5244 -1.331172,-0.28237 -1.895912,-0.48406 -1.129479,-0.32271 -1.895911,-0.84711 -2.581667,-1.69422 -2.622005,-5.08266 0,-2.70268 1.855573,-4.47758 2.258958,-2.17828 6.413828,-1.97659 2.783359,0.12102 5.566719,0.7261 1.048802,0.24203 1.734557,1.08914 0.685755,0.84711 0.685755,1.93625 0,1.25049 -0.927786,2.17828 -0.887448,0.88745 -2.178281,0.88745 -0.322709,0 -0.645417,-0.0807 -1.169818,-0.24203 -4.517917,-0.56474 -0.403385,-0.0403 -0.766432,0 -0.322708,0.0403 -0.322708,0.24203 0.04034,0.24203 0.322708,0.32271 z" />
<path
inkscape:connector-curvature="0"
id="path5203"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 115.65209,203.87137 q 0.12101,0.0807 2.86404,2.78336 1.25049,1.21016 1.25049,2.94471 0,1.61354 -1.16982,2.86404 -1.16982,1.21016 -2.90437,1.21016 -1.65388,0 -2.86404,-1.16982 l -4.03385,-3.91284 q -0.16136,-0.12102 -0.32271,-0.12102 -0.32271,0 -0.32271,1.21016 0,1.69422 -1.21016,2.90438 -1.21015,1.16981 -2.90437,1.16981 -1.69422,0 -2.90438,-1.16981 -1.169807,-1.21016 -1.169807,-2.90438 v -18.79776 q 0,-1.69422 1.169807,-2.86404 1.21016,-1.21015 2.90438,-1.21015 1.69422,0 2.90437,1.21015 1.21016,1.16982 1.21016,2.86404 v 6.29281 q 0,0.40339 0.28237,0.5244 0.24203,0.12102 0.5244,-0.0807 0.16135,-0.0807 4.84063,-3.18675 1.0488,-0.64542 2.25895,-0.64542 2.21862,0 3.42878,1.81524 0.64542,1.0488 0.64542,2.25896 0,2.21862 -1.81524,3.42877 l -2.54133,1.61354 v 0.0403 l -0.0807,0.0403 q -0.56474,0.36305 -0.0403,0.88745 z" />
<path
inkscape:connector-curvature="0"
id="path5205"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 131.25181,213.92955 q -4.19521,0 -7.18026,-2.94472 -2.94472,-2.98505 -2.94472,-7.18026 0,-4.15487 2.94472,-7.09958 2.98505,-2.98505 7.18026,-2.98505 4.15487,0 6.97857,2.78335 0.92778,0.92779 0.92778,2.25896 0,1.33118 -0.92778,2.25896 l -4.67928,4.63893 q -1.00846,1.00847 -2.01692,1.00847 -1.45219,0 -2.25896,-0.80677 -0.80677,-0.80677 -0.80677,-2.13795 0,-1.29083 0.92778,-2.21862 l 0.80678,-0.84711 q 0.16135,-0.12101 0.0807,-0.24203 -0.12101,-0.0807 -0.32271,-0.0403 -0.80677,0.20169 -1.37151,0.80677 -1.12948,1.08914 -1.12948,2.622 0,1.5732 1.08915,2.70268 1.12947,1.08914 2.70268,1.08914 1.53286,0 2.622,-1.12947 0.92779,-0.92779 2.25896,-0.92779 1.33117,0 2.25896,0.92779 0.92779,0.92778 0.92779,2.25895 0,1.33118 -0.92779,2.25896 -2.98505,2.94472 -7.13992,2.94472 z" />
<path
inkscape:connector-curvature="0"
id="path5207"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 160.51049,198.1433 v 5.60705 q 0,0.56474 -0.0807,1.21016 v 7.38195 q 0,4.51792 -2.74302,7.2206 -2.70268,2.70269 -7.30128,2.70269 -2.66234,0 -4.80028,-1.00847 -2.13795,-0.96812 -2.13795,-3.3481 0,-0.80677 0.36305,-1.53286 0.96812,-2.17828 3.3481,-2.17828 0.56474,0 1.5732,0.32271 1.00847,0.3227 1.65388,0.3227 1.69422,0 2.21862,-0.72609 0.20169,-0.28237 0.0807,-0.44372 -0.16136,-0.24204 -0.56474,-0.16136 -0.68576,0.12102 -1.49253,0.12102 -4.07419,0 -6.97856,-2.90438 -2.90438,-2.90437 -2.90438,-6.97857 v -5.60705 q 0,-1.69422 1.16982,-2.86404 1.21015,-1.21016 2.90437,-1.21016 1.69422,0 2.90438,1.21016 1.21015,1.16982 1.21015,2.86404 v 5.60705 q 0,0.68576 0.48407,1.21016 0.5244,0.48406 1.21015,0.48406 0.7261,0 1.21016,-0.48406 0.48406,-0.5244 0.48406,-1.21016 v -5.60705 q 0,-1.69422 1.21016,-2.86404 1.21015,-1.21016 2.90437,-1.21016 1.69422,0 2.86404,1.21016 1.21016,1.16982 1.21016,2.86404 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,7 +1,7 @@
---
meta:
lang: "日本語"
divider: ""
lang: "Deutsch"
divider: " "
common:
misskey: "Teile alles mit anderen mithilfe von Misskey"
time:
@ -143,29 +143,29 @@ common/views/components/stream-indicator.vue:
reconnecting: "Erneut verbinden"
connected: "Verbindung hergestellt"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
description: "Wenn du deinen Twitter-Account mit deinem Misskey-Account verbindest, siehst du deine Twitter Account-Informationen auf deinem Profil und du kannst dich mit Twitter einloggen."
connected-to: "Du bist mit diesem Twitter-Account verbunden"
detail: "Mehr..."
reconnect: "Erneut verbinden"
connect: "Mit Twitter verbinden"
disconnect: "Trennen"
common/views/components/uploader.vue:
waiting: "待機中"
waiting: "Warten"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: ""
fetching: "Laden"
no-broadcasts: "Keine Broadcasts"
have-a-nice-day: "Schönen Tag!"
next: "Nächster"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
title: "Spende"
text: "Um Misskey am Laufen zu halten geben wir Geld für Domain, Server usw. aus. Wir bekommen dafür kein Geld und würden uns freuen, wenn du spenden würdest. Wenn du interessiert bist, dann kontaktiere {}. Danke für deine Unterstützung!"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
title: "Fotostream"
no-photos: "Keine Fotos"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
title: "Serverinformationen"
toggle: "Sicht umschalten"
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -175,42 +175,42 @@ commons/views/widgets/visibility-chooser.vue:
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
total: "Schwarz ... komplett"
notes: "Blau ... Hinweise"
replies: "Rot ... Antworten"
renotes: "Grün ... Anmerkungen"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
title: "Aktivität"
toggle: "Sichten umschalten"
desktop/views/components/calendar.vue:
title: "{1} {2}"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
title: "{1} / {2}"
prev: "Vorheriger Monat"
next: "Nächster Monat"
go: "Klicke zur Navigation"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
choose-file: "Datei auswählen"
upload: "Dateien von deinem PC hochladen"
cancel: "Abbrechen"
ok: "OK"
choose-prompt: "Wähle eine Datei aus"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
cancel: "Abbrechen"
ok: "OK"
choose-prompt: "Wähle einen Ordner"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
skip: "Zuschneiden überspringen"
cancel: "Abbrechen"
ok: "OK"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
used: "benutzt"
drive: "Speicher"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
avatar: "Avatar"
banner: "Banner"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
rename: "Umbenennen"
copy-url: "URL kopieren"
download: "Download"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
@ -290,26 +290,26 @@ desktop/views/components/home.vue:
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
donation: "Spende"
nav: "Navigation"
tips: "Tipps"
add: "Hinzufügen"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
cancel: "Abbrechen"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
title: "Nachrichten:"
desktop/views/components/messaging-window.vue:
title: "Nachrichten"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
more: "Lade weitere Konversationen"
private: "(Dieser Post ist privat)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
location: "Ort"
renote: "Anmerkung"
add-reaction: "Reaktion hinzufügen"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
private: "(Dieser Post ist privat)"
desktop/views/components/notes.note.vue:
reposted-by: "Auch geteilt von"
reply: "Antworten"
@ -317,8 +317,8 @@ desktop/views/components/notes.note.vue:
add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
error: "Laden fehlgeschlagen."
retry: "Erneut versuchen"
desktop/views/components/notifications.vue:
more: "Mehr"
empty: "Keine Benachrichtigungen"
@ -348,14 +348,14 @@ desktop/views/components/post-form-window.vue:
attaches: "{} Medien hinzugefügt"
uploading-media: "Lade {} Medien hoch"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
waiting: "Warten"
desktop/views/components/renote-form.vue:
quote: "Zitieren..."
cancel: "Abbrechen"
renote: "Anmerkung"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
reposting: "Weitersagen..."
success: "Weitergesagt!"
failure: "Weitersagen fehlgeschlagen"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "Profil aktualisieren"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -121,7 +121,7 @@ common/views/components/signup.vue:
unavailable: "Unavailable"
error: "Network error"
invalid-format: "Only use letters, numbers and -."
too-short: "Please enter at least 1 character"
too-short: "Please enter at least 1 character!"
too-long: "Please enter up to 20 characters."
password: "Password"
password-placeholder: "We recommend more than 8 characters."
@ -165,14 +165,14 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "Server info"
toggle: "Toggle views"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "Public"
home: "Home"
home-desc: "ホームタイムラインにのみ公開"
home-desc: "Post to the home timeline only"
followers: "Followers"
followers-desc: "自分のフォロワーにのみ公開"
followers-desc: "Post to followers only"
specified: "Direct"
specified-desc: "指定したユーザーにのみ公開"
specified-desc: "Post to specified users only"
private: "Private"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
@ -188,7 +188,7 @@ desktop/views/components/calendar.vue:
next: "Next month"
go: "Click to naviguate"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
choose-file: "Choosing files"
upload: "Upload files from your PC"
cancel: "Cancel"
ok: "OK"
@ -264,7 +264,7 @@ desktop/views/components/following-window.vue:
desktop/views/components/following.vue:
empty: "You dont follow anyone."
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
title: "Recommended users:"
empty: "Similar users werent found."
fetching: "Loading…"
refresh: "More"
@ -373,11 +373,11 @@ desktop/views/components/settings.vue:
behaviour: "Behavior"
fetch-on-scroll: "Fetch on scroll"
fetch-on-scroll-desc: "When you scroll down the page automatically fetches additional content."
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
auto-popout: "Auto pop-out window"
auto-popout-desc: "Pop-out an opened window if possible. This setting is stored in the browser."
advanced: "Advanced settings"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
api-via-stream: "API request via stream"
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
display: "Design and display"
customize: "Customize Home"
dark-mode: "Dark Mode"
@ -387,28 +387,28 @@ desktop/views/components/settings.vue:
show-reply-target: "Display reply target"
show-my-renotes: "Show my renote in the timeline"
show-renoted-my-notes: "Show renoted my post in the timeline"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
show-maps: "Show the map"
show-maps-desc: "Show the map of the location attached to the post."
sound: "Sound"
enable-sounds: "Enable sound"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
enable-sounds-desc: "Play a sound when you received a post/message. This setting is stored in the browser."
volume: "Volume"
test: "Test"
mobile: "Mobile"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
disable-via-mobile: "Not mark the post as 'from mobile'"
language: "Language"
pick-language: "Select a language"
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify the language"
language-desc: "変更はページの再度読み込み後に反映されます。"
language-desc: "You need to reload the page for the changes to take effect."
cache: "Cache"
clean-cache: "Cleanup"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
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."
cache-cleared: "Cache cleared"
cache-cleared-desc: "Please reload the page."
auto-watch: "Auto watch"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
auto-watch-desc: "Receive notifications about the post/reply/reaction automatically."
about: "About Misskey"
operator: "The admin of this instance"
update: "Misskey Update"
@ -418,7 +418,7 @@ desktop/views/components/settings.vue:
do-update: "Check for update"
update-settings: "Advanced settings"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device."
no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!"
@ -426,11 +426,8 @@ desktop/views/components/settings.vue:
advanced-settings: "Advanced"
debug-mode: "Enable the debug mode"
debug-mode-desc: "This setting is stored in the browser."
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "Enable experimental features"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
experimental-desc: "It would make Misskey client unstable. This setting is stored in the browser."
tools: "Tools"
task-manager: "Task Manager"
third-parties: "Third-party"
@ -453,7 +450,7 @@ desktop/views/components/settings.2fa.vue:
failed: "Failed to setup. please ensure that the token is correct."
info: "From now on, enter the token that is displayed on your device in addition to your password when signing-in to Misskey."
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
intro: "To access the API, set this token as the key 'i' of request parameters."
caution: "Please do not show this token to third parties (do not enter it somewhere else other than here) otherwise your account could get compromised."
regeneration-of-token: "In the unlikely event that this token leaks out you can regenerate it."
regenerate-token: "Regenerate the token"
@ -478,9 +475,11 @@ desktop/views/components/settings.profile.vue:
description: "Description"
birthday: "Birthday"
save: "Update profile"
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
desktop/views/components/sub-note-content.vue:
hidden: "(this post is private)"
media: "つのメディア"
media: " media"
poll: "Polls"
desktop/views/components/taskmanager.vue:
title: "Task Manager"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "Popout"
close: "Close"
desktop/views/pages/welcome.vue:
signin: "Log In"
signup: "Sign up"
signin-button: "Log in"
signup-button: "Sign up"
timeline: "Timeline"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -572,7 +577,7 @@ desktop/views/pages/user/user.timeline.vue:
default: "Posts"
with-replies: "Posts and replies"
with-media: "Media"
empty: "このユーザーはまだ何も投稿していないようです。"
empty: "This user has never posted yet."
desktop/views/widgets/messaging.vue:
title: "Messaging"
desktop/views/widgets/notifications.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "Are you sure you want to mark all unread notifications as read?"
mobile/views/pages/settings/settings.profile.vue:
title: "Profile"
will-be-published: "※公開されます"
name: "Name"
account: "Account"
location: "Location"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "Birthday"
avatar: "Avatar"
banner: "Banner"
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
save: "Update profile"
saved: "Profile updated successfully"
uploading: "Uploading"
@ -698,7 +702,7 @@ mobile/views/pages/selectdrive.vue:
mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}"
lang: "Language"
lang-tip: "変更はページの再読み込み後に反映されます。"
lang-tip: "You will need to reload the page for the changes to take effect."
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify the language"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "Show reply target"
show-my-renotes: "Show my renotes"
show-renoted-my-notes: "Show renoted my notes"
post-style: "Post design"
post-style-standard: "Standard"
post-style-smart: "Smart"
behavior: "Behavior"
fetch-on-scroll: "Fetch on scroll"
disable-via-mobile: "Without the \"mobile posts\" flag"

View File

@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -1,7 +1,7 @@
---
meta:
lang: "日本語"
divider: ""
lang: "Français"
divider: " "
common:
misskey: "Partagez avec les autres en utilisant Misskey"
time:
@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "Info sur le serveur"
toggle: "Afficher les vues"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "Description"
birthday: "Date de naissance"
save: "Mettre à jour le profil"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -191,7 +191,7 @@ common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -495,9 +495,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -553,6 +550,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
@ -613,6 +612,13 @@ desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
@ -808,7 +814,6 @@ mobile/views/pages/notifications.vue:
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -816,7 +821,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -844,6 +849,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -1,7 +1,7 @@
---
meta:
lang: "japoński"
divider: ""
lang: "język polski"
divider: " "
common:
misskey: "Dziel się zawartością z innymi korzystając z Misskey."
time:
@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "Informacje o serwerze"
toggle: "Przełącz widok"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "Publiczny"
home: "Lokalny"
home-desc: "Widoczny tylko na tej instancji"
@ -287,7 +287,7 @@ desktop/views/components/home.vue:
notifications: "Powiadomienia"
users: "Polecani użytkownicy"
polls: "Ankiety"
post-form: "投稿フォーム"
post-form: "Formularz tworzenia"
messaging: "Wiadomości"
server: "Informacje o serwerze"
donation: "Dotacje"
@ -302,12 +302,12 @@ desktop/views/components/messaging-room-window.vue:
desktop/views/components/messaging-window.vue:
title: "Wiadomości"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
more: "Załaduj więcej konwersacji"
private: "(ten wpis jest prywatny)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
location: "Informacje o lokalizacji"
renote: "Przeredaguj"
add-reaction: "Dodaj reakcję"
desktop/views/components/note-detail.sub.vue:
private: "(ten wpis jest prywatny)"
desktop/views/components/notes.note.vue:
@ -375,49 +375,49 @@ desktop/views/components/settings.vue:
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
auto-popout: "Automatycznie pojawiające się okna"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
advanced: "Ustawienia zaawansowane"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
display: "Wygląd i wyświetlanie"
customize: "Dostosuj stronę główną"
dark-mode: "Tryb ciemny"
circle-icons: "Używaj okrągłych ikon"
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
show-maps: "Automatycznie pokazuj mapę"
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
sound: "Dźwięk"
enable-sounds: "Włącz dźwięk"
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"
mobile: "Wersja mobilna"
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
language: "Język"
pick-language: "Wybierz język"
recommended: "Zalecane"
auto: "Automatycznie"
specify-language: "Wybierz język"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
language-desc: "Aby zmiany zostały uwzględnione, odśwież stronę."
cache: "Pamięć podręczna"
clean-cache: "Wyczyść"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
cache-cleared: "Wyczyszczono pamięć podręczną"
cache-cleared-desc: "Proszę odświeżyć stronę."
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
about: "O Misskey"
operator: "Administrator instancji"
update: "Aktualizacja Misskey"
version: "Wersja:"
latest-version: "Najnowsza wersja:"
update-checking: "Sprawdzanie dostępności aktualizacji"
do-update: "Sprawdź dostępność aktualizacji"
update-settings: "Ustawienia zaawansowane"
prevent-update: "Unikaj aktualizacji (niezalecane)"
prevent-update-desc: "Nawet jeżeli opcja jest zaznaczona, aktualizacje mogą zostać wykonane. Opcja dotyczy tylko tego urządzenia."
no-updates: "Brak dostępnych aktualizacji"
no-updates-desc: "Twój Misskey jest aktualny."
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "Ustawienia zaawansowane"
debug-mode: "Włącz tryb debugowania"
debug-mode-desc: "To ustawienie jest przechowywane w przeglądarce."
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "Włącz eksperymentalne funkcje"
experimental-desc: "Aktywowanie eksperymentalnych funkcji może spowodować niestabilność Misskey. Opcja ta jest przechowywana w przeglądarce."
tools: "Narzędzia"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "Opis"
birthday: "Data urodzenia"
save: "Aktualizuj profil"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,12 +523,18 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
title: "Dysk Misskey"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
more: "Załaduj więcej"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
title: "Dostosuj stronę główną"
desktop/views/pages/note.vue:
prev: "Poprzedni wpis"
next: "Następny wpis"
@ -539,9 +544,9 @@ desktop/views/pages/selectdrive.vue:
cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
users: "Użytkownicy"
add-user: "Dodaj użytkownika"
username: "Nazwa użytkownika"
desktop/views/pages/user/user.followers-you-know.vue:
title: "Śledzący których znasz"
loading: "Ładowanie"
@ -569,10 +574,10 @@ desktop/views/pages/user/user.profile.vue:
muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
default: "Wpisy"
with-replies: "Wpisy i odpowiedzi"
with-media: "Zawartość multimedialna"
empty: "Ten użytkownik nie umieścił jeszcze niczego."
desktop/views/widgets/messaging.vue:
title: "Wiadomości"
desktop/views/widgets/notifications.vue:
@ -587,8 +592,8 @@ desktop/views/widgets/post-form.vue:
note: "Wpis"
placeholder: "Co się dzieje?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
update-banner: "Naciśnij, aby zmienić baner"
update-avatar: "Naciśnij, aby zmienić awatar"
desktop/views/widgets/trends.vue:
title: "Na czasie"
refresh: "Pokaż inne"
@ -669,27 +674,26 @@ mobile/views/pages/messaging.vue:
mobile/views/pages/messaging-room.vue:
messaging: "Wiadomości"
mobile/views/pages/note.vue:
title: "Wyślij"
title: "Wpis"
prev: "Poprzedni wpis"
next: "Następny wpis"
mobile/views/pages/notifications.vue:
notifications: "Powiadomienia"
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
title: "Profil"
name: "Nazwa"
account: "Konto"
location: "Lokalizacja"
description: "Opis"
birthday: "Data urodzenia"
avatar: "Awatar"
banner: "Baner"
is-cat: "このアカウントはCatです"
save: "Aktualizuj profil"
saved: "Pomyślnie zaktualizowano profil"
uploading: "Wysyłanie"
upload-failed: "Wysyłanie nie powiodło się"
mobile/views/pages/search.vue:
search: "Szukaj"
empty: "Nie znaleziono wpisów zawierających '{}'"
@ -697,35 +701,38 @@ mobile/views/pages/selectdrive.vue:
select-file: "Wybierz plik"
mobile/views/pages/settings.vue:
signed-in-as: "Zalogowany jako {}"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
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"
circle-icons: "Używaj okrągłych ikon"
timeline: "Oś czasu"
show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
post-style: "Styl wpisów"
post-style-standard: "Standardowy"
post-style-smart: "スマート"
behavior: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
twitter: "Połączenie z Twitterem"
twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
twitter-connect: "Połącz z Twitterem"
twitter-reconnect: "Połącz ponownie"
twitter-disconnect: "Rozłącz"
update: "Aktualizacja Misskey"
version: "Wersja:"
latest-version: "Najnowsza wersja:"
update-checking: "Sprawdzanie dostępności aktualizacji"
check-for-updates: "Sprawdź dostępność aktualizacji"
no-updates: "Brak dostępnych aktualizacji"
no-updates-desc: "Twój Misskey jest aktualny."
update-available: "Dostępna jest nowa wersja"
update-available-desc: "Odśwież stronę, aby zastosować aktualizację."
settings: "Ustawienia"
signout: "Wyloguj"
mobile/views/pages/user.vue:

View File

@ -1,7 +1,7 @@
---
meta:
lang: "日本語"
divider: ""
lang: "Русский язык"
divider: " "
common:
misskey: "Misskeyで皆と共有しよう。"
time:
@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -1,6 +1,6 @@
---
meta:
lang: "日本語"
lang: "中文(简体)"
divider: ""
common:
misskey: "Misskeyで皆と共有しよう。"
@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
common/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介"
birthday: "誕生日"
save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@ -677,7 +682,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
will-be-published: "※公開されます"
name: "名前"
account: "アカウント"
location: "場所"
@ -685,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
@ -710,6 +714,9 @@ mobile/views/pages/settings.vue:
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"

View File

@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "2.12.0",
"clientVersion": "1.0.5540",
"version": "2.16.4",
"clientVersion": "1.0.5673",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@ -211,6 +211,7 @@
"vue-template-compiler": "2.5.16",
"vuedraggable": "2.16.0",
"vuex": "3.0.1",
"vuex-persistedstate": "^2.5.4",
"web-push": "3.3.1",
"webfinger.js": "2.6.6",
"webpack": "4.8.3",

View File

@ -7,7 +7,7 @@ import locale from '../../locales';
export default class Replacer {
private lang: string;
public pattern = /%i18n:([a-z0-9_\-\.\/\|\!]+?)%/g;
public pattern = /%i18n:([a-z0-9_\-\.\/\|]+?)%/g;
constructor(lang: string) {
this.lang = lang;
@ -56,11 +56,6 @@ export default class Replacer {
public replacement(match, key) {
let path = null;
const shouldEscape = key[0] == '!';
if (shouldEscape) {
key = key.substr(1);
}
if (key.indexOf('|') != -1) {
path = key.split('|')[0];
key = key.split('|')[1];
@ -68,8 +63,6 @@ export default class Replacer {
const txt = this.get(path, key);
return shouldEscape
? txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22')
: txt.replace(/"/g, '&quot;');
return txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22');
}
}

View File

@ -29,11 +29,18 @@
if (url.pathname == '/auth') app = 'auth';
//#endregion
// Detect the user language
// Note: The default language is Japanese
//#region Detect the user language
let lang = navigator.language.split('-')[0];
// The default language is English
if (!LANGS.includes(lang)) lang = 'en';
if (localStorage.getItem('lang')) lang = localStorage.getItem('lang');
const vuex = localStorage.getItem('vuex');
if (vuex) {
const data = JSON.parse(vuex);
if (data.device.lang) lang = data.device.lang;
}
//#endregion
// Detect the user agent
const ua = navigator.userAgent.toLowerCase();
@ -68,13 +75,6 @@
// Script version
const ver = localStorage.getItem('v') || VERSION;
// Whether in debug mode
const isDebug = localStorage.getItem('debug') == 'true';
// Whether use raw version script
const raw = (localStorage.getItem('useRawScript') == 'true' && isDebug)
|| ENV != 'production';
// Get salt query
const salt = localStorage.getItem('salt')
? '?salt=' + localStorage.getItem('salt')
@ -84,7 +84,7 @@
// Note: 'async' make it possible to load the script asyncly.
// 'defer' make it possible to run the script when the dom loaded.
const script = document.createElement('script');
script.setAttribute('src', `/assets/${app}.${ver}.${lang}.${raw ? 'raw' : 'min'}.js${salt}`);
script.setAttribute('src', `/assets/${app}.${ver}.${lang}.js${salt}`);
script.setAttribute('async', 'true');
script.setAttribute('defer', 'true');
head.appendChild(script);

View File

@ -23,7 +23,7 @@ export default async function(mios: MiOS, force = false, silent = false) {
}
if (!silent) {
alert('%i18n:!common.update-available%'.replace('{newer}', newer).replace('{current}', current));
alert('%i18n:common.update-available%'.replace('{newer}', newer).replace('{current}', current));
}
return newer;

View File

@ -62,7 +62,7 @@ export class HomeStream extends Stream {
// トークンが再生成されたとき
// このままではMisskeyが利用できないので強制的にサインアウトさせる
this.on('my_token_regenerated', () => {
alert('%i18n:!common.my-token-regenerated%');
alert('%i18n:common.my-token-regenerated%');
os.signout();
});
}

View File

@ -22,11 +22,15 @@ export default Vue.extend({
},
computed: {
lightmode(): boolean {
return localStorage.getItem('lightmode') == 'true';
return this.$store.state.device.lightmode;
},
style(): any {
return {
backgroundColor: this.user.avatarColor && this.user.avatarColor.length == 3 ? `rgb(${ this.user.avatarColor.join(',') })` : null,
backgroundColor: this.lightmode
? `rgb(${ this.user.avatarColor.slice(0, 3).join(',') })`
: this.user.avatarColor && this.user.avatarColor.length == 3
? `rgb(${ this.user.avatarColor.join(',') })`
: null,
backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl }?thumbnail)`,
borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null
};

View File

@ -8,21 +8,21 @@
<template v-if="network">%fa:check%</template>
<template v-if="!network">%fa:times%</template>
</template>
{{ network == null ? '%i18n:!@checking-network%' : '%i18n:!@network%' }}<mk-ellipsis v-if="network == null"/>
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
</p>
<p v-if="network == true" :data-wip="internet == null">
<template v-if="internet != null">
<template v-if="internet">%fa:check%</template>
<template v-if="!internet">%fa:times%</template>
</template>
{{ internet == null ? '%i18n:!@checking-internet%' : '%i18n:!@internet%' }}<mk-ellipsis v-if="internet == null"/>
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
</p>
<p v-if="internet == true" :data-wip="server == null">
<template v-if="server != null">
<template v-if="server">%fa:check%</template>
<template v-if="!server">%fa:times%</template>
</template>
{{ server == null ? '%i18n:!@checking-server%' : '%i18n:!@server%' }}<mk-ellipsis v-if="server == null"/>
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
</p>
</div>
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>

View File

@ -3,9 +3,9 @@
<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/>
<h1>%i18n:@title%</h1>
<p class="text">
<span>{{ '%i18n:!@description%'.substr(0, '%i18n:!@description%'.indexOf('{')) }}</span>
<a @click="reload">{{ '%i18n:!@description%'.match(/\{(.+?)\}/)[1] }}</a>
<span>{{ '%i18n:!@description%'.substr('%i18n:!@description%'.indexOf('}') + 1) }}</span>
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
<a @click="reload">{{ '%i18n:@description%'.match(/\{(.+?)\}/)[1] }}</a>
<span>{{ '%i18n:@description%'.substr('%i18n:@description%'.indexOf('}') + 1) }}</span>
</p>
<button v-if="!troubleshooting" @click="troubleshooting = true">%i18n:@troubleshoot%</button>
<x-troubleshooter v-if="troubleshooting"/>
@ -28,7 +28,7 @@ export default Vue.extend({
},
mounted() {
document.title = 'Oops!';
document.documentElement.style.background = '#f8f8f8';
document.documentElement.style.setProperty('background', '#f8f8f8', 'important');
},
methods: {
reload() {

View File

@ -8,7 +8,7 @@
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p>
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p>
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:!common.loading%' : '%i18n:!@more%' }}
<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
</button>
<template v-for="(message, i) in _messages">
<x-message :message="message" :key="message.id"/>
@ -149,9 +149,9 @@ export default Vue.extend({
onMessage(message) {
// サウンドを再生する
if ((this as any).os.isEnableSounds) {
if (this.$store.state.device.enableSounds) {
const sound = new Audio(`${url}/assets/message.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5;
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}
@ -172,7 +172,7 @@ export default Vue.extend({
});
} else if (message.userId != (this as any).os.i.id) {
// Notify
this.notify('%i18n:!@new-message%');
this.notify('%i18n:@new-message%');
}
},

View File

@ -162,9 +162,9 @@ export default Vue.extend({
this.o.put(this.myColor, pos);
// サウンドを再生する
if ((this as any).os.isEnableSounds) {
if (this.$store.state.device.enableSounds) {
const sound = new Audio(`${url}/assets/othello-put-me.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5;
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}
@ -186,9 +186,9 @@ export default Vue.extend({
this.$forceUpdate();
// サウンドを再生する
if ((this as any).os.isEnableSounds && x.color != this.myColor) {
if (this.$store.state.device.enableSounds && x.color != this.myColor) {
const sound = new Audio(`${url}/assets/othello-put-you.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5;
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}
},

View File

@ -5,7 +5,7 @@
</p>
<ul ref="choices">
<li v-for="(choice, i) in choices">
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:!@choice-n%'.replace('{}', i + 1)">
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
<button @click="remove(i)" title="%i18n:@remove%">
%fa:times%
</button>

View File

@ -1,19 +1,19 @@
<template>
<div class="mk-poll" :data-is-voted="isVoted">
<ul>
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:!@vote-to%'.replace('{}', choice.text) : ''">
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
<span>
<template v-if="choice.isVoted">%fa:check%</template>
<span>{{ choice.text }}</span>
<span class="votes" v-if="showResult">({{ '%i18n:!@vote-count%'.replace('{}', choice.votes) }})</span>
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
</span>
</li>
</ul>
<p v-if="total > 0">
<span>{{ '%i18n:!@total-users%'.replace('{}', total) }}</span>
<span>{{ '%i18n:@total-users%'.replace('{}', total) }}</span>
<span></span>
<a v-if="!isVoted" @click="toggleShowResult">{{ showResult ? '%i18n:!@vote%' : '%i18n:!@show-result%' }}</a>
<a v-if="!isVoted" @click="toggleShowResult">{{ showResult ? '%i18n:@vote%' : '%i18n:@show-result%' }}</a>
<span v-if="isVoted">%i18n:@voted%</span>
</p>
</div>

View File

@ -22,7 +22,7 @@
import Vue from 'vue';
import * as anime from 'animejs';
const placeholder = '%i18n:!@choose-reaction%';
const placeholder = '%i18n:@choose-reaction%';
export default Vue.extend({
props: ['note', 'source', 'compact', 'cb'],

View File

@ -9,7 +9,7 @@
<label class="token" v-if="user && user.twoFactorEnabled">
<input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock%
</label>
<button type="submit" :disabled="signing">{{ signing ? '%i18n:!@signing-in%' : '%i18n:!@signin%' }}</button>
<button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</button>
もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
</form>
</template>

View File

@ -127,7 +127,7 @@ export default Vue.extend({
location.href = '/';
});
}).catch(() => {
alert('%i18n:!@some-error%');
alert('%i18n:@some-error%');
(window as any).grecaptcha.reset();
this.recaptchaed = false;

View File

@ -44,16 +44,16 @@ export default Vue.extend({
const time = this._time;
const ago = (this.now.getTime() - time.getTime()) / 1000/*ms*/;
return (
ago >= 31536000 ? '%i18n:!common.time.years_ago%' .replace('{}', (~~(ago / 31536000)).toString()) :
ago >= 2592000 ? '%i18n:!common.time.months_ago%' .replace('{}', (~~(ago / 2592000)).toString()) :
ago >= 604800 ? '%i18n:!common.time.weeks_ago%' .replace('{}', (~~(ago / 604800)).toString()) :
ago >= 86400 ? '%i18n:!common.time.days_ago%' .replace('{}', (~~(ago / 86400)).toString()) :
ago >= 3600 ? '%i18n:!common.time.hours_ago%' .replace('{}', (~~(ago / 3600)).toString()) :
ago >= 60 ? '%i18n:!common.time.minutes_ago%'.replace('{}', (~~(ago / 60)).toString()) :
ago >= 10 ? '%i18n:!common.time.seconds_ago%'.replace('{}', (~~(ago % 60)).toString()) :
ago >= 0 ? '%i18n:!common.time.just_now%' :
ago < 0 ? '%i18n:!common.time.future%' :
'%i18n:!common.time.unknown%');
ago >= 31536000 ? '%i18n:common.time.years_ago%' .replace('{}', (~~(ago / 31536000)).toString()) :
ago >= 2592000 ? '%i18n:common.time.months_ago%' .replace('{}', (~~(ago / 2592000)).toString()) :
ago >= 604800 ? '%i18n:common.time.weeks_ago%' .replace('{}', (~~(ago / 604800)).toString()) :
ago >= 86400 ? '%i18n:common.time.days_ago%' .replace('{}', (~~(ago / 86400)).toString()) :
ago >= 3600 ? '%i18n:common.time.hours_ago%' .replace('{}', (~~(ago / 3600)).toString()) :
ago >= 60 ? '%i18n:common.time.minutes_ago%'.replace('{}', (~~(ago / 60)).toString()) :
ago >= 10 ? '%i18n:common.time.seconds_ago%'.replace('{}', (~~(ago % 60)).toString()) :
ago >= 0 ? '%i18n:common.time.just_now%' :
ago < 0 ? '%i18n:common.time.future%' :
'%i18n:common.time.unknown%');
}
},
created() {

View File

@ -3,7 +3,7 @@
<p>%i18n:@description%<a :href="`${docsUrl}/link-to-twitter`" target="_blank">%i18n:@detail%</a></p>
<p class="account" v-if="os.i.twitter" :title="`Twitter ID: ${os.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
<p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:!@reconnect%' : '%i18n:!@connect%' }}</a>
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a>
<span v-if="os.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a>
</p>

View File

@ -37,6 +37,7 @@ export default Vue.extend({
fetch(cb?) {
this.fetching = true;
(this as any).api('notes', {
local: true,
reply: false,
renote: false,
media: false,
@ -52,15 +53,15 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
.mk-welcome-timeline
background #fff
root(isDark)
background isDark ? #282C37 : #fff
> div
padding 16px
overflow-wrap break-word
font-size .9em
color #4C4C4C
border-bottom 1px solid rgba(#000, 0.05)
color isDark ? #fff : #4C4C4C
border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05)
&:after
content ""
@ -95,17 +96,23 @@ export default Vue.extend({
overflow hidden
font-weight bold
text-overflow ellipsis
color #627079
color isDark ? #fff : #627079
> .username
margin 0 .5em 0 0
color #ccc
color isDark ? #606984 : #ccc
> .info
margin-left auto
font-size 0.9em
> .created-at
color #c0c0c0
color isDark ? #606984 : #c0c0c0
.mk-welcome-timeline[data-darkmode]
root(true)
.mk-welcome-timeline:not([data-darkmode])
root(false)
</style>

View File

@ -14,7 +14,7 @@
</svg>
</div>
<p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p>
<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:!@no-broadcasts%' : broadcasts[i].title }}</h1>
<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:@no-broadcasts%' : broadcasts[i].title }}</h1>
<p v-if="!fetching">
<span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span>
<template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template>

View File

@ -3,9 +3,9 @@
<article>
<h1>%fa:heart%%i18n:@title%</h1>
<p>
{{ '%i18n:!@text%'.substr(0, '%i18n:!@text%'.indexOf('{')) }}
{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
<a href="https://syuilo.com">@syuilo</a>
{{ '%i18n:!@text%'.substr('%i18n:!@text%'.indexOf('}') + 1) }}
{{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }}
</p>
</article>
</div>

View File

@ -8,6 +8,7 @@ declare const _STATS_URL_: string;
declare const _STATUS_URL_: string;
declare const _DEV_URL_: string;
declare const _LANG_: string;
declare const _LANGS_: string;
declare const _RECAPTCHA_SITEKEY_: string;
declare const _SW_PUBLICKEY_: string;
declare const _THEME_COLOR_: string;
@ -27,6 +28,7 @@ export const statsUrl = _STATS_URL_;
export const statusUrl = _STATUS_URL_;
export const devUrl = _DEV_URL_;
export const lang = _LANG_;
export const langs = _LANGS_;
export const recaptchaSitekey = _RECAPTCHA_SITEKEY_;
export const swPublickey = _SW_PUBLICKEY_;
export const themeColor = _THEME_COLOR_;

View File

@ -2,7 +2,7 @@
<div class="mk-calendar" :data-melt="design == 4 || design == 5">
<template v-if="design == 0 || design == 1">
<button @click="prev" title="%i18n:@prev%">%fa:chevron-circle-left%</button>
<p class="title">{{ '%i18n:!@title%'.replace('{1}', year).replace('{2}', month) }}</p>
<p class="title">{{ '%i18n:@title%'.replace('{1}', year).replace('{2}', month) }}</p>
<button @click="next" title="%i18n:@next%">%fa:chevron-circle-right%</button>
</template>
@ -21,7 +21,7 @@
:data-is-out-of-range="isOutOfRange(i + 1)"
:data-is-donichi="isDonichi(i + 1)"
@click="go(i + 1)"
:title="isOutOfRange(i + 1) ? null : '%i18n:!@go%'"
:title="isOutOfRange(i + 1) ? null : '%i18n:@go%'"
>
<div>{{ i + 1 }}</div>
</div>
@ -58,13 +58,13 @@ export default Vue.extend({
month: new Date().getMonth() + 1,
selected: new Date(),
weekdayText: [
'%i18n:!common.weekday-short.sunday%',
'%i18n:!common.weekday-short.monday%',
'%i18n:!common.weekday-short.tuesday%',
'%i18n:!common.weekday-short.wednesday%',
'%i18n:!common.weekday-short.thursday%',
'%i18n:!common.weekday-short.friday%',
'%i18n:!common.weekday-short.saturday%'
'%i18n:common.weekday-short.sunday%',
'%i18n:common.weekday-short.monday%',
'%i18n:common.weekday-short.tuesday%',
'%i18n:common.weekday-short.wednesday%',
'%i18n:common.weekday-short.thursday%',
'%i18n:common.weekday-short.friday%',
'%i18n:common.weekday-short.saturday%'
]
};
},

View File

@ -64,46 +64,46 @@ export default Vue.extend({
this.isContextmenuShowing = true;
contextmenu(e, [{
type: 'item',
text: '%i18n:!@contextmenu.rename%',
text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%',
onClick: this.rename
}, {
type: 'item',
text: '%i18n:!@contextmenu.copy-url%',
text: '%i18n:@contextmenu.copy-url%',
icon: '%fa:link%',
onClick: this.copyUrl
}, {
type: 'link',
href: `${this.file.url}?download`,
text: '%i18n:!@contextmenu.download%',
text: '%i18n:@contextmenu.download%',
icon: '%fa:download%',
}, {
type: 'divider',
}, {
type: 'item',
text: '%i18n:!common.delete%',
text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%',
onClick: this.deleteFile
}, {
type: 'divider',
}, {
type: 'nest',
text: '%i18n:!@contextmenu.else-files%',
text: '%i18n:@contextmenu.else-files%',
menu: [{
type: 'item',
text: '%i18n:!@contextmenu.set-as-avatar%',
text: '%i18n:@contextmenu.set-as-avatar%',
onClick: this.setAsAvatar
}, {
type: 'item',
text: '%i18n:!@contextmenu.set-as-banner%',
text: '%i18n:@contextmenu.set-as-banner%',
onClick: this.setAsBanner
}]
}, {
type: 'nest',
text: '%i18n:!@contextmenu.open-in-app%',
text: '%i18n:@contextmenu.open-in-app%',
menu: [{
type: 'item',
text: '%i18n:!@contextmenu.add-app%...',
text: '%i18n:@contextmenu.add-app%...',
onClick: this.addApp
}]
}], {
@ -141,8 +141,8 @@ export default Vue.extend({
rename() {
(this as any).apis.input({
title: '%i18n:!@contextmenu.rename-file%',
placeholder: '%i18n:!@contextmenu.input-new-file-name%',
title: '%i18n:@contextmenu.rename-file%',
placeholder: '%i18n:@contextmenu.input-new-file-name%',
default: this.file.name,
allowEmpty: false
}).then(name => {
@ -157,9 +157,9 @@ export default Vue.extend({
copyToClipboard(this.file.url);
(this as any).apis.dialog({
title: '%fa:check%%i18n:@contextmenu.copied%',
text: '%i18n:!@contextmenu.copied-url-to-clipboard%',
text: '%i18n:@contextmenu.copied-url-to-clipboard%',
actions: [{
text: '%i18n:!common.ok%'
text: '%i18n:common.ok%'
}]
});
},

View File

@ -54,26 +54,26 @@ export default Vue.extend({
this.isContextmenuShowing = true;
contextmenu(e, [{
type: 'item',
text: '%i18n:!@contextmenu.move-to-this-folder%',
text: '%i18n:@contextmenu.move-to-this-folder%',
icon: '%fa:arrow-right%',
onClick: this.go
}, {
type: 'item',
text: '%i18n:!@contextmenu.show-in-new-window%',
text: '%i18n:@contextmenu.show-in-new-window%',
icon: '%fa:R window-restore%',
onClick: this.newWindow
}, {
type: 'divider',
}, {
type: 'item',
text: '%i18n:!@contextmenu.rename%',
text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%',
onClick: this.rename
}, {
type: 'divider',
}, {
type: 'item',
text: '%i18n:!common.delete%',
text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%',
onClick: this.deleteFolder
}], {
@ -159,15 +159,15 @@ export default Vue.extend({
switch (err) {
case 'detected-circular-definition':
(this as any).apis.dialog({
title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%',
text: '%i18n:!@circular-reference-detected%',
title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
text: '%i18n:@circular-reference-detected%',
actions: [{
text: '%i18n:!common.ok%'
text: '%i18n:common.ok%'
}]
});
break;
default:
alert('%i18n:!@unhandled-error% ' + err);
alert('%i18n:@unhandled-error% ' + err);
}
});
}
@ -199,8 +199,8 @@ export default Vue.extend({
rename() {
(this as any).apis.input({
title: '%i18n:!@contextmenu.rename-folder%',
placeholder: '%i18n:!@contextmenu.input-new-folder-name%',
title: '%i18n:@contextmenu.rename-folder%',
placeholder: '%i18n:@contextmenu.input-new-folder-name%',
default: this.folder.name
}).then(name => {
(this as any).api('drive/folders/update', {

View File

@ -8,7 +8,7 @@
@drop.stop="onDrop"
>
<template v-if="folder == null">%fa:cloud%</template>
<span>{{ folder == null ? '%i18n:!@drive%' : folder.name }}</span>
<span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span>
</div>
</template>

View File

@ -138,17 +138,17 @@ export default Vue.extend({
onContextmenu(e) {
contextmenu(e, [{
type: 'item',
text: '%i18n:!@contextmenu.create-folder%',
text: '%i18n:@contextmenu.create-folder%',
icon: '%fa:R folder%',
onClick: this.createFolder
}, {
type: 'item',
text: '%i18n:!@contextmenu.upload%',
text: '%i18n:@contextmenu.upload%',
icon: '%fa:upload%',
onClick: this.selectLocalFile
}, {
type: 'item',
text: '%i18n:!@contextmenu.url-upload%',
text: '%i18n:@contextmenu.url-upload%',
icon: '%fa:cloud-upload-alt%',
onClick: this.urlUpload
}]);
@ -306,15 +306,15 @@ export default Vue.extend({
switch (err) {
case 'detected-circular-definition':
(this as any).apis.dialog({
title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%',
text: '%i18n:!@circular-reference-detected%',
title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
text: '%i18n:@circular-reference-detected%',
actions: [{
text: '%i18n:!common.ok%'
text: '%i18n:common.ok%'
}]
});
break;
default:
alert('%i18n:!@unhandled-error% ' + err);
alert('%i18n:@unhandled-error% ' + err);
}
});
}
@ -327,8 +327,8 @@ export default Vue.extend({
urlUpload() {
(this as any).apis.input({
title: '%i18n:!@url-upload%',
placeholder: '%i18n:!@url-of-file%'
title: '%i18n:@url-upload%',
placeholder: '%i18n:@url-of-file%'
}).then(url => {
(this as any).api('drive/files/upload_from_url', {
url: url,
@ -337,9 +337,9 @@ export default Vue.extend({
(this as any).apis.dialog({
title: '%fa:check%%i18n:@url-upload-requested%',
text: '%i18n:!@may-take-time%',
text: '%i18n:@may-take-time%',
actions: [{
text: '%i18n:!common.ok%'
text: '%i18n:common.ok%'
}]
});
});
@ -347,8 +347,8 @@ export default Vue.extend({
createFolder() {
(this as any).apis.input({
title: '%i18n:!@create-folder%',
placeholder: '%i18n:!@folder-name%'
title: '%i18n:@create-folder%',
placeholder: '%i18n:@folder-name%'
}).then(name => {
(this as any).api('drive/folders/create', {
name: name,

View File

@ -1,7 +1,7 @@
<template>
<mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@followers%.replace('{}', {{ user | userName }})
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }}
</span>
<mk-followers :user="user"/>
</mk-window>
@ -11,7 +11,12 @@
import Vue from 'vue';
export default Vue.extend({
props: ['user']
props: ['user'],
computed: {
name(): string {
return Vue.filter('userName')(this.user);
}
}
});
</script>

View File

@ -1,7 +1,7 @@
<template>
<mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@following%.replace('{}', {{ user | userName }})
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }}
</span>
<mk-following :user="user"/>
</mk-window>
@ -11,7 +11,12 @@
import Vue from 'vue';
export default Vue.extend({
props: ['user']
props: ['user'],
computed: {
name(): string {
return Vue.filter('userName')(this.user);
}
}
});
</script>

View File

@ -102,7 +102,7 @@ export default Vue.extend({
computed: {
home(): any[] {
return this.$store.state.settings.data.home;
return this.$store.state.settings.home;
},
left(): any[] {
return this.home.filter(w => w.place == 'left');

View File

@ -59,7 +59,7 @@
<template v-else>%fa:reply%</template>
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
</button>
<button @click="renote" title="%i18n:@renote%>
<button @click="renote" title="%i18n:@renote%">
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
</button>
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">

View File

@ -4,6 +4,9 @@
<div class="main">
<header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span>
<div class="info">
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
@ -68,7 +71,6 @@ root(isDark)
align-items baseline
margin-bottom 2px
white-space nowrap
line-height 21px
> .name
display block
@ -84,6 +86,20 @@ root(isDark)
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
margin 0 0.5em 0 0
padding 1px 5px
font-size 10px
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
margin 0 .5em 0 0
color isDark ? #606984 : #d1d8da

View File

@ -6,9 +6,9 @@
<div class="renote" v-if="isRenote">
<mk-avatar class="avatar" :user="note.user"/>
%fa:retweet%
<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span>
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span>
<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/>
</div>
<article>
@ -16,7 +16,9 @@
<div class="main">
<header>
<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
<span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span>
<span class="is-admin" v-if="p.user.isAdmin">admin</span>
<span class="is-bot" v-if="p.user.isBot">bot</span>
<span class="is-cat" v-if="p.user.isCat">cat</span>
<span class="username"><mk-acct :user="p.user"/></span>
<div class="info">
<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
@ -430,7 +432,9 @@ root(isDark)
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
margin 0 .5em 0 0
padding 1px 6px
font-size 12px
@ -438,6 +442,10 @@ root(isDark)
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
margin 0 .5em 0 0
overflow hidden

View File

@ -145,9 +145,9 @@ export default Vue.extend({
this.notes.unshift(note);
// サウンドを再生する
if ((this as any).os.isEnableSounds && !silent) {
if (this.$store.state.device.enableSounds && !silent) {
const sound = new Audio(`${url}/assets/post.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5;
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}

View File

@ -81,7 +81,7 @@
</transition-group>
</div>
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }}
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
</button>
<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
<p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>

View File

@ -4,8 +4,8 @@
<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span>
<span v-if="!reply">%i18n:@note%</span>
<span v-if="reply">%i18n:@reply%</span>
<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:!@attaches%'.replace('{}', media.length) }}</span>
<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:!@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
</span>
<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/>

View File

@ -37,7 +37,7 @@
<button class="visibility" title="公開範囲" @click="setVisibility" ref="visibilityButton">%fa:lock%</button>
<p class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</p>
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
{{ posting ? '%i18n:!@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
</button>
<input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
<div class="dropzone" v-if="draghover"></div>
@ -86,18 +86,18 @@ export default Vue.extend({
placeholder(): string {
return this.renote
? '%i18n:!@quote-placeholder%'
? '%i18n:@quote-placeholder%'
: this.reply
? '%i18n:!@reply-placeholder%'
: '%i18n:!@note-placeholder%';
? '%i18n:@reply-placeholder%'
: '%i18n:@note-placeholder%';
},
submitText(): string {
return this.renote
? '%i18n:!@renote%'
? '%i18n:@renote%'
: this.reply
? '%i18n:!@reply%'
: '%i18n:!@note%';
? '%i18n:@reply%'
: '%i18n:@note%';
},
canPost(): boolean {
@ -304,16 +304,16 @@ export default Vue.extend({
this.deleteDraft();
this.$emit('posted');
(this as any).apis.notify(this.renote
? '%i18n:!@reposted%'
? '%i18n:@reposted%'
: this.reply
? '%i18n:!@replied%'
: '%i18n:!@posted%');
? '%i18n:@replied%'
: '%i18n:@posted%');
}).catch(err => {
(this as any).apis.notify(this.renote
? '%i18n:!@renote-failed%'
? '%i18n:@renote-failed%'
: this.reply
? '%i18n:!@reply-failed%'
: '%i18n:!@note-failed%');
? '%i18n:@reply-failed%'
: '%i18n:@note-failed%');
}).then(() => {
this.posting = false;
});

View File

@ -5,7 +5,7 @@
<footer>
<a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a>
<button class="ui cancel" @click="cancel">%i18n:@cancel%</button>
<button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:!@reposting%' : '%i18n:!@renote%' }}</button>
<button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:@reposting%' : '%i18n:@renote%' }}</button>
</footer>
</template>
<template v-if="quote">
@ -32,9 +32,9 @@ export default Vue.extend({
renoteId: this.note.id
}).then(data => {
this.$emit('posted');
(this as any).apis.notify('%i18n:!@success%');
(this as any).apis.notify('%i18n:@success%');
}).catch(err => {
(this as any).apis.notify('%i18n:!@failure%');
(this as any).apis.notify('%i18n:@failure%');
}).then(() => {
this.wait = false;
});

View File

@ -34,7 +34,7 @@ export default Vue.extend({
methods: {
register() {
(this as any).apis.input({
title: '%i18n:!@enter-password%',
title: '%i18n:@enter-password%',
type: 'password'
}).then(password => {
(this as any).api('i/2fa/register', {
@ -47,13 +47,13 @@ export default Vue.extend({
unregister() {
(this as any).apis.input({
title: '%i18n:!@enter-password%',
title: '%i18n:@enter-password%',
type: 'password'
}).then(password => {
(this as any).api('i/2fa/unregister', {
password: password
}).then(() => {
(this as any).apis.notify('%i18n:!@unregistered%');
(this as any).apis.notify('%i18n:@unregistered%');
(this as any).os.i.twoFactorEnabled = false;
});
});
@ -63,10 +63,10 @@ export default Vue.extend({
(this as any).api('i/2fa/done', {
token: this.token
}).then(() => {
(this as any).apis.notify('%i18n:!@success%');
(this as any).apis.notify('%i18n:@success%');
(this as any).os.i.twoFactorEnabled = true;
}).catch(() => {
(this as any).apis.notify('%i18n:!@failed%');
(this as any).apis.notify('%i18n:@failed%');
});
}
}

View File

@ -15,7 +15,7 @@ export default Vue.extend({
methods: {
regenerateToken() {
(this as any).apis.input({
title: '%i18n:!@enter-password%',
title: '%i18n:@enter-password%',
type: 'password'
}).then(password => {
(this as any).api('i/regenerate_token', {

View File

@ -11,21 +11,21 @@ export default Vue.extend({
methods: {
reset() {
(this as any).apis.input({
title: '%i18n:!@enter-current-password%',
title: '%i18n:@enter-current-password%',
type: 'password'
}).then(currentPassword => {
(this as any).apis.input({
title: '%i18n:!@enter-new-password%',
title: '%i18n:@enter-new-password%',
type: 'password'
}).then(newPassword => {
(this as any).apis.input({
title: '%i18n:!@enter-new-password-again%',
title: '%i18n:@enter-new-password-again%',
type: 'password'
}).then(newPassword2 => {
if (newPassword !== newPassword2) {
(this as any).apis.dialog({
title: null,
text: '%i18n:!@not-match%',
text: '%i18n:@not-match%',
actions: [{
text: 'OK'
}]
@ -36,7 +36,7 @@ export default Vue.extend({
currentPasword: currentPassword,
newPassword: newPassword
}).then(() => {
(this as any).apis.notify('%i18n:!@changed%');
(this as any).apis.notify('%i18n:@changed%');
});
});
});

View File

@ -24,7 +24,8 @@
<button class="ui primary" @click="save">%i18n:@save%</button>
<section>
<h2>その他</h2>
<mk-switch v-model="os.i.isBot" @change="onChangeIsBot" text="このアカウントはbotです"/>
<mk-switch v-model="os.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
<mk-switch v-model="os.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
</section>
</div>
</template>
@ -65,6 +66,11 @@ export default Vue.extend({
(this as any).api('i/update', {
isBot: (this as any).os.i.isBot
});
},
onChangeIsCat() {
(this as any).api('i/update', {
isCat: (this as any).os.i.isCat
});
}
}
});

View File

@ -62,8 +62,10 @@
<el-slider
v-model="soundVolume"
:show-input="true"
:format-tooltip="v => `${v}%`"
:format-tooltip="v => `${v * 100}%`"
:disabled="!enableSounds"
:max="1"
:step="0.1"
/>
<button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button>
</section>
@ -77,14 +79,10 @@
<h1>%i18n:@language%</h1>
<el-select v-model="lang" placeholder="%i18n:@pick-language%">
<el-option-group label="%i18n:@recommended%">
<el-option label="%i18n:@auto%" value=""/>
<el-option label="%i18n:@auto%" :value="null"/>
</el-option-group>
<el-option-group label="%i18n:@specify-language%">
<el-option label="日本語" value="ja"/>
<el-option label="English" value="en"/>
<el-option label="Français" value="fr"/>
<el-option label="Polski" value="pl"/>
<el-option label="Deutsch" value="de"/>
<el-option v-for="x in langs" :label="x[1]" :value="x[0]" :key="x[0]"/>
</el-option-group>
</el-select>
<div class="none ui info">
@ -178,15 +176,7 @@
<mk-switch v-model="debug" text="%i18n:@debug-mode%">
<span>%i18n:@debug-mode-desc%</span>
</mk-switch>
<template v-if="debug">
<mk-switch v-model="useRawScript" text="%i18n:@use-raw-script%">
<span>%i18n:@use-raw-script-desc%</span>
</mk-switch>
<div class="none ui info">
<p>%fa:info-circle%%i18n:@source-info%</p>
</div>
</template>
<mk-switch v-model="enableExperimental" text="%i18n:@experimental%">
<mk-switch v-model="enableExperimentalFeatures" text="%i18n:@experimental%">
<span>%i18n:@experimental-desc%</span>
</mk-switch>
<details v-if="debug">
@ -214,7 +204,7 @@ import XApi from './settings.api.vue';
import XApps from './settings.apps.vue';
import XSignins from './settings.signins.vue';
import XDrive from './settings.drive.vue';
import { url, docsUrl, license, lang, version } from '../../../config';
import { url, docsUrl, license, lang, langs, version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update';
import MkTaskManager from './taskmanager.vue';
@ -235,55 +225,60 @@ export default Vue.extend({
meta: null,
license,
version,
langs,
latestVersion: undefined,
checkingForUpdate: false,
darkmode: localStorage.getItem('darkmode') == 'true',
enableSounds: localStorage.getItem('enableSounds') == 'true',
autoPopout: localStorage.getItem('autoPopout') == 'true',
apiViaStream: localStorage.getItem('apiViaStream') ? localStorage.getItem('apiViaStream') == 'true' : true,
soundVolume: localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) : 50,
lang: localStorage.getItem('lang') || '',
preventUpdate: localStorage.getItem('preventUpdate') == 'true',
debug: localStorage.getItem('debug') == 'true',
useRawScript: localStorage.getItem('useRawScript') == 'true',
enableExperimental: localStorage.getItem('enableExperimental') == 'true'
darkmode: localStorage.getItem('darkmode') == 'true'
};
},
computed: {
licenseUrl(): string {
return `${docsUrl}/${lang}/license`;
},
apiViaStream: {
get() { return this.$store.state.device.apiViaStream; },
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
},
autoPopout: {
get() { return this.$store.state.device.autoPopout; },
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
},
enableSounds: {
get() { return this.$store.state.device.enableSounds; },
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
},
soundVolume: {
get() { return this.$store.state.device.soundVolume; },
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 }); }
},
debug: {
get() { return this.$store.state.device.debug; },
set(value) { this.$store.commit('device/set', { key: 'debug', value }); }
},
enableExperimentalFeatures: {
get() { return this.$store.state.device.enableExperimentalFeatures; },
set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); }
}
},
watch: {
autoPopout() {
localStorage.setItem('autoPopout', this.autoPopout ? 'true' : 'false');
},
apiViaStream() {
localStorage.setItem('apiViaStream', this.apiViaStream ? 'true' : 'false');
},
darkmode() {
(this as any)._updateDarkmode_(this.darkmode);
},
enableSounds() {
localStorage.setItem('enableSounds', this.enableSounds ? 'true' : 'false');
},
soundVolume() {
localStorage.setItem('soundVolume', this.soundVolume.toString());
},
lang() {
localStorage.setItem('lang', this.lang);
},
preventUpdate() {
localStorage.setItem('preventUpdate', this.preventUpdate ? 'true' : 'false');
},
debug() {
localStorage.setItem('debug', this.debug ? 'true' : 'false');
},
useRawScript() {
localStorage.setItem('useRawScript', this.useRawScript ? 'true' : 'false');
},
enableExperimental() {
localStorage.setItem('enableExperimental', this.enableExperimental ? 'true' : 'false');
}
},
created() {
@ -371,13 +366,13 @@ export default Vue.extend({
this.latestVersion = newer;
if (newer == null) {
(this as any).apis.dialog({
title: '%i18n:!@no-updates%',
text: '%i18n:!@no-updates-desc%'
title: '%i18n:@no-updates%',
text: '%i18n:@no-updates-desc%'
});
} else {
(this as any).apis.dialog({
title: '%i18n:!@update-available%',
text: '%i18n:!@update-available-desc%'
title: '%i18n:@update-available%',
text: '%i18n:@update-available-desc%'
});
}
});
@ -385,13 +380,13 @@ export default Vue.extend({
clean() {
localStorage.clear();
(this as any).apis.dialog({
title: '%i18n:!@cache-cleared%',
text: '%i18n:!@caache-cleared-desc%'
title: '%i18n:@cache-cleared%',
text: '%i18n:@caache-cleared-desc%'
});
},
soundTest() {
const sound = new Audio(`${url}/assets/message.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5;
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}
}

View File

@ -95,7 +95,7 @@ export default Vue.extend({
},
created() {
if (localStorage.getItem('autoPopout') == 'true' && this.popoutUrl) {
if (this.$store.state.device.autoPopout && this.popoutUrl) {
this.popout();
this.preventMount = true;
} else {

View File

@ -29,7 +29,7 @@ export default Vue.extend({
}
},
mounted() {
document.title = '%i18n:!@title%';
document.title = '%i18n:@title%';
},
methods: {
onSelected(file) {

View File

@ -1,23 +1,16 @@
<template>
<div class="mk-welcome">
<button @click="dark">
<template v-if="_darkmode_">%fa:moon%</template>
<template v-else>%fa:R moon%</template>
</button>
<main>
<div class="top">
<div>
<div>
<h1>Share<br><span ref="share">Everything!</span><span class="cursor">_</span></h1>
<p>ようこそ <b>Misskey</b>はTwitter風ミニブログSNSです思ったことや皆と共有したいことを投稿しましょうタイムラインを見れば皆の関心事をすぐにチェックすることもできます<a :href="aboutUrl">詳しく...</a></p>
<p><button class="signup" @click="signup">はじめる</button><button class="signin" @click="signin">ログイン</button></p>
<div class="users">
<mk-avatar class="avatar" v-for="user in users" :key="user.id" :user="user"/>
</div>
</div>
<div>
<div>
<header>%fa:comments R% タイムライン<div><span></span><span></span><span></span></div></header>
<mk-welcome-timeline/>
</div>
</div>
</div>
<img :src="_darkmode_ ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey">
<p><button class="signup" @click="signup">%i18n:@signup-button%</button><button class="signin" @click="signin">%i18n:@signin-button%</button></p>
<div class="tl">
<header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
<mk-welcome-timeline/>
</div>
</main>
<mk-forkit/>
@ -28,11 +21,11 @@
</div>
</footer>
<modal name="signup" width="500px" height="auto" scrollable>
<header :class="$style.signupFormHeader">新規登録</header>
<header :class="$style.signupFormHeader">%i18n:@signup%</header>
<mk-signup :class="$style.signupForm"/>
</modal>
<modal name="signin" width="500px" height="auto" scrollable>
<header :class="$style.signinFormHeader">ログイン</header>
<header :class="$style.signinFormHeader">%i18n:@signin%</header>
<mk-signin :class="$style.signinForm"/>
</modal>
</div>
@ -42,64 +35,22 @@
import Vue from 'vue';
import { docsUrl, copyright, lang } from '../../../config';
const shares = [
'Everything!',
'Webpages',
'Photos',
'Interests',
'Favorites'
];
export default Vue.extend({
data() {
return {
aboutUrl: `${docsUrl}/${lang}/about`,
copyright,
users: [],
clock: null,
i: 0
copyright
};
},
mounted() {
(this as any).api('users', {
sort: '+follower',
limit: 20
}).then(users => {
this.users = users;
});
this.clock = setInterval(() => {
if (++this.i == shares.length) this.i = 0;
const speed = 70;
const text = (this.$refs.share as any).innerText;
for (let i = 0; i < text.length; i++) {
setTimeout(() => {
if (this.$refs.share) {
(this.$refs.share as any).innerText = text.substr(0, text.length - i);
}
}, i * speed)
}
setTimeout(() => {
const newText = shares[this.i];
for (let i = 0; i <= newText.length; i++) {
setTimeout(() => {
if (this.$refs.share) {
(this.$refs.share as any).innerText = newText.substr(0, i);
}
}, i * speed)
}
}, text.length * speed);
}, 4000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
signup() {
this.$modal.show('signup');
},
signin() {
this.$modal.show('signin');
},
dark() {
(this as any)._updateDarkmode_(!(this as any)._darkmode_);
}
}
});
@ -115,161 +66,107 @@ export default Vue.extend({
<style lang="stylus" scoped>
@import '~const.styl'
@import url('https://fonts.googleapis.com/css?family=Sarpanch:700')
.mk-welcome
root(isDark)
display flex
flex-direction column
flex 1
$width = 1000px
background linear-gradient(to bottom, #1e1d65, #bd6659)
//background-image url('/assets/welcome-bg.svg')
background-size cover
background-position top center
&:before
content ""
display block
position fixed
bottom 0
> button
position absolute
z-index 1
top 0
left 0
width 100%
height 100%
background-image url('/assets/welcome-fg.svg')
background-size cover
background-position bottom center
padding 16px
font-size 18px
color isDark ? #fff : #555
> main
display flex
flex 1
padding 64px 0 0 0
text-align center
color isDark ? #9aa4b3 : #555
> .top
display flex
width 100%
> img
width 350px
> div
display flex
max-width $width + 64px
margin 0 auto
padding 80px 32px 0 32px
> p
margin 8px 0
line-height 2em
> *
margin-bottom 48px
button
padding 8px 16px
font-size inherit
> div:first-child
margin-right 48px
color #fff
text-shadow 0 0 12px #172062
.signup
color $theme-color
border solid 2px $theme-color
border-radius 4px
> h1
margin 0
font-weight bold
//font-variant small-caps
letter-spacing 12px
font-family 'Sarpanch', sans-serif
font-size 42px
line-height 48px
&:focus
box-shadow 0 0 0 3px rgba($theme-color, 0.2)
> .cursor
animation cursor 1s infinite linear both
&:hover
color $theme-color-foreground
background $theme-color
@keyframes cursor
0%
opacity 1
50%
opacity 0
&:active
color $theme-color-foreground
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
> p
margin 1em 0
line-height 2em
.signin
&:hover
color isDark ? #fff : #000
button
padding 8px 16px
font-size inherit
> .tl
margin 32px auto 0 auto
width 410px
text-align left
background isDark ? #313543 : #fff
border-radius 8px
box-shadow 0 8px 32px rgba(#000, 0.15)
overflow hidden
.signup
color $theme-color
border solid 2px $theme-color
border-radius 4px
> header
z-index 1
padding 12px 16px
color isDark ? #e3e5e8 : #888d94
box-shadow 0 1px 0px rgba(#000, 0.1)
&:focus
box-shadow 0 0 0 3px rgba($theme-color, 0.2)
> div
position absolute
top 0
right 0
padding inherit
&:hover
color $theme-color-foreground
background $theme-color
> span
display inline-block
height 11px
width 11px
margin-left 6px
border-radius 100%
vertical-align middle
&:active
color $theme-color-foreground
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
&:nth-child(1)
background #5BCC8B
.signin
&:hover
color #fff
&:nth-child(2)
background #E6BB46
> .users
margin 16px 0 0 0
&:nth-child(3)
background #DF7065
> *
display inline-block
margin 4px
width 38px
height 38px
border-radius 6px
> div:last-child
> div
width 410px
background #fff
border-radius 8px
box-shadow 0 0 0 12px rgba(#000, 0.1)
overflow hidden
> header
z-index 1
padding 12px 16px
color #888d94
box-shadow 0 1px 0px rgba(#000, 0.1)
> div
position absolute
top 0
right 0
padding inherit
> span
display inline-block
height 11px
width 11px
margin-left 6px
background #ccc
border-radius 100%
vertical-align middle
&:nth-child(1)
background #5BCC8B
&:nth-child(2)
background #E6BB46
&:nth-child(3)
background #DF7065
> .mk-welcome-timeline
max-height 350px
overflow auto
> .mk-welcome-timeline
max-height 350px
overflow auto
> footer
font-size 12px
color #949ea5
color isDark ? #949ea5 : #737c82
> div
max-width $width
margin 0 auto
padding 0 0 42px 0
padding 64px
text-align center
> .c
@ -277,6 +174,12 @@ export default Vue.extend({
font-size 10px
opacity 0.7
.mk-welcome[data-darkmode]
root(true)
.mk-welcome:not([data-darkmode])
root(false)
</style>
<style lang="stylus" module>

View File

@ -113,7 +113,7 @@ html.setAttribute('lang', lang);
const head = document.getElementsByTagName('head')[0];
const meta = document.createElement('meta');
meta.setAttribute('name', 'description');
meta.setAttribute('content', '%i18n:!common.misskey%');
meta.setAttribute('content', '%i18n:common.misskey%');
head.appendChild(meta);
//#endregion
@ -147,7 +147,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
os,
api: os.api,
apis: os.apis,
clientSettings: os.store.state.settings.data
clientSettings: os.store.state.settings
};
}
});
@ -173,7 +173,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
}
//#region 更新チェック
const preventUpdate = localStorage.getItem('preventUpdate') == 'true';
const preventUpdate = os.store.state.device.preventUpdate;
if (!preventUpdate) {
setTimeout(() => {
checkForUpdate(os);

View File

@ -98,14 +98,7 @@ export default class MiOS extends EventEmitter {
* Whether is debug mode
*/
public get debug() {
return localStorage.getItem('debug') == 'true';
}
/**
* Whether enable sounds
*/
public get isEnableSounds() {
return localStorage.getItem('enableSounds') == 'true';
return this.store ? this.store.state.device.debug : false;
}
public store: ReturnType<typeof initStore>;
@ -435,12 +428,8 @@ export default class MiOS extends EventEmitter {
});
});
// Whether use raw version script
const raw = (localStorage.getItem('useRawScript') == 'true' && this.debug)
|| process.env.NODE_ENV != 'production';
// The path of service worker script
const sw = `/sw.${version}.${lang}.${raw ? 'raw' : 'min'}.js`;
const sw = `/sw.${version}.${lang}.js`;
// Register service worker
navigator.serviceWorker.register(sw).then(registration => {
@ -471,8 +460,7 @@ export default class MiOS extends EventEmitter {
};
const promise = new Promise((resolve, reject) => {
const viaStream = this.stream && this.stream.hasConnection &&
(localStorage.getItem('apiViaStream') ? localStorage.getItem('apiViaStream') == 'true' : true);
const viaStream = this.stream && this.stream.hasConnection && this.store.state.device.apiViaStream;
if (viaStream) {
const stream = this.stream.borrow();

View File

@ -5,7 +5,7 @@
import Vue from 'vue';
import VueRouter from 'vue-router';
import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert } from 'vue-material/dist/components';
import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert, MdRadio } from 'vue-material/dist/components';
import 'vue-material/dist/vue-material.min.css';
import 'vue-material/dist/theme/default.css';
@ -48,6 +48,7 @@ Vue.use(MdSwitch);
Vue.use(MdSubheader);
Vue.use(MdDialog);
Vue.use(MdDialogAlert);
Vue.use(MdRadio);
/**
* init
@ -69,7 +70,7 @@ init((launch) => {
routes: [
{ path: '/', name: 'index', component: MkIndex },
{ path: '/signup', name: 'signup', component: MkSignup },
{ path: '/i/settings', component: MkSettings },
{ path: '/i/settings', name: 'settings', component: MkSettings },
{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
{ path: '/i/widgets', name: 'widgets', component: MkWidgets },
{ path: '/i/messaging', name: 'messaging', component: MkMessaging },

View File

@ -32,7 +32,7 @@
<div class="files" v-if="files.length > 0">
<x-file v-for="file in files" :key="file.id" :file="file"/>
<button class="more" v-if="moreFiles" @click="fetchMoreFiles">
{{ fetchingMoreFiles ? '%i18n:!common.loading%' : '%i18n:!@load-more%' }}
{{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }}
</button>
</div>
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">

View File

@ -7,7 +7,7 @@
<template v-if="!wait && user.isFollowing">%fa:minus%</template>
<template v-if="!wait && !user.isFollowing">%fa:plus%</template>
<template v-if="wait">%fa:spinner .pulse .fw%</template>
{{ user.isFollowing ? '%i18n:!@unfollow%' : '%i18n:!@follow%' }}
{{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }}
</button>
</template>

View File

@ -17,7 +17,7 @@ export default Vue.extend({
},
computed: {
lightmode(): boolean {
return localStorage.getItem('lightmode') == 'true';
return this.$store.state.device.lightmode;
},
style(): any {
return {

View File

@ -1,9 +1,13 @@
<template>
<div class="sub">
<mk-avatar class="avatar" :user="note.user"/>
<div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }">
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
<div class="main">
<header>
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span>
<div class="info">
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
@ -42,6 +46,13 @@ root(isDark)
@media (min-width 600px)
padding 24px 32px
&.smart
> .main
width 100%
> header
align-items center
&:after
content ""
display block
@ -73,6 +84,13 @@ root(isDark)
margin-bottom 2px
white-space nowrap
> .avatar
flex-shrink 0
margin-right 8px
width 18px
height 18px
border-radius 100%
> .name
display block
margin 0 0.5em 0 0
@ -88,6 +106,20 @@ root(isDark)
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
margin 0 0.5em 0 0
padding 1px 5px
font-size 10px
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
text-align left
margin 0

View File

@ -1,22 +1,25 @@
<template>
<div class="note" :class="{ renote: isRenote }">
<div class="note" :class="{ renote: isRenote, smart: $store.state.device.postStyle == 'smart' }">
<div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)">
<x-sub :note="p.reply"/>
</div>
<div class="renote" v-if="isRenote">
<mk-avatar class="avatar" :user="note.user"/>
%fa:retweet%
<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span>
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span>
<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/>
</div>
<article>
<mk-avatar class="avatar" :user="p.user"/>
<mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle != 'smart'"/>
<div class="main">
<header>
<mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link>
<span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span>
<span class="is-admin" v-if="p.user.isAdmin">admin</span>
<span class="is-bot" v-if="p.user.isBot">bot</span>
<span class="is-cat" v-if="p.user.isCat">cat</span>
<span class="username"><mk-acct :user="p.user"/></span>
<div class="info">
<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
@ -262,6 +265,15 @@ root(isDark)
@media (min-width 500px)
font-size 16px
&.smart
> article
> .main
width 100%
> header
align-items center
margin-bottom 4px
> .renote
display flex
align-items center
@ -278,12 +290,17 @@ root(isDark)
padding 16px 32px
.avatar
flex-shrink 0
display inline-block
width 28px
height 28px
width 20px
height 20px
margin 0 8px 0 0
border-radius 6px
@media (min-width 500px)
width 28px
height 28px
[data-fa]
margin-right 4px
@ -352,13 +369,19 @@ root(isDark)
@media (min-width 500px)
margin-bottom 2px
> .avatar
flex-shrink 0
margin-right 8px
width 20px
height 20px
border-radius 100%
> .name
display block
margin 0 0.5em 0 0
padding 0
overflow hidden
color isDark ? #fff : #627079
font-size 1em
font-weight bold
text-decoration none
text-overflow ellipsis
@ -366,7 +389,9 @@ root(isDark)
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
margin 0 0.5em 0 0
padding 1px 6px
font-size 12px
@ -374,6 +399,10 @@ root(isDark)
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
margin 0 0.5em 0 0
overflow hidden

View File

@ -12,7 +12,7 @@
<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>
{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }}
{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
</button>
<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>

View File

@ -20,7 +20,7 @@
<a @click="addVisibleUser">+ユーザーを追加</a>
</div>
<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)">
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:!@reply-placeholder%' : renote ? '%i18n:!@renote-placeholder%' : '%i18n:!@note-placeholder%'"></textarea>
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea>
<div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div class="file" v-for="file in files" :key="file.id">

View File

@ -28,7 +28,7 @@
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
</ul>
<ul>
<li><router-link to="/i/settings">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
<li @click="dark"><p><template v-if="_darkmode_">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li>
</ul>
</div>
@ -94,7 +94,7 @@ export default Vue.extend({
},
methods: {
search() {
const query = window.prompt('%i18n:!@search%');
const query = window.prompt('%i18n:@search%');
if (query == null || query == '') return;
this.$router.push('/search?q=' + encodeURIComponent(query));
},

View File

@ -3,7 +3,7 @@
<mk-notes ref="timeline" :more="existMore ? more : null">
<div slot="empty">
%fa:R comments%
{{ withMedia ? '%i18n:!@no-notes-with-media%' : '%i18n:!@no-notes%' }}
{{ withMedia ? '%i18n:@no-notes-with-media%' : '%i18n:@no-notes%' }}
</div>
</mk-notes>
</div>

View File

@ -2,7 +2,7 @@
<mk-ui>
<template slot="header" v-if="!fetching">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">
{{ '%i18n:!@followers-of%'.replace('{}', name) }}
{{ '%i18n:@followers-of%'.replace('{}', name) }}
</template>
<mk-users-list
v-if="!fetching"
@ -49,7 +49,7 @@ export default Vue.extend({
this.user = user;
this.fetching = false;
document.title = '%i18n:!@followers-of%'.replace('{}', this.name) + ' | Misskey';
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | Misskey';
});
},
onLoaded() {

View File

@ -2,7 +2,7 @@
<mk-ui>
<template slot="header" v-if="!fetching">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">
{{ '%i18n:!@following-of%'.replace('{}', name) }}
{{ '%i18n:@following-of%'.replace('{}', name) }}
</template>
<mk-users-list
v-if="!fetching"
@ -48,7 +48,7 @@ export default Vue.extend({
this.user = user;
this.fetching = false;
document.title = '%i18n:!@followers-of%'.replace('{}', this.name) + ' | Misskey';
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | Misskey';
});
},
onLoaded() {

View File

@ -21,7 +21,7 @@ export default Vue.extend({
},
methods: {
fn() {
const ok = window.confirm('%i18n:!@read-all%');
const ok = window.confirm('%i18n:@read-all%');
if (!ok) return;
(this as any).api('notifications/markAsRead_all');

View File

@ -3,7 +3,7 @@
<span slot="header">%fa:search% {{ q }}</span>
<main v-if="!fetching">
<mk-notes :class="$style.notes" :notes="notes">
<span v-if="notes.length == 0">{{ '%i18n:!@empty%'.replace('{}', q) }}</span>
<span v-if="notes.length == 0">{{ '%i18n:@empty%'.replace('{}', q) }}</span>
<button v-if="existMore" @click="more" :disabled="fetching" slot="tail">
<span v-if="!fetching">%i18n:@load-more%</span>
<span v-if="fetching">%i18n:common.loading%<mk-ellipsis/></span>

View File

@ -25,7 +25,7 @@ export default Vue.extend({
}
},
mounted() {
document.title = '%i18n:!@title%';
document.title = '%i18n:@title%';
},
methods: {
onSelected(file) {

View File

@ -2,7 +2,7 @@
<mk-ui>
<span slot="header">%fa:cog%%i18n:@settings%</span>
<main>
<p v-html="'%i18n:!@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p>
<p v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p>
<div>
<x-profile/>
@ -35,6 +35,13 @@
<md-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch>
</div>
</div>
<div>
<div class="md-body-2">%i18n:@post-style%</div>
<md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio>
<md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio>
</div>
</md-card-content>
</md-card>
@ -71,11 +78,7 @@
</md-optgroup>
<md-optgroup label="%i18n:@specify-language%">
<md-option value="ja">日本語</md-option>
<md-option value="en">English</md-option>
<md-option value="fr">Français</md-option>
<md-option value="pl">Polski</md-option>
<md-option value="de">Deutsch</md-option>
<md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option>
</md-optgroup>
</md-select>
</md-field>
@ -91,7 +94,7 @@
<md-card-content>
<p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
<p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:!@twitter-reconnect%' : '%i18n:!@twitter-connect%' }}</a>
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
<span v-if="os.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a>
</p>
@ -122,7 +125,7 @@
<script lang="ts">
import Vue from 'vue';
import { apiUrl, version, codename } from '../../../config';
import { apiUrl, version, codename, langs } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update';
import XProfile from './settings/settings.profile.vue';
@ -137,9 +140,8 @@ export default Vue.extend({
apiUrl,
version,
codename,
langs,
darkmode: localStorage.getItem('darkmode') == 'true',
lightmode: localStorage.getItem('lightmode') == 'true',
lang: localStorage.getItem('lang') || '',
latestVersion: undefined,
checkingForUpdate: false
};
@ -148,20 +150,27 @@ export default Vue.extend({
computed: {
name(): string {
return Vue.filter('userName')((this as any).os.i);
}
},
postStyle: {
get() { return this.$store.state.device.postStyle; },
set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); }
},
lightmode: {
get() { return this.$store.state.device.lightmode; },
set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); }
},
lang: {
get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
},
},
watch: {
darkmode() {
(this as any)._updateDarkmode_(this.darkmode);
},
lightmode() {
localStorage.setItem('lightmode', this.lightmode);
},
lang() {
localStorage.setItem('lang', this.lang);
}
},
@ -223,13 +232,13 @@ export default Vue.extend({
this.latestVersion = newer;
if (newer == null) {
(this as any).apis.dialog({
title: '%i18n:!@no-updates%',
text: '%i18n:!@no-updates-desc%'
title: '%i18n:@no-updates%',
text: '%i18n:@no-updates-desc%'
});
} else {
(this as any).apis.dialog({
title: '%i18n:!@update-available%',
text: '%i18n:!@update-available-desc%'
title: '%i18n:@update-available%',
text: '%i18n:@update-available-desc%'
});
}
});

View File

@ -27,7 +27,6 @@
<md-icon>%fa:birthday-cake%</md-icon>
<label>%i18n:@birthday%</label>
<md-input type="date" v-model="birthday" :disabled="saving"/>
<span class="md-helper-text">%i18n:@will-be-published%</span>
</md-field>
<md-field>
@ -50,7 +49,7 @@
md-content="%18n:!@uploading%"/>
<div>
<md-switch v-model="os.i.isBot" @change="onChangeIsBot">%i18n:@is-bot%</md-switch>
<md-switch v-model="isCat">%i18n:@is-cat%</md-switch>
</div>
</md-card-content>
@ -75,6 +74,8 @@ export default Vue.extend({
birthday: null,
avatarId: null,
bannerId: null,
isBot: false,
isCat: false,
saving: false,
uploading: false
};
@ -88,15 +89,11 @@ export default Vue.extend({
this.birthday = (this as any).os.i.profile.birthday;
this.avatarId = (this as any).os.i.avatarId;
this.bannerId = (this as any).os.i.bannerId;
this.isBot = (this as any).os.i.isBot;
this.isCat = (this as any).os.i.isCat;
},
methods: {
onChangeIsBot() {
(this as any).api('i/update', {
isBot: (this as any).os.i.isBot
});
},
onAvatarChange([file]) {
this.uploading = true;
@ -150,7 +147,9 @@ export default Vue.extend({
description: this.description || null,
birthday: this.birthday || null,
avatarId: this.avatarId,
bannerId: this.bannerId
bannerId: this.bannerId,
isBot: this.isBot,
isCat: this.isCat
}).then(i => {
this.saving = false;
(this as any).os.i.avatarId = i.avatarId;
@ -158,7 +157,7 @@ export default Vue.extend({
(this as any).os.i.bannerId = i.bannerId;
(this as any).os.i.bannerUrl = i.bannerUrl;
alert('%i18n:!@saved%');
alert('%i18n:@saved%');
});
}
}

View File

@ -65,7 +65,7 @@ export default Vue.extend({
computed: {
widgets(): any[] {
return this.$store.state.settings.data.mobileHome;
return this.$store.state.settings.mobileHome;
}
},

View File

@ -1,4 +1,6 @@
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';
import MiOS from './mios';
const defaultSettings = {
@ -14,14 +16,29 @@ const defaultSettings = {
showRenotedMyNotes: true
};
const defaultDeviceSettings = {
apiViaStream: true,
autoPopout: false,
enableSounds: true,
soundVolume: 0.5,
lang: null,
preventUpdate: false,
debug: false,
lightmode: false,
postStyle: 'standard'
};
export default (os: MiOS) => new Vuex.Store({
plugins: [store => {
store.subscribe((mutation, state) => {
if (mutation.type.startsWith('settings/')) {
localStorage.setItem('settings', JSON.stringify(state.settings.data));
localStorage.setItem('settings', JSON.stringify(state.settings));
}
});
}],
}, createPersistedState({
paths: ['device'],
filter: mut => mut.type.startsWith('device/')
})],
state: {
indicate: false,
@ -39,50 +56,60 @@ export default (os: MiOS) => new Vuex.Store({
},
modules: {
settings: {
device: {
namespaced: true,
state: {
data: defaultSettings
},
state: defaultDeviceSettings,
mutations: {
set(state, x: { key: string; value: any }) {
state.data[x.key] = x.value;
state[x.key] = x.value;
}
}
},
settings: {
namespaced: true,
state: defaultSettings,
mutations: {
set(state, x: { key: string; value: any }) {
state[x.key] = x.value;
},
setHome(state, data) {
state.data.home = data;
state.home = data;
},
setHomeWidget(state, x) {
const w = state.data.home.find(w => w.id == x.id);
const w = state.home.find(w => w.id == x.id);
if (w) {
w.data = x.data;
}
},
addHomeWidget(state, widget) {
state.data.home.unshift(widget);
state.home.unshift(widget);
},
setMobileHome(state, data) {
state.data.mobileHome = data;
state.mobileHome = data;
},
setMobileHomeWidget(state, x) {
const w = state.data.mobileHome.find(w => w.id == x.id);
const w = state.mobileHome.find(w => w.id == x.id);
if (w) {
w.data = x.data;
}
},
addMobileHomeWidget(state, widget) {
state.data.mobileHome.unshift(widget);
state.mobileHome.unshift(widget);
},
removeMobileHomeWidget(state, widget) {
state.data.mobileHome = state.data.mobileHome.filter(w => w.id != widget.id);
state.mobileHome = state.mobileHome.filter(w => w.id != widget.id);
}
},
@ -108,7 +135,7 @@ export default (os: MiOS) => new Vuex.Store({
ctx.commit('addHomeWidget', widget);
os.api('i/update_home', {
home: ctx.state.data.home
home: ctx.state.home
});
},
@ -116,7 +143,7 @@ export default (os: MiOS) => new Vuex.Store({
ctx.commit('addMobileHomeWidget', widget);
os.api('i/update_mobile_home', {
home: ctx.state.data.mobileHome
home: ctx.state.mobileHome
});
},
@ -124,7 +151,7 @@ export default (os: MiOS) => new Vuex.Store({
ctx.commit('removeMobileHomeWidget', widget);
os.api('i/update_mobile_home', {
home: ctx.state.data.mobileHome.filter(w => w.id != widget.id)
home: ctx.state.mobileHome.filter(w => w.id != widget.id)
});
}
}

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve">
<circle fill="#2B2F2D" cx="128" cy="153.6" r="19.201"/>
<circle fill="#2B2F2D" cx="51.2" cy="153.6" r="19.2"/>
<circle fill="#2B2F2D" cx="204.8" cy="153.6" r="19.2"/>
<polyline fill="none" stroke="#2B2F2D" stroke-width="16" stroke-linejoin="round" stroke-miterlimit="10" points="51.2,153.6
89.601,102.4 128,153.6 166.4,102.4 204.799,153.6 "/>
<circle fill="#2B2F2D" cx="89.6" cy="102.4" r="19.2"/>
<circle fill="#2B2F2D" cx="166.4" cy="102.4" r="19.199"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1021 B

View File

@ -10,11 +10,6 @@
localStorage.setItem('v', v);
}
const lang = window.prompt('Enter language (optional):');
if (lang && lang.length > 0) {
localStorage.setItem('lang', lang);
}
setTimeout(() => {
location.href = '/';
}, 500);

View File

@ -194,7 +194,12 @@ cluster.on('exit', worker => {
// Display detail of unhandled promise rejection
process.on('unhandledRejection', console.dir);
// Dying away...
process.on('exit', () => {
Logger.info('The process is going exit');
// Display detail of uncaught exception
process.on('uncaughtException', err => {
console.error(err);
});
// Dying away...
process.on('exit', code => {
Logger.info(`The process is going exit (${code})`);
});

View File

@ -324,6 +324,10 @@ export const pack = async (
// resolve promises in _note object
_note = await rap(_note);
if (_note.user.isCat && _note.text) {
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ');
}
if (hide) {
_note.mediaIds = [];
_note.text = null;

View File

@ -77,6 +77,7 @@ export interface ILocalUser extends IUserBase {
};
lastUsedAt: Date;
isBot: boolean;
isCat: boolean;
isPro: boolean;
twoFactorSecret: string;
twoFactorEnabled: boolean;

View File

@ -1,6 +1,7 @@
import * as mongo from 'mongodb';
import { default as Notification, INotification } from '../../../models/notification';
import publishUserStream from '../../../publishers/stream';
import Mute from '../../../models/mute';
/**
* Mark as read notification(s)
@ -26,6 +27,11 @@ export default (
? [new mongo.ObjectID(message)]
: [(message as INotification)._id];
const mute = await Mute.find({
muterId: userId
});
const mutedUserIds = mute.map(m => m.muteeId);
// Update documents
await Notification.update({
_id: { $in: ids },
@ -42,6 +48,9 @@ export default (
const count = await Notification
.count({
notifieeId: userId,
notifierId: {
$nin: mutedUserIds
},
isRead: false
}, {
limit: 1

View File

@ -96,8 +96,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
});
// Serialize
res(await Promise.all(notifications.map(async notification =>
await pack(notification))));
res(await Promise.all(notifications.map(notification => pack(notification))));
// Mark as read all
if (notifications.length > 0 && markAsRead) {

View File

@ -47,6 +47,11 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
if (isBotErr) return rej('invalid isBot param');
if (isBot != null) user.isBot = isBot;
// Get 'isCat' parameter
const [isCat, isCatErr] = $.bool.optional().get(params.isCat);
if (isCatErr) return rej('invalid isCat param');
if (isCat != null) user.isCat = isCat;
// Get 'autoWatch' parameter
const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch);
if (autoWatchErr) return rej('invalid autoWatch param');
@ -82,6 +87,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
bannerColor: user.bannerColor,
profile: user.profile,
isBot: user.isBot,
isCat: user.isCat,
settings: user.settings
}
});

View File

@ -8,6 +8,10 @@ import Note, { pack } from '../../../models/note';
* Get all notes
*/
module.exports = (params) => new Promise(async (res, rej) => {
// Get 'local' parameter
const [local, localErr] = $.bool.optional().get(params.local);
if (localErr) return rej('invalid local param');
// Get 'reply' parameter
const [reply, replyErr] = $.bool.optional().get(params.reply);
if (replyErr) return rej('invalid reply param');
@ -61,6 +65,10 @@ module.exports = (params) => new Promise(async (res, rej) => {
};
}
if (local) {
query['_user.host'] = null;
}
if (reply != undefined) {
query.replyId = reply ? { $exists: true, $ne: null } : null;
}

View File

@ -9,8 +9,7 @@ import Mute from '../../../../models/mute';
*/
module.exports = (params, user) => new Promise(async (res, rej) => {
const mute = await Mute.find({
muterId: user._id,
deletedAt: { $exists: false }
muterId: user._id
});
const mutedUserIds = mute.map(m => m.muteeId);

View File

@ -49,8 +49,8 @@ const router = new Router();
//#region static assets
router.get('/assets/*', async ctx => {
// 無圧縮スクリプトを用意するのは大変なので一時的に無効化
const path = process.env.NODE_ENV == 'production' ? ctx.path.replace('raw.js', 'min.js') : ctx.path.replace('min.js', 'raw.js');
// 互換性のため
const path = ctx.path.replace('.raw.js', '.js').replace('.min.js', '.js');
await send(ctx, path, {
root: client,
maxage: ms('7 days'),

View File

@ -60,7 +60,7 @@ const entry = {
const output = {
path: __dirname + '/built/client/assets',
filename: `[name].${version}.-.${isProduction ? 'min' : 'raw'}.js`
filename: `[name].${version}.-.js`
};
//#region Define consts
@ -78,6 +78,7 @@ const consts = {
_WS_URL_: config.ws_url,
_DEV_URL_: config.dev_url,
_LANG_: '%lang%',
_LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]),
_HOST_: config.host,
_HOSTNAME_: config.hostname,
_URL_: config.url,
@ -110,14 +111,14 @@ const plugins = [
//#region i18n
langs.forEach(lang => {
Object.keys(entry).forEach(file => {
let src = fs.readFileSync(`${__dirname}/built/client/assets/${file}.${version}.-.${isProduction ? 'min' : 'raw'}.js`, 'utf-8');
let src = fs.readFileSync(`${__dirname}/built/client/assets/${file}.${version}.-.js`, 'utf-8');
const i18nReplacer = new I18nReplacer(lang);
src = src.replace(i18nReplacer.pattern, i18nReplacer.replacement);
src = src.replace('%lang%', lang);
fs.writeFileSync(`${__dirname}/built/client/assets/${file}.${version}.${lang}.${isProduction ? 'min' : 'raw'}.js`, src, 'utf-8');
fs.writeFileSync(`${__dirname}/built/client/assets/${file}.${version}.${lang}.js`, src, 'utf-8');
});
});
//#endregion

View File

@ -2,17 +2,12 @@
* Replace i18n texts
*/
export const pattern = /%i18n:([a-z0-9_\-@\.\!]+?)%/g;
export const pattern = /%i18n:([a-z0-9_\-@\.]+?)%/g;
export const replacement = (ctx, match, key) => {
const client = '/src/client/app/';
let name = null;
const shouldEscape = key[0] == '!';
if (shouldEscape) {
key = key.substr(1);
}
if (key[0] == '@') {
name = ctx.src.substr(ctx.src.indexOf(client) + client.length);
key = key.substr(1);
@ -20,5 +15,5 @@ export const replacement = (ctx, match, key) => {
const path = name ? `${name}|${key}` : key;
return shouldEscape ? `%i18n:!${path}%` : `%i18n:${path}%`;
return `%i18n:${path}%`;
};