Compare commits
582 Commits
ddfbcc5e58
...
2.4.2+86
Author | SHA1 | Date | |
---|---|---|---|
69d5e95565 | |||
3e3442fc89 | |||
8181010b0b | |||
269caf7555 | |||
ae0809ad35 | |||
4005f03cf8 | |||
4bd8ec54f1 | |||
51a387851f | |||
8ed847d870 | |||
dfe13de220 | |||
b02a54c1e9 | |||
55a7e7d900 | |||
3585941ccb | |||
7c6f2cc4ab | |||
61dbf92909 | |||
b69e4002e0 | |||
49aa24b79d | |||
ceb5c53229 | |||
908f0cb59e | |||
7c2b8de931 | |||
ddd0a4c3d3 | |||
99e07de243 | |||
6bb9c21759 | |||
8f2fc55608 | |||
a1c4e5eca0 | |||
10bf0883e5 | |||
595050f89f | |||
0722c99f21 | |||
12d03836f9 | |||
f78d3f4fd5 | |||
e798a8ba76 | |||
c28a664373 | |||
4589722c3b | |||
38e1c51b45 | |||
610ddec05c | |||
d0276f9ac6 | |||
c1e89a2ee6 | |||
ecc79368a1 | |||
e6d732c86a | |||
dd055fb077 | |||
280840c6d8 | |||
bde62a7b2c | |||
5445c570a2 | |||
b2302f5b3c | |||
d7359cfd0d | |||
9cc577adbe | |||
dd196b7754 | |||
16c07c2133 | |||
6bcb658d44 | |||
9311bfc3b5 | |||
8dd6435a30 | |||
21a1d4a2ad | |||
603875b1af | |||
4209a13c84 | |||
55b79bfd8f | |||
6e6c3f42f6 | |||
dc38b46b2c | |||
b4990308e9 | |||
237abe564d | |||
71b41d470a | |||
7052b5b635 | |||
f356e08f79 | |||
152872db65 | |||
dfe117d04f | |||
caf63f0cbe | |||
b8f5cc82f9 | |||
360bc50f21 | |||
2de93a0486 | |||
02227852f8 | |||
ad16de595b | |||
9f8c8923d9 | |||
060bfa4887 | |||
e68ada2d04 | |||
d6013078bd | |||
5976d61997 | |||
b492db90ca | |||
c9f69fed2c | |||
d2f4e7a969 | |||
aecd04e0b9 | |||
e5212419ae | |||
ec7650a920 | |||
7b96013406 | |||
fc5a79b29b | |||
4146820be5 | |||
9ec0f1ff19 | |||
ac2aec48aa | |||
58421e5d5e | |||
172d0d24fb | |||
71899dd4f2 | |||
02ffe9866d | |||
1b7e668b3f | |||
f03d80ba88 | |||
14ee6845ed | |||
8fe6c2be46 | |||
78e765f69d | |||
ddd6ff7eee | |||
b8f379796f | |||
3a10e9280c | |||
65fe06de22 | |||
e44320e0fe | |||
f2d913ffec | |||
e88dea8858 | |||
813679b161 | |||
9d4ce6ca8c | |||
88396647f3 | |||
335318ae3f | |||
da25fb9c29 | |||
c1aef89b84 | |||
0241c5f804 | |||
f6939d7c23 | |||
d654c162e3 | |||
25550ba197 | |||
3defd3a593 | |||
d62ed4c375 | |||
857f3cc832 | |||
e16bc80eea | |||
a4f6e8af56 | |||
060a97f5ec | |||
92f7e92018 | |||
5c483bd3b8 | |||
1c510d63fe | |||
115cb4adc1 | |||
54c098c274 | |||
29731728cd | |||
9e8882c580 | |||
6042e57e7a | |||
6235e736b9 | |||
e075804782 | |||
d40a6ca1c4 | |||
5ac657e526 | |||
97ddc18b8e | |||
b835c8edea | |||
288c0399f9 | |||
1478933cf1 | |||
93c6fa6e53 | |||
ce6e9c185a | |||
cdaa8cfe58 | |||
76d8cd943d | |||
d6f3ffc655 | |||
5a6b841253 | |||
cb2de52bee | |||
64e2644745 | |||
56711889ab | |||
4f47cd2c0c | |||
2b61c372f5 | |||
73777fe74e | |||
33a4bd7e71 | |||
17e6b81f76 | |||
22fde6b400 | |||
6e03a00280 | |||
72e6a6a1f6 | |||
66aef44281 | |||
7bb73c80b0 | |||
d043ef2410 | |||
1d0e2f7591 | |||
e9ef28d764 | |||
289aa17a7a | |||
93f41bb523 | |||
09ec9d4a0c | |||
1153fbdeee | |||
e933058338 | |||
ae9743c84f | |||
32bf834108 | |||
1b41c847a6 | |||
b1af6c2c97 | |||
8e76ff3f84 | |||
bd26602299 | |||
52ab1d0d10 | |||
f746e06f65 | |||
d11069a2be | |||
d6dc487d9e | |||
a07c7cdede | |||
acbc125dec | |||
ad0ee971c1 | |||
52d6bb083e | |||
2027eab49b | |||
566ebde1dd | |||
9e039cc532 | |||
c4b95d7084 | |||
a66129a9ba | |||
44e1a8bf67 | |||
efcfd3f57d | |||
84759715a4 | |||
fda09382dd | |||
2c5dd0563a | |||
5bdd8e94fa | |||
2a53031c9a | |||
e8bc7261f3 | |||
997934f680 | |||
26e69d6264 | |||
153eabcbf2 | |||
6d0145c335 | |||
81a79f9476 | |||
537f404fe0 | |||
eb29f76b9a | |||
56816dc060 | |||
899d5f3e5e | |||
c8c455bb57 | |||
5468fc0748 | |||
78516abf2e | |||
0424f98eb5 | |||
2188b8b2e2 | |||
0bf614a75c | |||
9f21f744a4 | |||
b94cda6205 | |||
3c0e4046a4 | |||
338c22a606 | |||
25dd895e0d | |||
ea9ef9e82a | |||
edd86eda77 | |||
671b857a79 | |||
408fd0f35e | |||
30184d08b1 | |||
95f257c47a | |||
41297c6712 | |||
a8e0ade0c8 | |||
3338e699c4 | |||
e07da3efa5 | |||
4f7f015250 | |||
2a4c15d0dc | |||
70ef894ec5 | |||
bb9179d5f9 | |||
e2ecb573a2 | |||
8cb5dff498 | |||
a5629975ed | |||
972b304969 | |||
e8ded55055 | |||
04875eb164 | |||
54a59aa470 | |||
365f330629 | |||
a7829d15b2 | |||
a3868a4281 | |||
1d1d61d60c | |||
03c2491587 | |||
2c1adc988c | |||
c0fbee55e4 | |||
6e544c0b6c | |||
7d56c5ef31 | |||
c2df1af16d | |||
a8143c6453 | |||
04065061e0 | |||
226eb452e5 | |||
a6715b0872 | |||
43e3404dbb | |||
c91cf7c813 | |||
9cd1cad695 | |||
dde280833b | |||
42ac12b53e | |||
63567bf708 | |||
5d3cadefef | |||
251fbb2503 | |||
0b31d32217 | |||
5ddd4fed2e | |||
48b6d5f6c1 | |||
b83b0b5efb | |||
cb24bd953d | |||
4937dee182 | |||
d612097bb1 | |||
058d668b6b | |||
8b19462c3a | |||
0a381ef09b | |||
9b84e912b2 | |||
b3254e0f2f | |||
f0a3bbe023 | |||
df81c84438 | |||
8b12395fca | |||
cb2b71d194 | |||
7ed508e2bb | |||
dad869967e | |||
2d5b3b554e | |||
74882116e3 | |||
a97c3bce3a | |||
1aa70827dc | |||
fe028860e9 | |||
a2d2ce4d38 | |||
167c11b9eb | |||
8cb3933fcc | |||
3818328afe | |||
11627e2455 | |||
3f82c06ff8 | |||
2350f59131 | |||
9fe7c9530a | |||
52f1826e91 | |||
28a4c86dbf | |||
85e48ce03b | |||
efef61a8ea | |||
10ead95af9 | |||
838ee4d55d | |||
13e42429a9 | |||
c6ce3fe2b7 | |||
ae9a7eb0fd | |||
5d6fb2442f | |||
5a85985534 | |||
c80499db03 | |||
b8dcdb2315 | |||
b7b921f1f4 | |||
319d5c7d7f | |||
4b5b001739 | |||
db8871a455 | |||
38dcaa6066 | |||
03275b46ca | |||
cf3b482fef | |||
aa4c04d4ef | |||
73b82f65e4 | |||
9471fe40fe | |||
0d1e18735e | |||
8bb62b5992 | |||
1e8a6dea5b | |||
5c2804cc4d | |||
0dbb8f132a | |||
3395f3dbd0 | |||
d258ba776e | |||
0dcfcaad56 | |||
687e720956 | |||
180876949e | |||
9718965809 | |||
5377161fb0 | |||
963e538ae5 | |||
a355e3bf90 | |||
cb4a2598c8 | |||
950612dc07 | |||
cbd1eaf1af | |||
ac41cbd99f | |||
9f9c90abc4 | |||
87029e3538 | |||
127d9adc09 | |||
c82dc7ad85 | |||
36bcff7a7c | |||
38201b547a | |||
ed0334fcda | |||
fbb486b90b | |||
9b34f385d5 | |||
bb7b731602 | |||
19076f8136 | |||
dc77a936ce | |||
7f58710c6f | |||
068ddcdcdc | |||
f4e9252ca0 | |||
3b1e918117 | |||
ed7981fdaf | |||
9698ca53e4 | |||
ddc1dc7daf | |||
1625a957f8 | |||
2dc50d627e | |||
2ffde9a3dd | |||
5967a91ae1 | |||
32c1effcb5 | |||
9d0e19c56f | |||
acf4e634fe | |||
25942c2338 | |||
a4f81f6ba1 | |||
c1b9090e51 | |||
f494f70003 | |||
fb2a55a909 | |||
4edfa7fd50 | |||
d699cac9b1 | |||
c0428e12c1 | |||
55f434ff05 | |||
f2b3bdda2d | |||
1f6bf33b0e | |||
e2027b1a32 | |||
2b3a58b55e | |||
6ac536412a | |||
52f8ffe4e4 | |||
aca81431aa | |||
1fadd850b7 | |||
ed2a9a21b6 | |||
57279eb3e4 | |||
c403a2914a | |||
bcb176344c | |||
ecf362cffc | |||
f4ab7671d8 | |||
a2a3018917 | |||
0bdb664000 | |||
9c3b61ce57 | |||
d06df3d278 | |||
547ba19e61 | |||
cb05ff2e9e | |||
f614da7918 | |||
a3c8dafff9 | |||
fa978a7cd1 | |||
aaa0a562b4 | |||
590a4ce2a6 | |||
f26edce071 | |||
603799ea32 | |||
a32baf7798 | |||
498c9af663 | |||
202dbff6d3 | |||
96fd64d85d | |||
e236b7f98b | |||
5c7929e618 | |||
7ba5260246 | |||
a6d4947a23 | |||
7fbd4e9647 | |||
95d926b29f | |||
f6cf6d0440 | |||
e503c3f02f | |||
d4fbdd397e | |||
03943a7138 | |||
44f2c5fe0e | |||
bb66d5b684 | |||
1fca36293d | |||
2c7dc8c2ea | |||
cf0df91d8c | |||
91c85e8a58 | |||
2851780dda | |||
00fd58fb97 | |||
ee7d0ddd25 | |||
7656c08832 | |||
619c90cdd9 | |||
168d51c9fe | |||
d4b831f98e | |||
4d96a15c31 | |||
06dd3e092a | |||
82fe9e287a | |||
dc1c285de1 | |||
5a3313e94f | |||
61032c84f1 | |||
36a5b8fb39 | |||
3eda464e03 | |||
7a3ab6fd7d | |||
3d15c0b9f9 | |||
67a29b4305 | |||
594f57e0d3 | |||
d1eb51c596 | |||
85d2eff7f8 | |||
2375c46852 | |||
fd2eb5cda6 | |||
1256f440bd | |||
5b05ca67b6 | |||
95af7140cd | |||
77e9994204 | |||
3f6c186c13 | |||
9ac4a940dd | |||
ec050ab712 | |||
77e3ce8bcc | |||
f5dcf71e10 | |||
7fc18b40db | |||
8c8ab24c9e | |||
a319bd7f8c | |||
6427ec1f82 | |||
35dc7f4392 | |||
b50191970e | |||
1b69e6dd42 | |||
39fb4d474f | |||
392aebcad7 | |||
e9e3a4c474 | |||
7182336a0d | |||
be98fe133d | |||
e458943f56 | |||
eb125fc436 | |||
dc78f39969 | |||
f5c06bc89c | |||
d6d60e60a9 | |||
435b730f3b | |||
73468c5c6d | |||
8db6513eef | |||
65a8f1e6c3 | |||
2671ffad4b | |||
8a628823e0 | |||
94d19a1524 | |||
d98f6c8d18 | |||
6d0f62016a | |||
7e0faba5db | |||
7508a54907 | |||
2eb1f4b52b | |||
00678c0ac8 | |||
abc21f858b | |||
d67e33a41d | |||
4daff41b3e | |||
f92418ea4b | |||
89c912a35b | |||
09ad917e5d | |||
5c377dc0b6 | |||
8bdaf05223 | |||
e920bd954c | |||
e395ac87c5 | |||
026a4dfb27 | |||
df18370bde | |||
80a66136ce | |||
1f8d47f6c3 | |||
b750cc3c67 | |||
b618fcc6da | |||
f763c7515a | |||
c7d5cb48ac | |||
39470d7dbf | |||
4328de21ef | |||
a3a0e8c7a2 | |||
210c73a831 | |||
edaeae386e | |||
be66ea354e | |||
d7c1ffe3cc | |||
240ad7dc7e | |||
bb5fe9c380 | |||
1347aacbc5 | |||
8880647360 | |||
717bccbf3f | |||
018441ea0b | |||
336bb88ca4 | |||
811fc40d79 | |||
e05209ba3c | |||
623095473e | |||
f47f1b175a | |||
3b1d291037 | |||
2abc9808e2 | |||
41dd7d0b64 | |||
20f4e780bc | |||
da43c940f2 | |||
a9ca8d36bc | |||
1980843ac0 | |||
96f6752bbe | |||
04b9427cdf | |||
eab939928f | |||
d3148ab89d | |||
f3b7b02e77 | |||
687db37daf | |||
415446e3bb | |||
0afb6b9c5b | |||
9f4185dff6 | |||
772a33896d | |||
afc49a7a2a | |||
3c621187a7 | |||
3f0a7a2227 | |||
f1dbea190b | |||
893b820e24 | |||
830da43193 | |||
c43cca1aae | |||
49d1d607ce | |||
67feaacf5a | |||
45f61533ee | |||
add904cc41 | |||
e6a9185d11 | |||
669107a99f | |||
4805e68fcd | |||
a693bfdc94 | |||
be9b3f76d2 | |||
ed4fcf9944 | |||
a688e33e33 | |||
62d4806b95 | |||
ed02ba02a8 | |||
efddaf50f2 | |||
d4aaf61091 | |||
fa346b528e | |||
4a9ccc7c7a | |||
76cf08830b | |||
2cbb7fb29e | |||
c55db308a1 | |||
2a837227d5 | |||
b583780cfc | |||
599dd4827b | |||
45f489dcb6 | |||
f16053c475 | |||
c603b3fcb0 | |||
d0a4eeb2b2 | |||
5dd2e83389 | |||
aa44a40e59 | |||
cae4756747 | |||
5fc03e48a1 | |||
06f2c9ecc2 | |||
ac06d35c10 | |||
c5a40702b9 | |||
468b7f2c2e | |||
273c66f5d5 | |||
6d5b690450 | |||
a70092c6f4 | |||
7a617a4f8c | |||
441df4090f | |||
e8384338f8 | |||
b0790ea145 | |||
9588fc0475 | |||
177ff513ee | |||
cf1c4403c1 | |||
23c5a1a23e | |||
32739821ba | |||
000caf4dd2 | |||
fc025c6bd3 | |||
db9f4504db | |||
bb23a12be3 | |||
a865c4d34b | |||
0c2df45337 | |||
a2a42f66a2 | |||
51c7b03ff8 |
87
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a report to help us address issues you are facing
|
||||||
|
title: "[Bug] "
|
||||||
|
labels: [Bug]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to make us better!
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: duplication
|
||||||
|
attributes:
|
||||||
|
label: ⠀
|
||||||
|
options:
|
||||||
|
- label: This issue is not duplicated with any other open or closed issues
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
App crashes on startup every time after changing settings.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: A clear and concise description of what you expected to happen
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
App started normally, everything worked fine.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: Steps to reproduce the bug
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
1. Change "HyperNet Server" to "127.0.1" in "Network" settings
|
||||||
|
2. Restart the app
|
||||||
|
3. Crash
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: Device information
|
||||||
|
description: Provide details about your system environment
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
Device: Google Pixel 8 Pro
|
||||||
|
System: Baklava (BP22.250124.009)
|
||||||
|
Version*: 2.3.2
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: screenshots
|
||||||
|
attributes:
|
||||||
|
label: Screenshots
|
||||||
|
description: If applicable, add screenshots to help explain your problem
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
setting_items.jpg
|
||||||
|
crash_screen.jpg
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context about the problem here
|
||||||
|
placeholder: |
|
||||||
|
Crash report or other useful informations
|
||||||
|
validations:
|
||||||
|
required: false
|
83
.github/ISSUE_TEMPLATE/bug_report_zh.yaml
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
name: 问题反馈
|
||||||
|
description: 提交 Bug 或其它问题的反馈
|
||||||
|
title: "[Bug] 标题"
|
||||||
|
labels: [Bug]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
非常感谢,你将要提交的反馈会让我们变得更好!
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: duplication
|
||||||
|
attributes:
|
||||||
|
label: ⠀
|
||||||
|
options:
|
||||||
|
- label: 我已经搜索并确认此 issue 不与其它任何 issue 重复
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: 问题描述
|
||||||
|
description: 清楚且详细地描述你遇到的 Bug 或问题
|
||||||
|
placeholder: |
|
||||||
|
发生了什么?生动地描述你所看到的一切
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: 期望表现
|
||||||
|
description: 清楚且详细地描述你期望发生的事
|
||||||
|
placeholder: |
|
||||||
|
什么功能应该正常运行,运行后会有什么结果
|
||||||
|
什么界面应该正常显示,应该会显示什么内容
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce
|
||||||
|
attributes:
|
||||||
|
label: 复现步骤
|
||||||
|
description: 能够复现问题的每一步
|
||||||
|
placeholder: |
|
||||||
|
1. 尽可能详细地描述每一步
|
||||||
|
2. 更改的设置、添加的好友...
|
||||||
|
3. 这里也可以描述你看到的界面
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: 环境/版本
|
||||||
|
description: 提供运行时的环境信息
|
||||||
|
placeholder: |
|
||||||
|
示例:
|
||||||
|
设备型号: Google Pixel 8 Pro
|
||||||
|
系统板本: Baklava (BP22.250124.009)
|
||||||
|
程序版本: 2.3.2
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: screenshots
|
||||||
|
attributes:
|
||||||
|
label: 屏幕截图/录制
|
||||||
|
description: 提供截屏或录屏来更好地描述问题
|
||||||
|
placeholder: |
|
||||||
|
错误显示的界面/崩溃时的界面、先前改动的设置
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional
|
||||||
|
attributes:
|
||||||
|
label: 更多信息
|
||||||
|
description: 任何与问题有关且有用的信息
|
||||||
|
placeholder: |
|
||||||
|
崩溃报告、日志,或是你的用户名
|
||||||
|
validations:
|
||||||
|
required: false
|
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Solsynth Releases
|
||||||
|
url: https://files.solsynth.dev/production01/solian
|
||||||
|
about: Another place to download released apps
|
59
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Suggest features you want to add or suggest to modify existing features
|
||||||
|
title: "[Feature] "
|
||||||
|
labels: [Feature]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to make us better!
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: duplication
|
||||||
|
attributes:
|
||||||
|
label: ⠀
|
||||||
|
options:
|
||||||
|
- label: This issue is not duplicated with any other open or closed issues
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Describe the feature
|
||||||
|
description: A clear and concise description of what the feature is
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
A Quick Settings tile to start the service, long press to launch the app.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reasons
|
||||||
|
attributes:
|
||||||
|
label: Reason for adding
|
||||||
|
description: Explain why this feature would be useful to you
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
Start the service quickly from the Quick Settings tile and save lots of time.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: examples
|
||||||
|
attributes:
|
||||||
|
label: Example(s)
|
||||||
|
description: Post screenshots/drawings/links/etc of the feature request, or proof-of-concept images about the feature
|
||||||
|
placeholder: |
|
||||||
|
Example:
|
||||||
|
shazam_toggle.jpg
|
||||||
|
nekobox_switch.jpg
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context about the feature here
|
||||||
|
validations:
|
||||||
|
required: false
|
49
.github/ISSUE_TEMPLATE/feature_request_zh.yaml
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
name: 功能建议
|
||||||
|
description: 提出你想要添加或更改的功能
|
||||||
|
title: "[Feature] 标题"
|
||||||
|
labels: [Feature]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
非常感谢,你将要提交的请求会让我们变得更好!
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: duplication
|
||||||
|
attributes:
|
||||||
|
label: ⠀
|
||||||
|
options:
|
||||||
|
- label: 我已经搜索并确认此 issue 不与其它任何 issue 重复
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: 功能描述
|
||||||
|
description: 清楚且详细地描述要添加/更改后的功能
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reasons
|
||||||
|
attributes:
|
||||||
|
label: 添加/更改理由
|
||||||
|
description: 解释为什么要这样做,对用户有什么好处
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: examples
|
||||||
|
attributes:
|
||||||
|
label: 功能示例
|
||||||
|
description: 相似/已存在功能的截图,或画出大致的界面
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional
|
||||||
|
attributes:
|
||||||
|
label: 更多信息
|
||||||
|
description: 任何与功能有关且有用的信息,或已存在功能的代码/仓库
|
||||||
|
validations:
|
||||||
|
required: false
|
42
.github/workflows/nightly.yml
vendored
@ -38,4 +38,44 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: build-output-windows
|
name: build-output-windows
|
||||||
path: build/windows/x64/runner/Release
|
path: build/windows/x64/runner/Release
|
||||||
|
build-linux:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: stable
|
||||||
|
- run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y ninja-build libgtk-3-dev
|
||||||
|
sudo apt-get install -y libmpv-dev mpv
|
||||||
|
sudo apt-get install -y libayatana-appindicator3-dev
|
||||||
|
sudo apt-get install -y keybinder-3.0
|
||||||
|
sudo apt-get install -y libnotify-dev
|
||||||
|
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
|
||||||
|
sudo apt-get install -y gstreamer-1.0
|
||||||
|
- run: flutter pub get
|
||||||
|
- run: flutter build linux
|
||||||
|
- name: Archive production artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-output-linux
|
||||||
|
path: build/linux/x64/release/bundle
|
||||||
|
- name: Build AppImage
|
||||||
|
run: |
|
||||||
|
rm -r Solian.AppDir | true
|
||||||
|
mkdir Solian.AppDir
|
||||||
|
cp -r build/linux/x64/release/bundle/* Solian.AppDir
|
||||||
|
cp -r buildtools/appimage_config/* Solian.AppDir
|
||||||
|
cp assets/icon/icon-light-radius.png Solian.AppDir
|
||||||
|
sudo chmod +x buildtools/appimagetool-x86_64.AppImage
|
||||||
|
sudo chmod +x Solian.AppDir/AppRun
|
||||||
|
./buildtools/appimagetool-x86_64.AppImage Solian.AppDir
|
||||||
|
- name: Archive production artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-output-linux-appimage
|
||||||
|
path: './*.AppImage*'
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"sync": {
|
"sync": {
|
||||||
"region": "solian-next",
|
"region": "solian",
|
||||||
"configPath": "roadsign.toml"
|
"configPath": "roadsign.toml"
|
||||||
},
|
},
|
||||||
"deployments": [
|
"deployments": [
|
||||||
{
|
{
|
||||||
"region": "solian-next",
|
"region": "solian",
|
||||||
"site": "solian-next-web",
|
"site": "solian-web",
|
||||||
"path": "build/web"
|
"path": "build/web"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
31
README.md
@ -1,16 +1,27 @@
|
|||||||
# surface
|
# Solar Network
|
||||||
|
|
||||||
A new Flutter project.
|

|
||||||
|
|
||||||
## Getting Started
|
Hello there! Welcome to the main repository of the HyperNet (also known as the Solar Network). The code here is mainly about the frontend app (also known as Solian). But you can still post issues here to get help and request new features!
|
||||||
|
|
||||||
This project is a starting point for a Flutter application.
|
## Sub Projects
|
||||||
|
|
||||||
A few resources to get you started if this is your first Flutter project:
|
HyperNet, the Solar Network is a microservices project in which the backends are stored in separate repositories. Here is a simple index for it.
|
||||||
|
|
||||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
- The Core, Gateway: [Nexus](https://github.com/Solsynth/HyperNet.Nexus)
|
||||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
- The Auth Service: [Passport](https://github.com/Solsynth/HyperNet.Passport)
|
||||||
|
- The Posting Service: [Interactive](https://github.com/Solsynth/HyperNet.Interactive)
|
||||||
|
- The Messaging Service: [Messaging](https://github.com/Solsynth/HyperNet.Messaging)
|
||||||
|
- The Wallet Service: [Wallet](https://github.com/Solsynth/HyperNet.Wallet)
|
||||||
|
- The Crawler: [Reader](https://github.com/Solsynth/HyperNet.Reader)
|
||||||
|
- Some others may not be listed, you can search in the organization with `HyperNet.` the prefix of all HyperNet projects.
|
||||||
|
|
||||||
For help getting started with Flutter development, view the
|
## Tech Stack
|
||||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
|
||||||
samples, guidance on mobile development, and a full API reference.
|
For those people who want to know the tech stack of this project, the frontend was built by Flutter, which provides the cross-platform ability.
|
||||||
|
|
||||||
|
The backend was built in Go and PostgreSQL with our very own microservice framework included in the nexus.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
The readme will be updated in the future, to be determined. For now, you can check out the link of this repository to learn more on our official website.
|
@ -15,6 +15,7 @@ analyzer:
|
|||||||
- "**/*.freezed.dart"
|
- "**/*.freezed.dart"
|
||||||
errors:
|
errors:
|
||||||
invalid_annotation_target: ignore # Due to freezed + json_serializable issue, ref https://github.com/rrousselGit/freezed/issues/488#issuecomment-894358980
|
invalid_annotation_target: ignore # Due to freezed + json_serializable issue, ref https://github.com/rrousselGit/freezed/issues/488#issuecomment-894358980
|
||||||
|
deprecated_member_use: ignore
|
||||||
|
|
||||||
linter:
|
linter:
|
||||||
# The lint rules applied to this project can be customized in the
|
# The lint rules applied to this project can be customized in the
|
||||||
|
@ -9,14 +9,39 @@ plugins {
|
|||||||
id "dev.flutter.flutter-gradle-plugin"
|
id "dev.flutter.flutter-gradle-plugin"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation 'com.google.android.material:material:1.12.0'
|
||||||
|
implementation 'androidx.glance:glance:1.1.1'
|
||||||
|
implementation 'androidx.glance:glance-appwidget:1.1.1'
|
||||||
|
implementation 'androidx.compose.foundation:foundation-layout-android:1.7.6'
|
||||||
|
implementation 'com.google.code.gson:gson:2.10.1'
|
||||||
|
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
|
||||||
|
implementation 'io.coil-kt.coil3:coil-compose:3.0.4'
|
||||||
|
implementation 'io.coil-kt.coil3:coil-network-okhttp:3.0.4'
|
||||||
|
}
|
||||||
|
|
||||||
|
def keystoreProperties = new Properties()
|
||||||
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||||
|
if (keystorePropertiesFile.exists()) {
|
||||||
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
buildFeatures {
|
||||||
|
compose true
|
||||||
|
}
|
||||||
|
|
||||||
namespace = "dev.solsynth.solian"
|
namespace = "dev.solsynth.solian"
|
||||||
compileSdk = flutter.compileSdkVersion
|
compileSdk = flutter.compileSdkVersion
|
||||||
ndkVersion = "27.0.12077973"
|
ndkVersion = "27.0.12077973"
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_17
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
targetCompatibility JavaVersion.VERSION_17
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
|
||||||
|
composeOptions {
|
||||||
|
kotlinCompilerExtensionVersion = "1.4.8"
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
@ -24,21 +49,32 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
||||||
applicationId = "dev.solsynth.solian"
|
applicationId = "dev.solsynth.solian"
|
||||||
// You can update the following values to match your application needs.
|
minSdk = 26
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
|
||||||
minSdk = flutter.minSdkVersion
|
|
||||||
targetSdk = flutter.targetSdkVersion
|
targetSdk = flutter.targetSdkVersion
|
||||||
versionCode = flutter.versionCode
|
versionCode = flutter.versionCode
|
||||||
versionName = flutter.versionName
|
versionName = flutter.versionName
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
signingConfigs {
|
||||||
release {
|
release {
|
||||||
// TODO: Add your own signing config for the release build.
|
keyAlias = keystoreProperties['keyAlias']
|
||||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
keyPassword = keystoreProperties['keyPassword']
|
||||||
signingConfig = signingConfigs.debug
|
storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
|
||||||
|
storePassword = keystoreProperties['storePassword']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
debug {
|
||||||
|
debuggable true
|
||||||
|
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
signingConfig = signingConfigs.release
|
||||||
|
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,20 +9,60 @@
|
|||||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:label="Solian"
|
android:label="Solian"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/ic_launcher">
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:requestLegacyExternalStorage="true">
|
||||||
|
<meta-data
|
||||||
|
android:name="flutterEmbedding"
|
||||||
|
android:value="2" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleInstance"
|
||||||
android:taskAffinity=""
|
android:taskAffinity=""
|
||||||
android:theme="@style/LaunchTheme"
|
android:theme="@style/LaunchTheme"
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize">
|
||||||
|
<!-- Widgets Indents -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="es.antonborri.home_widget.action.LAUNCH" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Sharing Intents -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="text/*" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="video/*" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="video/*" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
the Android process has started. This theme is visible to the user
|
the Android process has started. This theme is visible to the user
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
@ -41,7 +81,30 @@
|
|||||||
<meta-data
|
<meta-data
|
||||||
android:name="flutterEmbedding"
|
android:name="flutterEmbedding"
|
||||||
android:value="2" />
|
android:value="2" />
|
||||||
|
|
||||||
|
<!-- Widgets -->
|
||||||
|
<receiver android:name=".widgets.CheckInWidgetReceiver"
|
||||||
|
android:label="Check In"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.appwidget.provider"
|
||||||
|
android:resource="@xml/check_in_widget" />
|
||||||
|
</receiver>
|
||||||
|
<receiver android:name=".widgets.RandomPostWidgetReceiver"
|
||||||
|
android:label="Random Post"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.appwidget.provider"
|
||||||
|
android:resource="@xml/random_post_widget" />
|
||||||
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
<!-- Required to query activities that can process text, see:
|
<!-- Required to query activities that can process text, see:
|
||||||
https://developer.android.com/training/package-visibility and
|
https://developer.android.com/training/package-visibility and
|
||||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||||
@ -53,4 +116,4 @@
|
|||||||
<data android:mimeType="text/plain" />
|
<data android:mimeType="text/plain" />
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,6 @@
|
|||||||
|
package dev.solsynth.solian.data
|
||||||
|
|
||||||
|
import androidx.annotation.Keep
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class SolarPagination<T>(val count: Int, val data: List<T>)
|
@ -0,0 +1,35 @@
|
|||||||
|
package dev.solsynth.solian.data
|
||||||
|
|
||||||
|
import androidx.annotation.Keep
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class SolarPost(
|
||||||
|
val id: Int,
|
||||||
|
val body: SolarPostBody,
|
||||||
|
val publisher: SolarPublisher,
|
||||||
|
val publisherId: Int,
|
||||||
|
val createdAt: Instant,
|
||||||
|
val updatedAt: Instant,
|
||||||
|
val editedAt: Instant?,
|
||||||
|
val publishedAt: Instant?
|
||||||
|
)
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class SolarPostBody(
|
||||||
|
val content: String?,
|
||||||
|
val title: String?,
|
||||||
|
val description: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class SolarPublisher(
|
||||||
|
val id: Int,
|
||||||
|
val name: String,
|
||||||
|
val nick: String,
|
||||||
|
val description: String?,
|
||||||
|
val avatar: String?,
|
||||||
|
val banner: String?,
|
||||||
|
val createdAt: Instant,
|
||||||
|
val updatedAt: Instant
|
||||||
|
)
|
@ -0,0 +1,38 @@
|
|||||||
|
package dev.solsynth.solian.data
|
||||||
|
|
||||||
|
import androidx.annotation.Keep
|
||||||
|
import com.google.gson.JsonDeserializationContext
|
||||||
|
import com.google.gson.JsonDeserializer
|
||||||
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonParseException
|
||||||
|
import com.google.gson.JsonPrimitive
|
||||||
|
import com.google.gson.JsonSerializationContext
|
||||||
|
import com.google.gson.JsonSerializer
|
||||||
|
import java.lang.reflect.Type
|
||||||
|
import java.time.Instant
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
class InstantAdapter : JsonSerializer<Instant?>,
|
||||||
|
JsonDeserializer<Instant?> {
|
||||||
|
override fun serialize(
|
||||||
|
src: Instant?,
|
||||||
|
typeOfSrc: Type?,
|
||||||
|
context: JsonSerializationContext?
|
||||||
|
): JsonElement {
|
||||||
|
return JsonPrimitive(formatter.format(src))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(JsonParseException::class)
|
||||||
|
override fun deserialize(
|
||||||
|
json: JsonElement,
|
||||||
|
typeOfT: Type?,
|
||||||
|
context: JsonDeserializationContext?
|
||||||
|
): Instant {
|
||||||
|
return Instant.parse(json.asString)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val formatter: DateTimeFormatter = DateTimeFormatter.ISO_INSTANT
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package dev.solsynth.solian.data
|
||||||
|
|
||||||
|
import androidx.annotation.Keep
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class SolarUser(
|
||||||
|
val id: Int,
|
||||||
|
val name: String,
|
||||||
|
val nick: String
|
||||||
|
)
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class SolarCheckInRecord(
|
||||||
|
val id: Int,
|
||||||
|
val resultTier: Int,
|
||||||
|
val resultExperience: Int,
|
||||||
|
val createdAt: Instant
|
||||||
|
)
|
@ -0,0 +1,128 @@
|
|||||||
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.glance.GlanceId
|
||||||
|
import androidx.glance.GlanceModifier
|
||||||
|
import androidx.glance.GlanceTheme
|
||||||
|
import androidx.glance.action.clickable
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidget
|
||||||
|
import androidx.glance.appwidget.provideContent
|
||||||
|
import androidx.glance.background
|
||||||
|
import androidx.glance.currentState
|
||||||
|
import androidx.glance.layout.Alignment
|
||||||
|
import androidx.glance.layout.Column
|
||||||
|
import androidx.glance.layout.Row
|
||||||
|
import androidx.glance.layout.Spacer
|
||||||
|
import androidx.glance.layout.fillMaxHeight
|
||||||
|
import androidx.glance.layout.fillMaxWidth
|
||||||
|
import androidx.glance.layout.height
|
||||||
|
import androidx.glance.layout.padding
|
||||||
|
import androidx.glance.state.GlanceStateDefinition
|
||||||
|
import androidx.glance.text.FontFamily
|
||||||
|
import androidx.glance.text.Text
|
||||||
|
import androidx.glance.text.TextStyle
|
||||||
|
import com.google.gson.FieldNamingPolicy
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import dev.solsynth.solian.MainActivity
|
||||||
|
import dev.solsynth.solian.data.InstantAdapter
|
||||||
|
import dev.solsynth.solian.data.SolarCheckInRecord
|
||||||
|
import es.antonborri.home_widget.actionStartActivity
|
||||||
|
import java.time.Instant
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.ZoneId
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
|
class CheckInWidget : GlanceAppWidget() {
|
||||||
|
override val stateDefinition: GlanceStateDefinition<*>?
|
||||||
|
get() = HomeWidgetGlanceStateDefinition()
|
||||||
|
|
||||||
|
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||||
|
provideContent {
|
||||||
|
GlanceTheme {
|
||||||
|
GlanceContent(context, currentState())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun GlanceContent(context: Context, currentState: HomeWidgetGlanceState) {
|
||||||
|
val gson =
|
||||||
|
GsonBuilder()
|
||||||
|
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
||||||
|
.registerTypeAdapter(Instant::class.java, InstantAdapter())
|
||||||
|
.create()
|
||||||
|
val resultTierSymbols = listOf("Bad", "Poor", "Medium", "Good", "Great")
|
||||||
|
|
||||||
|
val prefs = currentState.preferences
|
||||||
|
val checkInRaw: String? = prefs.getString("pas_check_in_record", null)
|
||||||
|
|
||||||
|
val checkIn: SolarCheckInRecord? =
|
||||||
|
checkInRaw?.let { checkInRaw ->
|
||||||
|
gson.fromJson(checkInRaw, SolarCheckInRecord::class.java)
|
||||||
|
} ?: null;
|
||||||
|
|
||||||
|
Column(
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.fillMaxHeight()
|
||||||
|
.background(GlanceTheme.colors.widgetBackground)
|
||||||
|
.padding(16.dp)
|
||||||
|
.clickable(
|
||||||
|
onClick = actionStartActivity<MainActivity>(
|
||||||
|
context,
|
||||||
|
Uri.parse("https://sn.solsynth.dev")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if (checkIn != null) {
|
||||||
|
val dateFormatter = DateTimeFormatter.ofPattern("EEE, MM/dd")
|
||||||
|
|
||||||
|
val checkDate = checkIn.createdAt.atZone(ZoneId.of("UTC")).toLocalDate()
|
||||||
|
val currentDate = LocalDate.now()
|
||||||
|
if (checkDate.isEqual(currentDate)) {
|
||||||
|
Column {
|
||||||
|
Text(
|
||||||
|
text = resultTierSymbols[checkIn.resultTier],
|
||||||
|
style = TextStyle(
|
||||||
|
fontSize = 17.sp,
|
||||||
|
color = GlanceTheme.colors.onSurface
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = "+${checkIn.resultExperience} EXP",
|
||||||
|
style = TextStyle(
|
||||||
|
fontSize = 13.sp,
|
||||||
|
fontFamily = FontFamily.Monospace,
|
||||||
|
color = GlanceTheme.colors.onSurface
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Spacer(modifier = GlanceModifier.height(8.dp))
|
||||||
|
Row(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Text(
|
||||||
|
text = OffsetDateTime.ofInstant(
|
||||||
|
checkIn.createdAt,
|
||||||
|
ZoneId.systemDefault()
|
||||||
|
)
|
||||||
|
.format(dateFormatter),
|
||||||
|
style = TextStyle(
|
||||||
|
fontSize = 11.sp,
|
||||||
|
color = GlanceTheme.colors.onSurface
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return@Column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text(
|
||||||
|
text = "You haven't divined today",
|
||||||
|
style = TextStyle(fontSize = 15.sp, color = GlanceTheme.colors.onSurface)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package dev.solsynth.solian.widgets
|
||||||
|
|
||||||
|
import CheckInWidget
|
||||||
|
import HomeWidgetGlanceWidgetReceiver
|
||||||
|
|
||||||
|
class CheckInWidgetReceiver : HomeWidgetGlanceWidgetReceiver<CheckInWidget>() {
|
||||||
|
override val glanceAppWidget = CheckInWidget()
|
||||||
|
}
|
@ -0,0 +1,168 @@
|
|||||||
|
import HomeWidgetGlanceState
|
||||||
|
import HomeWidgetGlanceStateDefinition
|
||||||
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.glance.GlanceId
|
||||||
|
import androidx.glance.GlanceModifier
|
||||||
|
import androidx.glance.GlanceTheme
|
||||||
|
import androidx.glance.action.clickable
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidget
|
||||||
|
import androidx.glance.appwidget.provideContent
|
||||||
|
import androidx.glance.background
|
||||||
|
import androidx.glance.currentState
|
||||||
|
import androidx.glance.layout.Alignment
|
||||||
|
import androidx.glance.layout.Column
|
||||||
|
import androidx.glance.layout.Row
|
||||||
|
import androidx.glance.layout.Spacer
|
||||||
|
import androidx.glance.layout.fillMaxHeight
|
||||||
|
import androidx.glance.layout.fillMaxSize
|
||||||
|
import androidx.glance.layout.fillMaxWidth
|
||||||
|
import androidx.glance.layout.height
|
||||||
|
import androidx.glance.layout.padding
|
||||||
|
import androidx.glance.layout.width
|
||||||
|
import androidx.glance.state.GlanceStateDefinition
|
||||||
|
import androidx.glance.text.FontFamily
|
||||||
|
import androidx.glance.text.FontWeight
|
||||||
|
import androidx.glance.text.Text
|
||||||
|
import androidx.glance.text.TextStyle
|
||||||
|
import com.google.gson.FieldNamingPolicy
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import dev.solsynth.solian.MainActivity
|
||||||
|
import dev.solsynth.solian.data.InstantAdapter
|
||||||
|
import dev.solsynth.solian.data.SolarPost
|
||||||
|
import es.antonborri.home_widget.actionStartActivity
|
||||||
|
import java.time.Instant
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.ZoneId
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
|
class RandomPostWidget : GlanceAppWidget() {
|
||||||
|
override val stateDefinition: GlanceStateDefinition<*>?
|
||||||
|
get() = HomeWidgetGlanceStateDefinition()
|
||||||
|
|
||||||
|
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||||
|
provideContent {
|
||||||
|
GlanceTheme {
|
||||||
|
GlanceContent(context, currentState())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun GlanceContent(
|
||||||
|
context: Context,
|
||||||
|
currentState: HomeWidgetGlanceState,
|
||||||
|
) {
|
||||||
|
val prefs = currentState.preferences
|
||||||
|
val postRaw = prefs.getString("int_random_post", null)
|
||||||
|
|
||||||
|
val gson =
|
||||||
|
GsonBuilder()
|
||||||
|
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
||||||
|
.registerTypeAdapter(Instant::class.java, InstantAdapter())
|
||||||
|
.create()
|
||||||
|
|
||||||
|
val data: SolarPost? = postRaw?.let { postRaw ->
|
||||||
|
gson.fromJson(postRaw, SolarPost::class.java)
|
||||||
|
} ?: null;
|
||||||
|
|
||||||
|
Column(
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.fillMaxHeight()
|
||||||
|
.background(GlanceTheme.colors.widgetBackground)
|
||||||
|
.padding(16.dp)
|
||||||
|
.clickable(
|
||||||
|
onClick = actionStartActivity<MainActivity>(
|
||||||
|
context,
|
||||||
|
Uri.parse("https://sn.solsynth.dev/posts/${data!!.id}")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if (data != null) {
|
||||||
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
|
Text(
|
||||||
|
text = data.publisher.nick,
|
||||||
|
style = TextStyle(fontSize = 15.sp, color = GlanceTheme.colors.onSurface)
|
||||||
|
)
|
||||||
|
Spacer(modifier = GlanceModifier.width(8.dp))
|
||||||
|
Text(
|
||||||
|
text = "@${data.publisher.name}",
|
||||||
|
style = TextStyle(
|
||||||
|
fontSize = 13.sp,
|
||||||
|
fontFamily = FontFamily.Monospace,
|
||||||
|
color = GlanceTheme.colors.onSurface
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(modifier = GlanceModifier.height(8.dp))
|
||||||
|
|
||||||
|
if (data.body.title != null) {
|
||||||
|
Text(
|
||||||
|
text = data.body.title,
|
||||||
|
style = TextStyle(fontSize = 19.sp, color = GlanceTheme.colors.onSurface)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (data.body.description != null) {
|
||||||
|
Text(
|
||||||
|
text = data.body.description,
|
||||||
|
style = TextStyle(fontSize = 17.sp, color = GlanceTheme.colors.onSurface)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.body.title != null || data.body.description != null) {
|
||||||
|
Spacer(modifier = GlanceModifier.height(8.dp))
|
||||||
|
}
|
||||||
|
|
||||||
|
Text(
|
||||||
|
text = data.body.content ?: "No content",
|
||||||
|
style = TextStyle(fontSize = 15.sp, color = GlanceTheme.colors.onSurface),
|
||||||
|
)
|
||||||
|
|
||||||
|
Spacer(modifier = GlanceModifier.height(8.dp))
|
||||||
|
|
||||||
|
|
||||||
|
Text(
|
||||||
|
LocalDateTime.ofInstant(data.createdAt, ZoneId.systemDefault())
|
||||||
|
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")),
|
||||||
|
style = TextStyle(fontSize = 13.sp, color = GlanceTheme.colors.onSurface),
|
||||||
|
)
|
||||||
|
|
||||||
|
Text(
|
||||||
|
"#${data.id}",
|
||||||
|
style = TextStyle(
|
||||||
|
fontSize = 11.sp,
|
||||||
|
fontWeight = FontWeight.Bold,
|
||||||
|
color = GlanceTheme.colors.onSurface
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
return@Column;
|
||||||
|
}
|
||||||
|
|
||||||
|
Column(
|
||||||
|
modifier = GlanceModifier.fillMaxSize(),
|
||||||
|
verticalAlignment = Alignment.Vertical.CenterVertically,
|
||||||
|
horizontalAlignment = Alignment.Horizontal.CenterHorizontally
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = "No Recommendations",
|
||||||
|
style = TextStyle(
|
||||||
|
fontSize = 17.sp,
|
||||||
|
fontWeight = FontWeight.Bold,
|
||||||
|
color = GlanceTheme.colors.onSurface
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = "Open app to load some posts",
|
||||||
|
style = TextStyle(fontSize = 15.sp, color = GlanceTheme.colors.onSurface)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package dev.solsynth.solian.widgets
|
||||||
|
|
||||||
|
import RandomPostWidget
|
||||||
|
import HomeWidgetGlanceWidgetReceiver
|
||||||
|
|
||||||
|
class RandomPostWidgetReceiver : HomeWidgetGlanceWidgetReceiver<RandomPostWidget>() {
|
||||||
|
override val glanceAppWidget = RandomPostWidget()
|
||||||
|
}
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 537 B |
Before Width: | Height: | Size: 717 B After Width: | Height: | Size: 372 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 736 B |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.5 KiB |
@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
|
</adaptive-icon>
|
||||||
</adaptive-icon>
|
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
@ -1,3 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
</adaptive-icon>
|
|
Before Width: | Height: | Size: 1.5 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Normal file
After Width: | Height: | Size: 952 B |
Before Width: | Height: | Size: 3.7 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
Normal file
After Width: | Height: | Size: 872 B |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Normal file
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1017 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
Normal file
After Width: | Height: | Size: 644 B |
Before Width: | Height: | Size: 2.4 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
Normal file
After Width: | Height: | Size: 594 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Normal file
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.1 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Normal file
After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.3 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Normal file
After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 7.7 KiB |
After Width: | Height: | Size: 1.7 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Normal file
After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.4 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Normal file
After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 2.4 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
Normal file
After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 4.8 KiB |
@ -1,4 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="ic_launcher_background">#FFFFFFFF</color>
|
<color name="ic_launcher_background">#FFFFFFFF</color>
|
||||||
|
<color name="ic_notification_background">#00000000</color>
|
||||||
</resources>
|
</resources>
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
<style name="LaunchTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
<!-- Show a splash screen on the activity. Automatically removed when
|
||||||
the Flutter engine draws its first frame -->
|
the Flutter engine draws its first frame -->
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
@ -16,7 +16,7 @@
|
|||||||
running.
|
running.
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
<style name="NormalTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
7
android/app/src/main/res/xml/check_in_widget.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:initialLayout="@layout/glance_default_loading_layout"
|
||||||
|
android:minWidth="40dp"
|
||||||
|
android:minHeight="40dp"
|
||||||
|
android:resizeMode="horizontal|vertical"
|
||||||
|
android:updatePeriodMillis="10000">
|
||||||
|
</appwidget-provider>
|
7
android/app/src/main/res/xml/random_post_widget.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:initialLayout="@layout/glance_default_loading_layout"
|
||||||
|
android:minWidth="240dp"
|
||||||
|
android:minHeight="40dp"
|
||||||
|
android:resizeMode="horizontal|vertical"
|
||||||
|
android:updatePeriodMillis="10000">
|
||||||
|
</appwidget-provider>
|
14
android/app/src/proguard-rules.pro
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
-keepclassmembers class kotlin.Metadata { *; }
|
||||||
|
-keep class dev.solsynth.solian.** { *; }
|
||||||
|
-keep public class dev.solsynth.solian.data.** { public *; }
|
||||||
|
-keepclassmembers class dev.solsynth.solian.data.** { *; }
|
||||||
|
|
||||||
|
-keepattributes *Annotation*
|
||||||
|
-keepattributes Signature
|
||||||
|
-keepattributes EnclosingMethod
|
||||||
|
|
||||||
|
-keep class com.google.gson.** { *; }
|
||||||
|
|
||||||
|
-keepclassmembers class * {
|
||||||
|
@com.google.gson.annotations.SerializedName <fields>;
|
||||||
|
}
|
@ -3,6 +3,15 @@ allprojects {
|
|||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
configurations.all {
|
||||||
|
resolutionStrategy {
|
||||||
|
eachDependency {
|
||||||
|
if ((requested.group == "androidx.work") && (requested.name.startsWith("work-runtime"))) {
|
||||||
|
useVersion("2.9.1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rootProject.buildDir = "../build"
|
rootProject.buildDir = "../build"
|
||||||
|
@ -18,7 +18,7 @@ pluginManagement {
|
|||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||||
id "com.android.application" version '8.7.2' apply false
|
id "com.android.application" version '8.7.3' apply false
|
||||||
// START: FlutterFire Configuration
|
// START: FlutterFire Configuration
|
||||||
id "com.google.gms.google-services" version "4.3.15" apply false
|
id "com.google.gms.google-services" version "4.3.15" apply false
|
||||||
id "com.google.firebase.crashlytics" version "2.8.1" apply false
|
id "com.google.firebase.crashlytics" version "2.8.1" apply false
|
||||||
|
11
api/Interactive/Trigger Fediverse Scan.bru
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Trigger Fediverse Scan
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/co/admin/fediverse
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
11
api/Nexus/Check Status.bru
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Check Status
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/directory/status
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
11
api/Nexus/List Services.bru
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: List Services
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/directory/services
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
26
api/Paperclip/Activate Boost.bru
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
meta {
|
||||||
|
name: Activate Boost
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/uc/boosts/1/activate
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "{{third_client_id}}",
|
||||||
|
"client_secret":"{{third_client_tk}}",
|
||||||
|
"type": "general",
|
||||||
|
"subject": "Merry Christmas!",
|
||||||
|
"subtitle": "一条来自 Solar Network 团队的信息",
|
||||||
|
"content": "今天是 12 月 25 日 (UTC+8),小羊祝您圣诞快乐 🎄",
|
||||||
|
"metadata": {
|
||||||
|
"image": "6EqsYQwmFRCkbmhR"
|
||||||
|
},
|
||||||
|
"priority": 10
|
||||||
|
}
|
||||||
|
}
|
19
api/Paperclip/Stickers/Create Sticker Pack.bru
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
meta {
|
||||||
|
name: Create Sticker Pack
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/uc/stickers/packs
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"prefix": "cat",
|
||||||
|
"name": "Solar Network full of Cats!",
|
||||||
|
"description": "The sticker packs is full of stickers which related with cats!"
|
||||||
|
}
|
||||||
|
}
|
20
api/Paperclip/Stickers/Create Sticker.bru
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
meta {
|
||||||
|
name: Create Sticker
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/uc/stickers
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"alias": "Deadge",
|
||||||
|
"name": "Dead",
|
||||||
|
"attachment_id": "pcbFd0u4zgdM39HM",
|
||||||
|
"pack_id": 4
|
||||||
|
}
|
||||||
|
}
|
11
api/Paperclip/Stickers/Get Sticker Packs.bru
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Sticker Packs
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/cgi/uc/stickers/packs
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
15
api/Paperclip/Stickers/Get Stickers.bru
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Stickers
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/cgi/uc/stickers?take=10
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
params:query {
|
||||||
|
take: 10
|
||||||
|
}
|
18
api/Passport/Deal Abuse Report.bru
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
meta {
|
||||||
|
name: Deal Abuse Report
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
put {
|
||||||
|
url: {{endpoint}}/cgi/id/reports/abuse/6/status
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"status": "rejected",
|
||||||
|
"message": "Not a good reason"
|
||||||
|
}
|
||||||
|
}
|
24
api/Passport/Developer Notify All Users.bru
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
meta {
|
||||||
|
name: Developer Notify All Users
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/id/dev/notify/all
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "{{third_client_id}}",
|
||||||
|
"client_secret":"{{third_client_tk}}",
|
||||||
|
"type": "general",
|
||||||
|
"subject": "关于迁移服务器完成的提示",
|
||||||
|
"subtitle": "一条来自 Solar Network 团队的运营信息",
|
||||||
|
"content": "我们已经将所有用户数据迁移到新版服务器,刚刚发布新的 DNS,因为部分 DNS 缓存的影响。可能更改不会生效,可以使用 nslookup / ping 检查解析地址是否未 8. 开头,您可以主动刷新 DNS。谢谢!",
|
||||||
|
"metadata": {},
|
||||||
|
"priority": 10
|
||||||
|
}
|
||||||
|
}
|
23
api/Passport/Developer Notify One User.bru
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
meta {
|
||||||
|
name: Developer Notify One User
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/id/dev/notify/328
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "{{third_client_id}}",
|
||||||
|
"client_secret":"{{third_client_tk}}",
|
||||||
|
"type": "general",
|
||||||
|
"subject": "处理该发布者 @vedal987 的决定",
|
||||||
|
"subtitle": "一条来自 Solar Network 客户支持的信息",
|
||||||
|
"content": "您的发布者违反了我们用户协议中的「禁止冒充他人」的相关条例,经管理决定,将相关内容隐藏。冒充他人的判定无论作者是否有主观意志,只要造成了误解我们就有责任处理。希望您能理解,本次决定未作出任何帐号相关的连带处罚。",
|
||||||
|
"priority": 10
|
||||||
|
}
|
||||||
|
}
|
11
api/Reader/List News Sources.bru
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: List News Sources
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/cgi/re/well-known/sources
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
17
api/Reader/List News.bru
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
meta {
|
||||||
|
name: List News
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/cgi/re/news?take=10&offset=0&source=shadiao
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
params:query {
|
||||||
|
take: 10
|
||||||
|
offset: 0
|
||||||
|
source: shadiao
|
||||||
|
}
|
18
api/Reader/Trigger Scan News.bru
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
meta {
|
||||||
|
name: Trigger Scan News
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/re/admin/scan
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"sources": ["taiwan-pts"],
|
||||||
|
"eager": true
|
||||||
|
}
|
||||||
|
}
|
20
api/Wallet/Create Order.bru
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
meta {
|
||||||
|
name: Create Order
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/wa/orders
|
||||||
|
body: json
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "highland-mc",
|
||||||
|
"client_secret": "(3^DLAvo3v",
|
||||||
|
"remark": "我是秦始皇,现在被困香港,现在 SN 转我 500 源点,帮助我回到咸阳,到时候封你为太监一职。",
|
||||||
|
"amount": 500
|
||||||
|
}
|
||||||
|
}
|
21
api/Wallet/Create Transaction.bru
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
meta {
|
||||||
|
name: Create Transaction
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/cgi/wa/transactions
|
||||||
|
body: json
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "alphabot",
|
||||||
|
"client_secret": "_uR0sVnHTh",
|
||||||
|
"remark": "新年红包",
|
||||||
|
"amount": 150,
|
||||||
|
"payee_id": 18
|
||||||
|
}
|
||||||
|
}
|
20
api/Wallet/Get Order.bru
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Order
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/cgi/wa/orders/4
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "highland-mc",
|
||||||
|
"client_secret": "(3^DLAvo3v",
|
||||||
|
"remark": "我是秦始皇,现在被困香港,现在 SN 转我 500 源点,帮助我回到咸阳,到时候封你为太监一职。",
|
||||||
|
"amount": 500
|
||||||
|
}
|
||||||
|
}
|
20
api/Wallet/Get Transaction.bru
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Transaction
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{endpoint}}/cgi/wa/transactions/67
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"client_id": "highland-mc",
|
||||||
|
"client_secret": "(3^DLAvo3v",
|
||||||
|
"remark": "我是秦始皇,现在被困香港,现在 SN 转我 500 源点,帮助我回到咸阳,到时候封你为太监一职。",
|
||||||
|
"amount": 500
|
||||||
|
}
|
||||||
|
}
|
11
api/WatchTower/Run Database Maintenance.bru
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Run Database Maintenance
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{endpoint}}/wt/maintenance/database
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
9
api/bruno.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"name": "Solar Network",
|
||||||
|
"type": "collection",
|
||||||
|
"ignore": [
|
||||||
|
"node_modules",
|
||||||
|
".git"
|
||||||
|
]
|
||||||
|
}
|
7
api/collection.bru
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
auth {
|
||||||
|
mode: bearer
|
||||||
|
}
|
||||||
|
|
||||||
|
auth:bearer {
|
||||||
|
token: {{atk}}
|
||||||
|
}
|
8
api/environments/Prod.bru
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
vars {
|
||||||
|
endpoint: https://api.sn.solsynth.dev
|
||||||
|
third_client_id: alphabot
|
||||||
|
}
|
||||||
|
vars:secret [
|
||||||
|
atk,
|
||||||
|
third_client_tk
|
||||||
|
]
|
BIN
assets/audio/notify/metal-pipe.mp3
Normal file
BIN
assets/audio/sfx/launch-done.mp3
Normal file
BIN
assets/audio/sfx/launch-intro.mp3
Normal file
BIN
assets/fonts/Nunito-Bold.ttf
Executable file
BIN
assets/fonts/Nunito-Italic.ttf
Executable file
BIN
assets/fonts/Nunito-Regular.ttf
Executable file
BIN
assets/icon/icon-w-padding.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
assets/icon/kanban-1st.jpg
Executable file
After Width: | Height: | Size: 509 KiB |
BIN
assets/icon/tray-icon.ico
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
assets/icon/tray-icon.png
Normal file
After Width: | Height: | Size: 228 KiB |
952
assets/translations/en-US.json
Normal file
@ -0,0 +1,952 @@
|
|||||||
|
{
|
||||||
|
"nextVersionAlert": "Heavy Development Alert",
|
||||||
|
"nextVersionNotice": "You are using Solian 2.0 Preview, which is the first version of Solian 2.0. The current stable branch (sn.solsynth.dev) is 1.4. This version is still under heavy development, some features may not be stable, and not all features are supported. You can roll back to 1.4.X version via TestFlight, or continue to experience the new version (sn-next.solsynth.dev).",
|
||||||
|
"screen": "Screen",
|
||||||
|
"screenAbout": "About",
|
||||||
|
"screenHome": "Home",
|
||||||
|
"screenExplore": "Explore",
|
||||||
|
"screenAccount": "Account",
|
||||||
|
"screenAuthLogin": "Login",
|
||||||
|
"screenAuthLoginSubtitle": "Login to Solar Network using Solarpass",
|
||||||
|
"screenAuthLoginGreeting": "Welcome back",
|
||||||
|
"screenAuthRegister": "Create an account",
|
||||||
|
"screenAuthRegisterSubtitle": "Create a Solarpass account",
|
||||||
|
"screenAccountPublishers": "Publishers",
|
||||||
|
"screenAccountPublisherNew": "New Publisher",
|
||||||
|
"screenAccountPublisherEdit": "Edit Publisher",
|
||||||
|
"screenAccountProfileEdit": "Edit Profile",
|
||||||
|
"screenAbuseReport": "Abuse Reports",
|
||||||
|
"screenSettings": "Settings",
|
||||||
|
"screenAccountSettings": "Account Settings",
|
||||||
|
"screenFactorSettings": "Auth Factors",
|
||||||
|
"screenAccountWallet": "Wallet",
|
||||||
|
"screenNews": "News",
|
||||||
|
"screenAlbum": "Album",
|
||||||
|
"screenChat": "Chat",
|
||||||
|
"screenChatManage": "Edit Channel",
|
||||||
|
"screenChatNew": "New Channel",
|
||||||
|
"screenRealm": "Realm",
|
||||||
|
"screenRealmManage": "Edit Realm",
|
||||||
|
"screenRealmDiscovery": "Realm Discovery",
|
||||||
|
"screenRealmNew": "New Realm",
|
||||||
|
"screenNotification": "Notification",
|
||||||
|
"screenPostSearch": "Search Posts",
|
||||||
|
"screenFriend": "Friends",
|
||||||
|
"dialogOkay": "Okay",
|
||||||
|
"dialogCancel": "Cancel",
|
||||||
|
"dialogConfirm": "Confirm",
|
||||||
|
"dialogDismiss": "Dismiss",
|
||||||
|
"dialogError": "Something went wrong",
|
||||||
|
"errorRequestBad": "Bad request, please check your input.",
|
||||||
|
"errorRequestUnauthorized": "Unauthorized request, please login or try re-login.",
|
||||||
|
"errorRequestForbidden": "Forbidden request, you have not enough permission to do that.",
|
||||||
|
"errorRequestNotFound": "The resource that you looking for is not found.",
|
||||||
|
"errorRequestConnection": "Network connection error, please check your network or the service status.",
|
||||||
|
"errorRequestUnknown": "Unknown request error, maybe you want to take screenshot and report it to us.",
|
||||||
|
"unknown": "Unknown",
|
||||||
|
"prev": "Previous",
|
||||||
|
"next": "Next",
|
||||||
|
"edit": "Edit",
|
||||||
|
"apply": "Apply",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"create": "Create",
|
||||||
|
"preview": "Preview",
|
||||||
|
"loading": "Loading...",
|
||||||
|
"delete": "Delete",
|
||||||
|
"unlink": "Unlink",
|
||||||
|
"crop": "Crop",
|
||||||
|
"compress": "Compress",
|
||||||
|
"report": "Report",
|
||||||
|
"repost": "Repost",
|
||||||
|
"replyPost": "Reply",
|
||||||
|
"reply": "Reply",
|
||||||
|
"unset": "Unset",
|
||||||
|
"untitled": "Untitled",
|
||||||
|
"postDetail": "Post Detail",
|
||||||
|
"postNoun": "Post",
|
||||||
|
"postReadMore": "Read more",
|
||||||
|
"postReadEstimate": "Est read time {}",
|
||||||
|
"postTotalLength": {
|
||||||
|
"zero": "No character",
|
||||||
|
"one": "{} character",
|
||||||
|
"other": "{} characters"
|
||||||
|
},
|
||||||
|
"postVisibility": "Visibility",
|
||||||
|
"postVisibilityDescription": "Post visibility determines who can see this post.",
|
||||||
|
"postVisibilityAll": "Everyone",
|
||||||
|
"postVisibilityFriends": "Friends",
|
||||||
|
"postVisibilitySelected": "Selected User",
|
||||||
|
"postVisibilityFiltered": "Unselected User",
|
||||||
|
"postVisibilityNone": "Only Me",
|
||||||
|
"postVisibleUsers": "Visible Users",
|
||||||
|
"postInvisibleUsers": "Invisible Users",
|
||||||
|
"postSelectedUsers": {
|
||||||
|
"zero": "No user",
|
||||||
|
"one": "{} user",
|
||||||
|
"other": "{} users"
|
||||||
|
},
|
||||||
|
"fieldUsername": "Username",
|
||||||
|
"fieldNickname": "Nickname",
|
||||||
|
"fieldEmail": "Email address",
|
||||||
|
"fieldPassword": "Password",
|
||||||
|
"fieldDescription": "Description",
|
||||||
|
"fieldUsernameAlphanumOnly": "Username can only contain alphanumeric characters.",
|
||||||
|
"fieldUsernameLengthLimit": "Username must be between {} and {} characters.",
|
||||||
|
"fieldUsernameCannotEditHint": "Username cannot be edited after created",
|
||||||
|
"fieldUsernameLookupHint": "You can use username, phone number or email to login",
|
||||||
|
"fieldNicknameLengthLimit": "Nickname must be between {} and {} characters.",
|
||||||
|
"fieldEmailAddressMustBeValid": "Email address must be an email address.",
|
||||||
|
"fieldFirstName": "First name",
|
||||||
|
"fieldLastName": "Last name",
|
||||||
|
"fieldBirthday": "Birthday",
|
||||||
|
"fieldImageHint": "You can click those profile pictures to edit them.",
|
||||||
|
"forgotPassword": "Forgot password",
|
||||||
|
"loginPickFactor": "Pick a factor",
|
||||||
|
"loginMultiFactor": {
|
||||||
|
"one": "{} step left",
|
||||||
|
"other": "{} steps left"
|
||||||
|
},
|
||||||
|
"loginEnterPassword": "Enter the code",
|
||||||
|
"loginSuccess": "Logged in as {}",
|
||||||
|
"authFactorDelete": "Delete Auth Factor",
|
||||||
|
"authFactorDeleteDescription": "Are you sure you want delete auth factor {}?",
|
||||||
|
"authFactorPassword": "Password",
|
||||||
|
"authFactorPasswordDescription": "The password you set when you registered.",
|
||||||
|
"authFactorEmail": "Email verification code",
|
||||||
|
"authFactorEmailDescription": "An one-time code sent to the email address you set when you registered.",
|
||||||
|
"authFactorTOTP": "Time-based OTP",
|
||||||
|
"authFactorTOTPDescription": "A one-time code generated by a TOTP authenticator such as Google Authenticator or Authy.",
|
||||||
|
"authFactorInAppNotify": "In-app notification",
|
||||||
|
"authFactorInAppNotifyDescription": "A one-time code sent via in-app notification.",
|
||||||
|
"authFactorAdd": "Add a factor",
|
||||||
|
"authFactorAddSubtitle": "Provide another way to login your account.",
|
||||||
|
"accountIntroTitle": "Hello there!",
|
||||||
|
"accountIntroSubtitle": "Pick an option below to get started.",
|
||||||
|
"accountLogout": "Logout",
|
||||||
|
"accountLogoutSubtitle": "Log out of the current account.",
|
||||||
|
"accountLogoutConfirmTitle": "Are you sure you want to logout?",
|
||||||
|
"accountLogoutConfirm": "You will need to re-enter your account password, even if you have already done so. This is required to login again.",
|
||||||
|
"accountPublishers": "Your publishers",
|
||||||
|
"accountPublishersSubtitle": "Manage your publish identities.",
|
||||||
|
"accountSettings": "Account Settings",
|
||||||
|
"accountSettingsSubtitle": "Manage your account and make it yours.",
|
||||||
|
"accountProfileEdit": "Edit Profile",
|
||||||
|
"accountProfileEditSubtitle": "Make your Solarpass account more looks like you.",
|
||||||
|
"accountWallet": "Wallet",
|
||||||
|
"accountWalletSubtitle": "View your balance and transactions.",
|
||||||
|
"factorSettings": "Auth Factors",
|
||||||
|
"factorSettingsSubtitle": "Manage your authentication factors.",
|
||||||
|
"accountProfileEditApplied": "Profile modification applied.",
|
||||||
|
"publishersNew": "New Publisher",
|
||||||
|
"publisherNewSubtitle": "Create a new publisher identity.",
|
||||||
|
"publisherSyncWithAccount": "Sync with account",
|
||||||
|
"publisherTotalUpvote": "Upvote",
|
||||||
|
"publisherTotalDownvote": "Downvote",
|
||||||
|
"publisherSocialPoint": "Social Point",
|
||||||
|
"publisherJoinedAt": "Joined at {}",
|
||||||
|
"publisherSocialPointTotal": {
|
||||||
|
"zero": "No social point",
|
||||||
|
"one": "{} social point",
|
||||||
|
"other": "{} social points"
|
||||||
|
},
|
||||||
|
"publisherAffiliatedBy": "Affiliated by {}",
|
||||||
|
"publisherRunBy": "Run by {}",
|
||||||
|
"fieldPublisherBelongToRealm": "Belongs to",
|
||||||
|
"fieldPublisherBelongToRealmUnset": "Unset Publisher Belongs to Realm",
|
||||||
|
"writePost": "Compose",
|
||||||
|
"postTypeStory": "Story",
|
||||||
|
"postTypeArticle": "Article",
|
||||||
|
"postTypeQuestion": "Question",
|
||||||
|
"postTypeVideo": "Video",
|
||||||
|
"writePostTypeStory": "Post a story",
|
||||||
|
"writePostTypeArticle": "Write an article",
|
||||||
|
"writePostTypeQuestion": "Ask a question",
|
||||||
|
"writePostTypeVideo": "Post a video",
|
||||||
|
"fieldPostPublisher": "Post publisher",
|
||||||
|
"fieldPostContent": "What happened?!",
|
||||||
|
"fieldPostTitle": "Title",
|
||||||
|
"fieldPostQuestionReward": "Answer Rewards (Source Points)",
|
||||||
|
"fieldPostDescription": "Description",
|
||||||
|
"fieldPostTags": "Tags",
|
||||||
|
"fieldPostCategories": "Categories",
|
||||||
|
"fieldPostAlias": "Alias",
|
||||||
|
"fieldPostAliasHint": "Optional, used to represent the post in URL, should follow URL-Safe.",
|
||||||
|
"postPublish": "Publish",
|
||||||
|
"postPosted": "Post has been posted.",
|
||||||
|
"postPublishedAt": "Published At",
|
||||||
|
"postPublishedUntil": "Published Until",
|
||||||
|
"postEditingNotice": "You're about to editing a post that posted by {}.",
|
||||||
|
"postReplyingNotice": "You're about to reply to a post that posted by {}.",
|
||||||
|
"postRepostingNotice": "You're about to repost a post that posted by {}.",
|
||||||
|
"postReact": "React",
|
||||||
|
"postReactions": "Reactions of Post",
|
||||||
|
"postReactionUpvote": {
|
||||||
|
"zero": "0 upvote",
|
||||||
|
"one": "{} upvote",
|
||||||
|
"other": "{} upvotes"
|
||||||
|
},
|
||||||
|
"postReactionDownvote": {
|
||||||
|
"zero": "0 downvote",
|
||||||
|
"one": "{} downvote",
|
||||||
|
"other": "{} downvotes"
|
||||||
|
},
|
||||||
|
"postReactionSocialPoint": {
|
||||||
|
"zero": "0 point",
|
||||||
|
"one": "{} point",
|
||||||
|
"other": "{} points"
|
||||||
|
},
|
||||||
|
"postReactCompleted": "Reaction has been added.",
|
||||||
|
"postReactUncompleted": "Reaction has been removed.",
|
||||||
|
"postComments": {
|
||||||
|
"zero": "Comment",
|
||||||
|
"one": "{} comment",
|
||||||
|
"other": "{} comments"
|
||||||
|
},
|
||||||
|
"postCommentsDetailed": {
|
||||||
|
"zero": "No comments",
|
||||||
|
"one": "{} comment",
|
||||||
|
"other": "{} comments"
|
||||||
|
},
|
||||||
|
"postCommentExpand": "Show comments",
|
||||||
|
"settingsAppearance": "Appearance",
|
||||||
|
"settingsCustomFonts": "Custom Fonts",
|
||||||
|
"settingsCustomFontsDescription": "Set custom fonts for the application.",
|
||||||
|
"settingsCustomFontFamily": "Custom Font Family",
|
||||||
|
"settingsCustomFontFamilyHint": "Use comma to separate fonts, higher priority comes first",
|
||||||
|
"settingsCustomFontApplied": "Custom font has been applied.",
|
||||||
|
"settingsDisplayLanguage": "Display Language",
|
||||||
|
"settingsDisplayLanguageDescription": "Set the application language.",
|
||||||
|
"settingsDisplayLanguageSystem": "Follow System",
|
||||||
|
"settingsAppBarTransparent": "Transparent App Bar",
|
||||||
|
"settingsAppBarTransparentDescription": "Enable transparent effect for the app bar.",
|
||||||
|
"settingsDrawerPreferCollapse": "Prefer Drawer Collapse",
|
||||||
|
"settingsDrawerPreferCollapseDescription": "Make the drawer to collapse even when the screen is wide enough.",
|
||||||
|
"settingsBackgroundImage": "Background Image",
|
||||||
|
"settingsBackgroundImageDescription": "Set the background image that will be applied globally.",
|
||||||
|
"settingsBackgroundImageClear": "Clear Existing Background Image",
|
||||||
|
"settingsBackgroundImageClearDescription": "Reset the background image to blank.",
|
||||||
|
"settingsThemeMaterial3": "Use Material You Design",
|
||||||
|
"settingsThemeMaterial3Description": "Set the application theme to Material 3 Design.",
|
||||||
|
"settingsColorScheme": "Color Scheme",
|
||||||
|
"settingsColorSchemeDescription": "Set the application primary color.",
|
||||||
|
"settingsColorSeed": "Color Seed",
|
||||||
|
"settingsColorSeedDescription": "Select one of the present color schemes.",
|
||||||
|
"settingsFeatures": "Features",
|
||||||
|
"settingsNotifyWithHaptic": "Haptic when Notified",
|
||||||
|
"settingsNotifyWithHapticDescription": "Vibrate lightly when a new notification appears in the foreground.",
|
||||||
|
"settingsExpandPostLink": "Expand Post Link",
|
||||||
|
"settingsExpandPostLinkDescription": "Expand the post link in the post list.",
|
||||||
|
"settingsExpandChatLink": "Expand Chat Link",
|
||||||
|
"settingsExpandChatLinkDescription": "Expand the chat link in the chat list.",
|
||||||
|
"settingsNetwork": "Network",
|
||||||
|
"settingsNetworkServer": "HyperNet Server",
|
||||||
|
"settingsNetworkServerDescription": "Set the HyperNet server address, choose ours or build your own.",
|
||||||
|
"settingsNetworkServerReset": "Reset to Official Server",
|
||||||
|
"settingsNetworkServerResetDescription": "Reset to the official server address of Solar Network.",
|
||||||
|
"settingsNetworkServerPreset": "Present HyperNet Server",
|
||||||
|
"settingsNetworkServerPresetDescription": "You can choose one of our preset HyperNet server addresses from the list on the right.",
|
||||||
|
"settingsNetworkServerSaved": "Server address saved.",
|
||||||
|
"settingsPerformance": "Performance",
|
||||||
|
"settingsImageQuality": "Image Quality",
|
||||||
|
"settingsImageQualityDescription": "Set the image quality, it will affect the decoding speed of the image.",
|
||||||
|
"settingsImageQualityLowest": "Lowest",
|
||||||
|
"settingsImageQualityLow": "Low",
|
||||||
|
"settingsImageQualityMedium": "Medium",
|
||||||
|
"settingsImageQualityHigh": "High",
|
||||||
|
"settingsMisc": "Misc",
|
||||||
|
"settingsMiscAbout": "About",
|
||||||
|
"settingsMiscAboutDescription": "View the version information of Solian.",
|
||||||
|
"settingsAccountLanguage": "Account Language",
|
||||||
|
"settingsAccountLanguageDescription": "Set the language for email, notification, and other account-related content.",
|
||||||
|
"sensitiveContent": "Sensitive Content",
|
||||||
|
"sensitiveContentCollapsed": "Sensitive content has been collapsed.",
|
||||||
|
"sensitiveContentDescription": "This content has been marked as sensitive, and may not be suitable for all viewers.",
|
||||||
|
"sensitiveContentReveal": "Reveal",
|
||||||
|
"serverConnecting": "Connecting...",
|
||||||
|
"serverDisconnected": "Connection Lost",
|
||||||
|
"serverConnected": "Connected",
|
||||||
|
"fieldChatAlias": "Channel Alias",
|
||||||
|
"fieldChatAliasHint": "The unique channel alias within the site, used to represent the channel in URL, leave blank to auto generate. Should be URL-Safe.",
|
||||||
|
"fieldChatName": "Name",
|
||||||
|
"fieldChatDescription": "Description",
|
||||||
|
"fieldChatBelongToRealm": "Belongs to",
|
||||||
|
"fieldChatBelongToRealmUnset": "Unset Channel Belongs to Realm",
|
||||||
|
"channelEditingNotice": "You are editing channel {}",
|
||||||
|
"channelDeleted": "Chat channel {} has been deleted.",
|
||||||
|
"channelDelete": "Delete channel {}",
|
||||||
|
"channelDeleteDescription": "Are you sure you want to delete this channel? This operation is irreversible, all messages in this channel will be permanently deleted.",
|
||||||
|
"channelDetailPersonalRegion": "Personal",
|
||||||
|
"channelDetailMemberRegion": "Members",
|
||||||
|
"channelMemberManage": "Manage Member",
|
||||||
|
"channelMemberManageDescription": "Manage the existing members of this channel.",
|
||||||
|
"channelMemberAdd": "Add Member",
|
||||||
|
"channelMemberAddDescription": "Add new member to this channel.",
|
||||||
|
"channelMemberAdded": "Channel member has been added.",
|
||||||
|
"fieldMemberRelatedName": "Member name / account ID",
|
||||||
|
"channelDetailAdminRegion": "Administration",
|
||||||
|
"channelEditProfile": "Edit Channel Profile",
|
||||||
|
"channelEdit": "Edit Channel",
|
||||||
|
"channelEditDescription": "Change the basic information of the channel, metadata, etc.",
|
||||||
|
"channelProfileEdit": "Edit Channel Profile",
|
||||||
|
"channelActionDelete": "Delete Channel",
|
||||||
|
"channelActionDeleteDescription": "Delete the entire channel, and also delete messages in the channel.",
|
||||||
|
"channelLeave": "Leave Channel {}",
|
||||||
|
"channelLeaveDescription": "Leave this channel, but the messages in the channel will not be removed.",
|
||||||
|
"channelActionLeave": "Leave Channel",
|
||||||
|
"channelActionLeaveDescription": "Delete your profile in this channel.",
|
||||||
|
"channelNotifyLevel": "Notify Level",
|
||||||
|
"channelNotifyLevelDescription": "Decide to receive how much notifications from this channel.",
|
||||||
|
"channelNotifyLevelAll": "All",
|
||||||
|
"channelNotifyLevelMentioned": "Only Mentioned",
|
||||||
|
"channelNotifyLevelNone": "Muted",
|
||||||
|
"channelNotifyLevelApplie": "Channel notify level has been applied.",
|
||||||
|
"fieldChannelProfileNick": "In-Channel Display Name",
|
||||||
|
"fieldChannelProfileNickHint": "The nickname to display in the channel, leave blank to use the account display name.",
|
||||||
|
"fieldRealmAlias": "Realm Alias",
|
||||||
|
"fieldRealmAliasHint": "The unique realm alias within the site, used to represent the realm in URL, leave blank to auto generate. Should be URL-Safe.",
|
||||||
|
"fieldRealmName": "Name",
|
||||||
|
"fieldRealmDescription": "Description",
|
||||||
|
"realmEditingNotice": "You are editing realm {}",
|
||||||
|
"realmDeleted": "Realm {} has been deleted.",
|
||||||
|
"realmDelete": "Delete realm {}",
|
||||||
|
"realmDeleteDescription": "Are you sure you want to delete this realm? This operation is irreversible, all resources (posts, chat channels, publishers, etc) belonging to this realm will be permanently deleted. Be careful and think twice!",
|
||||||
|
"realmActionDelete": "Delete Realm",
|
||||||
|
"realmActionDeleteDescription": "Delete the realm and all its resources.",
|
||||||
|
"realmEdit": "Edit Realm",
|
||||||
|
"realmEditDescription": "Edit the basic information of the realm, metadata, etc.",
|
||||||
|
"realmMemberAdd": "Add Member",
|
||||||
|
"realmMemberAddDescription": "Add new member to this realm.",
|
||||||
|
"realmMemberAdded": "Realm member has been added.",
|
||||||
|
"fieldChatMessage": "Message in {}",
|
||||||
|
"fieldChatMessageDirect": "Message with {}",
|
||||||
|
"eventResourceTag": "Event {}",
|
||||||
|
"messageDelete": "Delete message {}",
|
||||||
|
"messageDeleteDescription": "Are you sure you want to delete this message? This operation is irreversible. You will leave a record of the deleted message.",
|
||||||
|
"messageDeleted": "Message {} has been deleted",
|
||||||
|
"messageEdited": "Message {} has been edited",
|
||||||
|
"messageEditedHint": "Edited",
|
||||||
|
"messageUnsupported": "Unsupported message {}",
|
||||||
|
"messageFileHint": {
|
||||||
|
"zero": "No attachments",
|
||||||
|
"one": "{} attachment",
|
||||||
|
"other": "{} attachments"
|
||||||
|
},
|
||||||
|
"messageTyping": {
|
||||||
|
"one": "{} is typing...",
|
||||||
|
"other": "{} are typing..."
|
||||||
|
},
|
||||||
|
"fieldAttachmentRandomId": "Random ID",
|
||||||
|
"fieldAttachmentAlt": "Alternative text",
|
||||||
|
"addAttachmentFromAlbum": "Add from album",
|
||||||
|
"addAttachmentFromFiles": "Add from files",
|
||||||
|
"addAttachmentFromClipboard": "Paste file",
|
||||||
|
"addAttachmentFromCameraPhoto": "Take photo",
|
||||||
|
"addAttachmentFromCameraVideo": "Take video",
|
||||||
|
"addAttachmentFromRandomId": "Link via RID",
|
||||||
|
"attachmentDetailInfo": "Attachment details",
|
||||||
|
"attachmentPastedImage": "Pasted Image",
|
||||||
|
"attachmentInsertedImage": "Inserted Image",
|
||||||
|
"attachmentInsertLink": "Insert Link",
|
||||||
|
"attachmentSetAsPostThumbnail": "Set as post thumbnail",
|
||||||
|
"attachmentUnsetAsPostThumbnail": "Unset as post thumbnail",
|
||||||
|
"attachmentCompressVideo": "Re-encode video",
|
||||||
|
"attachmentSetThumbnail": "Set thumbnail",
|
||||||
|
"attachmentSetAlt": "Set alternative text",
|
||||||
|
"attachmentCopyRandomId": "Copy RID",
|
||||||
|
"attachmentUpload": "Upload",
|
||||||
|
"attachmentInputDialog": "Upload attachments",
|
||||||
|
"attachmentInputUseRandomId": "Use Random ID",
|
||||||
|
"attachmentInputNew": "New Upload",
|
||||||
|
"waitingForUpload": "Waiting for upload",
|
||||||
|
"attachmentVideoCompressHint": "Compress a copy of this video",
|
||||||
|
"attachmentVideoCompressHintDescription": "Do you want to upload a compress copy of video {}? It will help your audience to preview this video faster and they still can watch the original video. It will take some while to process the video on your device, so please be patient.",
|
||||||
|
"attachmentCompressQuality": "Compress quality",
|
||||||
|
"attachmentCompressQualityHighest": "Highest",
|
||||||
|
"attachmentCompressQualityDefault": "Default",
|
||||||
|
"attachmentCompressQualityMedium": "Medium",
|
||||||
|
"attachmentCompressQualityLow": "Low",
|
||||||
|
"attachmentCompressQualityHint": "Solar Network doesn't prevent you from uploading large files, high resolution, high bitrate videos. But for your network conditions, we suggest you choose a suitable compression quality.",
|
||||||
|
"attachmentUploaded": "Uploaded",
|
||||||
|
"attachmentPending": "Pending",
|
||||||
|
"attachmentCopyCompressed": "Copy compressed",
|
||||||
|
"attachmentGotBoosted": "Boosted",
|
||||||
|
"attachmentBoost": "Boost",
|
||||||
|
"attachmentCreateBoost": "Create Boost",
|
||||||
|
"attachmentBoostHint": "Boost is a feature that allows you to upload attachments to a server closer to your audience or a faster content network. This feature is currently in beta and is subject to change. It's all free for now, you can feel free to try, you will get notified when the pricing plan changed.",
|
||||||
|
"attachmentDestinationRegion": "Destination Region",
|
||||||
|
"attachmentDestinationRegionAPAC": "Asia Pacific",
|
||||||
|
"attachmentDestinationRegionNGB": "Ning Bo, China, Zhejiang",
|
||||||
|
"attachmentDestinationRegionHKG": "Hong Kong",
|
||||||
|
"notification": "Notification",
|
||||||
|
"notificationUnreadCount": {
|
||||||
|
"zero": "All notifications read",
|
||||||
|
"one": "{} unread notification",
|
||||||
|
"other": "{} unread notifications"
|
||||||
|
},
|
||||||
|
"notificationUnread": "Unread",
|
||||||
|
"notificationRead": "Read",
|
||||||
|
"notificationMarkAllRead": "Mark all notifications as read",
|
||||||
|
"notificationMarkAllReadDescription": "Are you sure you want to mark all notifications as read? This operation is irreversible.",
|
||||||
|
"notificationMarkAllReadPrompt": {
|
||||||
|
"zero": "Marked 0 notification as read.",
|
||||||
|
"one": "Marked {} notification as read.",
|
||||||
|
"other": "Marked {} notifications as read."
|
||||||
|
},
|
||||||
|
"notificationMarkOneReadPrompt": "Marked notification {} as read.",
|
||||||
|
"search": "Search",
|
||||||
|
"postSearchResult": {
|
||||||
|
"zero": "No results",
|
||||||
|
"one": "{} result",
|
||||||
|
"other": "{} results"
|
||||||
|
},
|
||||||
|
"postSearchTook": "Took {}",
|
||||||
|
"postDelete": "Delete post {}",
|
||||||
|
"postDeleteDescription": "Are you sure you want to delete this post? This operation is irreversible.",
|
||||||
|
"postDeleted": "Post {} has been deleted.",
|
||||||
|
"call": "Call",
|
||||||
|
"callOngoingNotice": "A call is ongoing",
|
||||||
|
"callJoin": "Join",
|
||||||
|
"callResume": "Resume",
|
||||||
|
"callMicrophone": "Microphone",
|
||||||
|
"callCamera": "Camera",
|
||||||
|
"callMicrophoneDisabled": "Microphone is disabled",
|
||||||
|
"callMicrophoneSelect": "Select a microphone",
|
||||||
|
"callCameraDisabled": "Camera is disabled",
|
||||||
|
"callCameraSelect": "Select a camera",
|
||||||
|
"callDisconnected": "Call has been disconnected",
|
||||||
|
"callEnded": "Call has been ended",
|
||||||
|
"callStatusConnected": "Connected",
|
||||||
|
"callStatusDisconnected": "Disconnected",
|
||||||
|
"callStatusConnecting": "Connecting",
|
||||||
|
"callStatusReconnecting": "Reconnecting",
|
||||||
|
"callDisconnect": "Disconnect",
|
||||||
|
"callDisconnectDescription": "Are you sure you want to disconnect from the call?",
|
||||||
|
"callMicrophoneOff": "Turn off microphone",
|
||||||
|
"callMicrophoneOn": "Turn on microphone",
|
||||||
|
"callCameraOff": "Turn off camera",
|
||||||
|
"callCameraOn": "Turn on camera",
|
||||||
|
"callVideoFlip": "Mirror video",
|
||||||
|
"callSpeakerphoneToggle": "Toggle speakerphone",
|
||||||
|
"callScreenOff": "Turn off screen share",
|
||||||
|
"callScreenOn": "Turn on screen share",
|
||||||
|
"callMessageEnded": "Call lasted {}",
|
||||||
|
"callMessageStarted": "Call started",
|
||||||
|
"dailyCheckIn": "Check In",
|
||||||
|
"dailyCheckInNone": "You haven't divined today",
|
||||||
|
"dailyCheckAction": "Check in right now!",
|
||||||
|
"dailyCheckDetail": "Can't understand the symbol? Master, help me understand it!",
|
||||||
|
"dailyCheckDetailTitle": "{}'s fortune details",
|
||||||
|
"dailyCheckPositiveHint": "Good for {}",
|
||||||
|
"dailyCheckNegativeHint": "Bad for {}",
|
||||||
|
"dailyCheckEverythingIsPositive": "Everything going to be awesome!",
|
||||||
|
"dailyCheckEverythingIsNegative": "Everything may be wrong...",
|
||||||
|
"dailyCheckPositiveHint1": "Making friends",
|
||||||
|
"dailyCheckPositiveHint1Description": "Friendship lasts forever",
|
||||||
|
"dailyCheckPositiveHint2": "Drinking",
|
||||||
|
"dailyCheckPositiveHint2Description": "Drinking under the moonlight with an imaginary companion",
|
||||||
|
"dailyCheckPositiveHint3": "Traveling",
|
||||||
|
"dailyCheckPositiveHint3Description": "A journey of a thousand miles begins with a single step",
|
||||||
|
"dailyCheckPositiveHint4": "Exercising",
|
||||||
|
"dailyCheckPositiveHint4Description": "Life lies in movement",
|
||||||
|
"dailyCheckPositiveHint5": "Learning",
|
||||||
|
"dailyCheckPositiveHint5Description": "Knowledge knows no bounds; progress every day",
|
||||||
|
"dailyCheckPositiveHint6": "Planting",
|
||||||
|
"dailyCheckPositiveHint6Description": "Sow hope, reap the future",
|
||||||
|
"dailyCheckNegativeHint1": "Eating",
|
||||||
|
"dailyCheckNegativeHint1Description": "Biting your tongue while eating",
|
||||||
|
"dailyCheckNegativeHint2": "Taking exams",
|
||||||
|
"dailyCheckNegativeHint2Description": "The exam covered what you didn't review",
|
||||||
|
"dailyCheckNegativeHint3": "Catching a bus",
|
||||||
|
"dailyCheckNegativeHint3Description": "Just missed the bus",
|
||||||
|
"dailyCheckNegativeHint4": "Shopping",
|
||||||
|
"dailyCheckNegativeHint4Description": "Bought clothes that don't fit",
|
||||||
|
"dailyCheckNegativeHint5": "Gaming",
|
||||||
|
"dailyCheckNegativeHint5Description": "Lost connection at a crucial moment",
|
||||||
|
"dailyCheckNegativeHint6": "Going out",
|
||||||
|
"dailyCheckNegativeHint6Description": "Forgot your umbrella and got caught in the rain",
|
||||||
|
"celebrateBirthday": "Happy birthday, {}!",
|
||||||
|
"celebrateMerryXmas": "Merry christmas, {}!",
|
||||||
|
"celebrateNewYear": "Happy new year, {}!",
|
||||||
|
"celebrateLunarNewYear": "Happy lunar new year, {}!",
|
||||||
|
"celebrateMidAutumn": "Happy mid-autumn festival, {}!",
|
||||||
|
"celebrateDragonBoat": "Happy dragon boat festival, {}!",
|
||||||
|
"celebrateValentineDay": "Today is valentine's day, {}!",
|
||||||
|
"celebrateLaborDay": "Today is labor day, {}.",
|
||||||
|
"celebrateMotherDay": "Today is mother's day, {}.",
|
||||||
|
"celebrateChildrenDay": "Today is children's day, {}!",
|
||||||
|
"celebrateFatherDay": "Today is father's day, {}.",
|
||||||
|
"celebrateHalloween": "Happy halloween, {}!",
|
||||||
|
"celebrateThanksgiving": "Today is thanksgiving day, {}!",
|
||||||
|
"pendingBirthday": "Birthday in {}",
|
||||||
|
"pendingMerryXmas": "Christmas in {}",
|
||||||
|
"pendingLunarNewYear": "Lunar new year in {}",
|
||||||
|
"pendingMidAutumn": "Mid-autumn festival in {}",
|
||||||
|
"pendingDragonBoat": "Dragon boat festival in {}",
|
||||||
|
"pendingNewYear": "New year in {}",
|
||||||
|
"pendingValentineDay": "Valentine's day in {}",
|
||||||
|
"pendingLaborDay": "Labor day in {}",
|
||||||
|
"pendingMotherDay": "Mother's day in {}",
|
||||||
|
"pendingChildrenDay": "Children's day in {}",
|
||||||
|
"pendingFatherDay": "Father's day in {}",
|
||||||
|
"pendingHalloween": "Halloween in {}",
|
||||||
|
"pendingThanksgiving": "Thanksgiving day in {}",
|
||||||
|
"friendNew": "Add Friend",
|
||||||
|
"friendRequests": "Friend Requests",
|
||||||
|
"friendRequestsDescription": {
|
||||||
|
"zero": "You have no friend request",
|
||||||
|
"one": "You have {} friend request",
|
||||||
|
"other": "You have {} friend requests"
|
||||||
|
},
|
||||||
|
"friendBlocklist": "Blocklist",
|
||||||
|
"friendBlocklistDescription": {
|
||||||
|
"zero": "You blocked no one",
|
||||||
|
"one": "You blocked {} user",
|
||||||
|
"other": "You blocked {} users"
|
||||||
|
},
|
||||||
|
"friendStatusPending": "Pending",
|
||||||
|
"friendStatusWaiting": "Waiting",
|
||||||
|
"friendStatusActive": "Friend",
|
||||||
|
"friendStatusBlocked": "Blocked",
|
||||||
|
"friendRequestSent": "Friend request has been sent.",
|
||||||
|
"fieldFriendRelatedName": "Friend name / account ID",
|
||||||
|
"friendBlock": "Block",
|
||||||
|
"friendUnblock": "Unblock",
|
||||||
|
"friendDeleteAction": "Delete",
|
||||||
|
"friendDelete": "Delete relation with {}",
|
||||||
|
"friendDeleteDescription": "Are you sure you want to delete the relation with {}? This operation is irreversible.",
|
||||||
|
"friendRequestAccept": "Accept",
|
||||||
|
"friendRequestDecline": "Decline",
|
||||||
|
"subscribe": "Subscribe",
|
||||||
|
"unsubscribe": "Unsubscribe",
|
||||||
|
"attachmentUploadBy": "Upload by",
|
||||||
|
"attachmentShotOn": "Shot on {}",
|
||||||
|
"accountJoinedAt": "Joined at {}",
|
||||||
|
"accountBirthday": "Born on {}",
|
||||||
|
"accountBadge": "Badge",
|
||||||
|
"accountCheckInNoRecords": "No check-in records",
|
||||||
|
"badgeCompanyStaff": "Staff",
|
||||||
|
"badgeSiteMigration": "Solar Network Native",
|
||||||
|
"badgeCommunitySurvey": "Survey Participant",
|
||||||
|
"badgeCommunityVerified": "Verified User",
|
||||||
|
"badgeCommunityContributor": "Great Contributor",
|
||||||
|
"badgeSiteAnniversary": "Anniversary",
|
||||||
|
"badgeUserBirthday": "Birthday",
|
||||||
|
"accountStatus": "Status",
|
||||||
|
"accountStatusOnline": "Online",
|
||||||
|
"accountStatusOffline": "Offline",
|
||||||
|
"accountStatusLastSeen": "Last seen at {}",
|
||||||
|
"postArticle": "Article on the Solar Network",
|
||||||
|
"postStory": "Story on the Solar Network",
|
||||||
|
"postLocalDraftRestored": "Restored from device",
|
||||||
|
"articleWrittenAt": "Written at {}",
|
||||||
|
"articleEditedAt": "Edited at {}",
|
||||||
|
"attachmentSaved": "Saved to album",
|
||||||
|
"attachmentSavedDesktop": "Saved to Downloads folder",
|
||||||
|
"openInAlbum": "Open in album",
|
||||||
|
"postAbuseReport": "Report Post",
|
||||||
|
"postAbuseReportDescription": "Report posts that violate our user agreement and community guidelines to help us improve the content on Solar Network. Please describe how this post violates the relevant rules. Do not include any sensitive information. We will process your report within 24 hours.",
|
||||||
|
"abuseReport": "Abuse Report",
|
||||||
|
"abuseReportDescription": "Report any resources that violate our user agreement and community guidelines to help us improve the content on Solar Network. Please describe the location of the resource (provide resource ID as best as possible) and how this violates the relevant rules. Do not include any sensitive information. We will process your report within 24 hours.",
|
||||||
|
"abuseReportAction": "Submit Abuse Report",
|
||||||
|
"abuseReportActionDescription": "Report abuse usage behavior.",
|
||||||
|
"abuseReportResource": "Resource Location / ID",
|
||||||
|
"abuseReportReason": "Reason",
|
||||||
|
"abuseReportSubmitted": "Report submitted, thank you for your contribution.",
|
||||||
|
"submit": "Submit",
|
||||||
|
"accountDeletion": "Delete Account",
|
||||||
|
"accountDeletionDescription": "Are you sure you want to delete this account? This operation is irreversible, all resources (posts, chat channels, publishers, etc) belonging to this account will be permanently deleted. Be careful and think twice!",
|
||||||
|
"accountDeletionActionDescription": "Delete your Solarpass account.",
|
||||||
|
"accountDeletionSubmitted": "Account deletion request has been sent, you can check your inbox and follow the instructions in the email to complete the deletion operation.",
|
||||||
|
"channelNewChannel": "New Channel",
|
||||||
|
"channelNewDirectMessage": "New Direct Message",
|
||||||
|
"channelDirectMessageDescription": "Direct Message with {}",
|
||||||
|
"fieldCannotBeEmpty": "This field cannot be empty.",
|
||||||
|
"termAcceptLink": "View terms",
|
||||||
|
"termAcceptNextWithAgree": "By clicking the \"Next\", it means you agree to our terms and its updates.",
|
||||||
|
"unauthorized": "Unauthorized",
|
||||||
|
"unauthorizedDescription": "Login to explore the entire Solar Network.",
|
||||||
|
"projectDetail": "Project Details",
|
||||||
|
"serviceStatus": "Service Status",
|
||||||
|
"termRelated": "Related Terms",
|
||||||
|
"appDetails": "App Details",
|
||||||
|
"postRecommendation": "Highlight Posts",
|
||||||
|
"publisherBlockHint": "Block {}",
|
||||||
|
"publisherBlockHintDescription": "You are going to block this publisher's maintainer, this will also block publishers that run by the same user.",
|
||||||
|
"userUnblocked": "{} has been unblocked.",
|
||||||
|
"userBlocked": "{} has been blocked.",
|
||||||
|
"postSharingViaPicture": "Capturing post as picture, please wait...",
|
||||||
|
"postImageShareReadMore": "Scan the QR code to read full post",
|
||||||
|
"postImageShareAds": "Explore posts on the Solar Network",
|
||||||
|
"postShare": "Share",
|
||||||
|
"postShareImage": "Share via Image",
|
||||||
|
"postGetInsight": "Get Insight",
|
||||||
|
"postGetInsightTitle": "AI Insight",
|
||||||
|
"postGetInsightDescription": "AI may make mistakes, check important information.",
|
||||||
|
"appInitializing": "Initializing",
|
||||||
|
"poweredBy": "Powered by {}",
|
||||||
|
"shareIntent": "Share",
|
||||||
|
"shareIntentDescription": "What do you want to do with the content you are sharing?",
|
||||||
|
"shareIntentPostStory": "Post a Story",
|
||||||
|
"shareIntentSendChannel": "Share to Channel",
|
||||||
|
"updateAvailable": "Update Available",
|
||||||
|
"updateOngoing": "Updating, please wait...",
|
||||||
|
"custom": "Custom",
|
||||||
|
"colorSchemeIndigo": "Indigo",
|
||||||
|
"colorSchemeBlue": "Blue",
|
||||||
|
"colorSchemeGreen": "Green",
|
||||||
|
"colorSchemeYellow": "Yellow",
|
||||||
|
"colorSchemeOrange": "Orange",
|
||||||
|
"colorSchemeRed": "Red",
|
||||||
|
"colorSchemeWhite": "White",
|
||||||
|
"colorSchemeBlack": "Black",
|
||||||
|
"colorSchemeApplied": "Color scheme has been applied, may need restart the app to take effect.",
|
||||||
|
"postFeaturedComment": "Featured Comment",
|
||||||
|
"postCategory": "Category",
|
||||||
|
"postCategoryTechnology": "Technology",
|
||||||
|
"postCategoryGaming": "Gaming",
|
||||||
|
"postCategoryLife": "Life",
|
||||||
|
"postCategoryArts": "Arts",
|
||||||
|
"postCategorySports": "Sports",
|
||||||
|
"postCategoryMusic": "Music",
|
||||||
|
"postCategoryNews": "News",
|
||||||
|
"postCategoryKnowledge": "Knowledge",
|
||||||
|
"postCategoryLiterature": "Literature",
|
||||||
|
"postCategoryFunny": "Funny",
|
||||||
|
"postCategoryUncategorized": "Uncategorized",
|
||||||
|
"newsAllSources": "All News",
|
||||||
|
"newsReadingProviderSwap": "Swap",
|
||||||
|
"newsReadingFromReader": "You're reading from HyperNet.Reader",
|
||||||
|
"newsReadingFromOriginal": "You're reading the original article",
|
||||||
|
"newsDisclaimer": "This article is fetched from the Internet, we do not guarantee its authenticity, please judge for yourself. All content in this article belongs to the original author.",
|
||||||
|
"newsToday": "Today's News",
|
||||||
|
"totpPostSetup": "One More Thing",
|
||||||
|
"totpPostSetupDescription": "Scan the QR Code below with Google Authenticator, Microsoft Authenticator, 1Password, Authy, Bitwarden or any of kind of authenticator app which supports TOTP.",
|
||||||
|
"totpNeverShare": "Never share this QR Code",
|
||||||
|
"needHelp": "Need Help?",
|
||||||
|
"needHelpLaunch": "Check out our Goatpedia!",
|
||||||
|
"walletCreate": "Create a Wallet",
|
||||||
|
"walletCreateSubtitle": "Create a wallet to start using Source Points",
|
||||||
|
"walletCreatePassword": "Set a payment password for your new wallet below",
|
||||||
|
"walletCurrencyShort": "SRC",
|
||||||
|
"walletCurrency": {
|
||||||
|
"one": "{} Source Point",
|
||||||
|
"other": "{} Source Points"
|
||||||
|
},
|
||||||
|
"aiThinkingProcess": "AI Thinking Process",
|
||||||
|
"accountSettingsApplied": "Account settings have been applied.",
|
||||||
|
"trayMenuExit": "Exit",
|
||||||
|
"postQuestionUnanswered": "Unanswered Question",
|
||||||
|
"postQuestionUnansweredWithReward": "Unanswered Question, reward source points {}",
|
||||||
|
"postQuestionAnswered": "Answered Question",
|
||||||
|
"postQuestionAnswerSelect": "Select as Answer",
|
||||||
|
"postQuestionAnswerTitle": "Selected Question",
|
||||||
|
"postQuestionAnswerSelected": "Answer has been selected, reward has been applied.",
|
||||||
|
"postVideoUpload": "Upload Video",
|
||||||
|
"realmJoin": "Join Realm",
|
||||||
|
"realmCommunityHint": "This realm is a community realm, you can freely join.",
|
||||||
|
"realmCommunityPublicChannelsHint": "The public channels in this realm",
|
||||||
|
"realmCommunityPublishersHint": "The publishers in this realm",
|
||||||
|
"realmJoined": "Joined realm {}.",
|
||||||
|
"join": "Join",
|
||||||
|
"pollEditorNew": "New Poll",
|
||||||
|
"pollEditorEdit": "Edit Poll",
|
||||||
|
"pollEditorDelete": "Delete Poll",
|
||||||
|
"pollEditorDeleteDescription": "Are you sure you want to delete this poll? This operation is irreversible.",
|
||||||
|
"pollEditorUnlink": "Unlink Poll",
|
||||||
|
"pollOptionAdd": "Add Option",
|
||||||
|
"pollOptionName": "Option Name",
|
||||||
|
"pollLinkExisting": "Link existing poll",
|
||||||
|
"pollAnswered": "Answered the poll.",
|
||||||
|
"pollVotes": {
|
||||||
|
"one": "{} vote",
|
||||||
|
"other": "{} votes"
|
||||||
|
},
|
||||||
|
"publisherDelete": "Delete Publisher {}",
|
||||||
|
"publisherDeleteDescription": "Are you sure you want to delete this publisher? This operation is irreversible.",
|
||||||
|
"channelIsPublic": "Public Channel",
|
||||||
|
"channelIsPublicDescription": "The channel is public, anyone can join.",
|
||||||
|
"channelIsCommunity": "Community Channel",
|
||||||
|
"channelIsCommunityDescription": "Currently, community channel has nothing special yet.",
|
||||||
|
"realmIsPublic": "Public Realm",
|
||||||
|
"realmIsPublicDescription": "The realm is public, anyone can join.",
|
||||||
|
"realmIsCommunity": "Community Realm",
|
||||||
|
"realmIsCommunityDescription": "Community realm will be displayed on the discover page.",
|
||||||
|
"realmLeave": "Leave Realm",
|
||||||
|
"realmLeaveDescription": "Leave the current realm and delete the realm's identity.",
|
||||||
|
"checkInResultTier1": "Worst",
|
||||||
|
"checkInResultTier2": "Worse",
|
||||||
|
"checkInResultTier3": "Normal",
|
||||||
|
"checkInResultTier4": "Better",
|
||||||
|
"checkInResultTier5": "Best",
|
||||||
|
"flagPostAction": "Flag the Post",
|
||||||
|
"flagPost": "Flag objectionable content",
|
||||||
|
"flagPostDescription": "If flagged users takes 50% or more of the views, the post will be collapsed. You cannot revoke the action.",
|
||||||
|
"flaggedPost": "Post has been flagged.",
|
||||||
|
"postViews": {
|
||||||
|
"zero": "No views",
|
||||||
|
"one": "{} view",
|
||||||
|
"other": "{} views"
|
||||||
|
},
|
||||||
|
"attachmentBillingUploaded": "Used space",
|
||||||
|
"attachmentBillingDiscount": "Free space",
|
||||||
|
"attachmentBillingRatio": "Usage",
|
||||||
|
"attachmentBillingHint": "Sliding Window Pricing®\nFees will only apply if the size of the file uploaded within 24 hours exceeds the free space.",
|
||||||
|
"postThumbnail": "Post Thumbnail",
|
||||||
|
"accountRealms": "Realms",
|
||||||
|
"postInGlobal": "Global",
|
||||||
|
"postInGlobalDescription": "Do not link this post with any realm.",
|
||||||
|
"postChannelGlobal": "Global",
|
||||||
|
"postChannelFriends": "Friends",
|
||||||
|
"postChannelFollowing": "Following",
|
||||||
|
"postChannelRealm": "Realms",
|
||||||
|
"postFilterReset": "Reset Filter",
|
||||||
|
"postFilterResetDescription": "Clear filter and show all posts.",
|
||||||
|
"postFilterWithCategory": "Viewing posts in {}",
|
||||||
|
"databaseSize": "Database Size",
|
||||||
|
"databaseDelete": "Delete Database",
|
||||||
|
"databaseDeleteDescription": "Remove the database on your local disk, the content will be fetched from server again.",
|
||||||
|
"databaseDeleted": "The local database has been deleted.",
|
||||||
|
"settingsEnablePushNotifications": "Enable Push Notifications",
|
||||||
|
"settingsEnablePushNotificationsDescription": "Re-enable and request permission to receive push notifications. Just in case it didn't run automatically.",
|
||||||
|
"settingsEnabledPushNotifications": "Push notification has been enabled.",
|
||||||
|
"screenStickers": "Stickers",
|
||||||
|
"stickersDiscovery": "Discovery",
|
||||||
|
"stickersOwned": "Owned",
|
||||||
|
"stickersCreated": "Created",
|
||||||
|
"stickersAdd": "Add Sticker Pack",
|
||||||
|
"stickersAdded": "Sticker pack has been added.",
|
||||||
|
"add": "Add",
|
||||||
|
"stickersRemoved": "Sticker pack has been removed, you can add it again anytime.",
|
||||||
|
"stickersReload": "Reload Stickers",
|
||||||
|
"stickersReloadDescription": "Reload stickers from the server, update the sticker picker.",
|
||||||
|
"stickersReloaded": "Sticker packs has been reloaded.",
|
||||||
|
"stickersPackDelete": "Delete Pack {}",
|
||||||
|
"stickersPackDeleteDescription": "Are you sure you want to delete this sticker pack? This operation is irreversible.",
|
||||||
|
"stickersPackDeleted": "Sticker pack has been deleted.",
|
||||||
|
"stickersDelete": "Delete Sticker {}",
|
||||||
|
"stickersDeleteDescription": "Are you sure you want to delete this sticker? This operation is irreversible.",
|
||||||
|
"stickersDeleted": "Sticker has been deleted.",
|
||||||
|
"fieldStickerName": "Sticker Name",
|
||||||
|
"fieldStickerAlias": "Sticker Alias",
|
||||||
|
"fieldStickerAliasHint": "The unique sticker placeholder with the pack prefix.",
|
||||||
|
"fieldStickerPackName": "Name",
|
||||||
|
"fieldStickerPackDescription": "Description",
|
||||||
|
"fieldStickerPackPrefix": "Prefix",
|
||||||
|
"fieldStickerAttachment": "Attachment",
|
||||||
|
"stickersNew": "New Sticker",
|
||||||
|
"stickersNewDescription": "Create a new sticker belongs to this pack.",
|
||||||
|
"stickersPackNew": "New Sticker Pack",
|
||||||
|
"trayMenuShow": "Show",
|
||||||
|
"trayMenuMuteNotification": "Do Not Disturb",
|
||||||
|
"update": "Update",
|
||||||
|
"forceUpdate": "Force Update",
|
||||||
|
"forceUpdateDescription": "Force to show the application update popup, even the new version is not available.",
|
||||||
|
"debugLogging": "Runtime Logs",
|
||||||
|
"runtimeLogsOpen": "Open Logs",
|
||||||
|
"runtimeLogsDescription": "Show the runtime logs to help debugging.",
|
||||||
|
"signinResetPasswordHint": "Please enter the username / email address to help us to find your account and reset your password.",
|
||||||
|
"cacheSize": "Cache Size",
|
||||||
|
"cacheDelete": "Clean Cache",
|
||||||
|
"cacheDeleteDescription": "Remove the cached images and other resources from your disk, the content will be downloaded from server again.",
|
||||||
|
"cacheDeleted": "All cache has been cleaned up.",
|
||||||
|
"userNoDescription": "No description.",
|
||||||
|
"fieldTimeZone": "Time Zone",
|
||||||
|
"fieldGender": "Gender",
|
||||||
|
"fieldPronouns": "Pronouns",
|
||||||
|
"fieldLocation": "Location",
|
||||||
|
"fieldLinks": "Links",
|
||||||
|
"fieldLinkName": "Name",
|
||||||
|
"fieldLinkUrl": "URL",
|
||||||
|
"screenAccountBadges": "Badges",
|
||||||
|
"accountBadges": "Badges",
|
||||||
|
"accountBadgesDescription": "View and manage your badges.",
|
||||||
|
"badgeActivated": "Activated badge {}.",
|
||||||
|
"viewDetailedAttachment": "Details",
|
||||||
|
"screenKeyPairs": "Key Pairs",
|
||||||
|
"accountKeyPairs": "Key Pairs",
|
||||||
|
"accountKeyPairsDescription": "Manage the key pairs which used to encrypt messages.",
|
||||||
|
"enrollNewKeyPair": "Enroll New One",
|
||||||
|
"enrollNewKeyPairDescription": "Generate a new key pair.",
|
||||||
|
"keyPairHasPrivateKey": "With private key",
|
||||||
|
"decrypting": "Decrypting……",
|
||||||
|
"decryptingKeyNotFound": "Key not found or exchange failed, the other party may not be online",
|
||||||
|
"messageUnablePreview": "Unable preview",
|
||||||
|
"messageUnablePreviewEncrypted": "Unable preview encrypted message",
|
||||||
|
"postViewInGlobalDescription": "Do not view the post in the specific realm.",
|
||||||
|
"postDraftSaved": "The draft has been saved.",
|
||||||
|
"postDraftBox": "Draft Box",
|
||||||
|
"postShuffle": "Read Randomly",
|
||||||
|
"checkInStreak": {
|
||||||
|
"zero": "No streak",
|
||||||
|
"one": "{} day streak",
|
||||||
|
"other": "{} days streak"
|
||||||
|
},
|
||||||
|
"accountChangeStatus": "Change Status",
|
||||||
|
"accountStatusSilent": "Do not Disturb",
|
||||||
|
"accountStatusSilentDesc": "The notification will stop popping up",
|
||||||
|
"accountStatusInvisible": "Invisible",
|
||||||
|
"accountStatusInvisibleDesc": "Will show as offline, but all features still remain normal",
|
||||||
|
"accountCustomStatus": "Custom Status",
|
||||||
|
"accountCustomStatusDescription": "Customize your status.",
|
||||||
|
"accountClearStatus": "Clear Status",
|
||||||
|
"accountClearStatusDescription": "Clear your status, and let server decide which status you are for you.",
|
||||||
|
"fieldAccountStatusLabel": "Status Text",
|
||||||
|
"fieldAccountStatusClearAt": "Clear At",
|
||||||
|
"accountStatusNegative": "Negative",
|
||||||
|
"accountStatusNeutral": "Neutral",
|
||||||
|
"accountStatusPositive": "Positive",
|
||||||
|
"mixedFeed": "Mixed Feed",
|
||||||
|
"mixedFeedDescription": "The Explore screen may not only display the user's posts, but may also contain other content. However, this mode does not apply to classification and filtering.",
|
||||||
|
"filterFeed": "Exploring Adjust",
|
||||||
|
"feedUnknownItem": "Unable to display this content, the current version of the client does not support the type of content, please try to update the application afterwards.",
|
||||||
|
"serviceStatusOperational": "All services operational",
|
||||||
|
"serviceStatusDowngraded": "Some services downgraded",
|
||||||
|
"serviceStatusFailed": "All services unavailable",
|
||||||
|
"serviceStatusFailedDescription": "The server is down or the maintenance is just finished.",
|
||||||
|
"serviceNameInsights": "Summarize and Insights",
|
||||||
|
"serviceNameInteractive": "Posts, Reactions and Explore",
|
||||||
|
"serviceNameReader": "News and Link Previews",
|
||||||
|
"serviceNameMessaging": "Chat",
|
||||||
|
"serviceNameMatrix": "Matrix Software and Game Marketplace",
|
||||||
|
"serviceNamePaperclip": "Attachments, Images and Files",
|
||||||
|
"serviceNameWallet": "Source Points Wallet",
|
||||||
|
"serviceNamePassport": "Authorization and Authentication",
|
||||||
|
"accountActionEvent": "Action Events",
|
||||||
|
"accountActionEventDescription": "View your action event logs.",
|
||||||
|
"eventMetadata": "Metadata",
|
||||||
|
"accountAuthTickets": "Auth Sessions",
|
||||||
|
"accountAuthTicketsDescription": "View and manage your auth sessions.",
|
||||||
|
"authTicketCreatedAt": "Issued at {}",
|
||||||
|
"authTicketExpiredAt": "Expired at {}",
|
||||||
|
"authTicketLastGrantAt": "Last granted at {}",
|
||||||
|
"authTicketCurrent": "Current",
|
||||||
|
"accountUnconfirmedTitle": "Unconfirmed Account",
|
||||||
|
"accountUnconfirmedSubtitle": "Your account is unconfirmed, which will make most features unavailable and your account will be destroyed in 24 hours. You should receive an email in your inbox with a confirmation link.",
|
||||||
|
"accountUnconfirmedUnreceived": "Didn't receive the email?",
|
||||||
|
"accountUnconfirmedResend": "Resend one",
|
||||||
|
"accountUnconfirmedResendSuccessful": "Email has been resent, you can resend it again in 60 minutes.",
|
||||||
|
"stickerPickerEmpty": "Sticker list is empty",
|
||||||
|
"stickerPickerEmptyHint": "To start using stickers, you need to add a sticker pack first.",
|
||||||
|
"goto": "Go to {}",
|
||||||
|
"accountContactMethods": "Contact Methods",
|
||||||
|
"accountContactMethodsDescription": "Manage your contact methods.",
|
||||||
|
"accountContactMethodsNameEmail": "Email address",
|
||||||
|
"accountContactMethodsNamePhone": "Phone number",
|
||||||
|
"accountContactMethodsNameAddress": "Address",
|
||||||
|
"accountContactMethodsPrimary": "Primary",
|
||||||
|
"accountContactMethodsVerified": "Verified",
|
||||||
|
"accountContactMethodsPublic": "Public",
|
||||||
|
"accountContactMethodsAdd": "Add Contact Method",
|
||||||
|
"accountContactMethodsEdit": "Edit Contact Method",
|
||||||
|
"accountContactMethodsAddDescription": "Add a new contact method.",
|
||||||
|
"fieldContactContent": "Contact method",
|
||||||
|
"accountContactMethodsPublicHint": "This contact method will be displayed publicly on your profile.",
|
||||||
|
"accountContactMethodsDelete": "Delete Contact Method",
|
||||||
|
"accountContactMethodsDeleteDescription": "Are you sure you want to delete contact method {}? This operation is irreversible.",
|
||||||
|
"postCommentAdd": "Write a comment",
|
||||||
|
"translate": "Translate",
|
||||||
|
"translating": "Translating…",
|
||||||
|
"translated": "Translated",
|
||||||
|
"settingsAutoTranslate": "Auto Translate",
|
||||||
|
"settingsAutoTranslateDescription": "Automatically translate text when viewing posts and messages.",
|
||||||
|
"trayMenuHide": "Hide",
|
||||||
|
"accountSettingsNotify": "Notify Settings",
|
||||||
|
"accountSettingsNotifyDescription": "Adjust the types of notifications you receive.",
|
||||||
|
"accountSettingsSecurity": "Security Settings",
|
||||||
|
"accountSettingsSecurityDescription": "Adjust your account security settings.",
|
||||||
|
"save": "Save",
|
||||||
|
"notificationTopicPostFeedback": "Post Feedback",
|
||||||
|
"notificationTopicPostReply": "Post Replies",
|
||||||
|
"notificationTopicPostSubscription": "Post Subscriptions",
|
||||||
|
"notificationTopicMessaging": "New Messages",
|
||||||
|
"notificationTopicMessagingCall": "Incoming Calls",
|
||||||
|
"notificationTopicGeneral": "General",
|
||||||
|
"authMaximumAuthSteps": "Maximum Authenticate Steps",
|
||||||
|
"authMaximumAuthStepsDescription": {
|
||||||
|
"one": "Maximum ask for {} step authenticate",
|
||||||
|
"other": "Maximum ask for {} steps authenticate"
|
||||||
|
},
|
||||||
|
"authAlwaysRisky": "Always Risky",
|
||||||
|
"authAlwaysRiskyDescription": "Always ask for the highest steps count of authentication when logging in.",
|
||||||
|
"chatUnjoined": "Unjoined Channel",
|
||||||
|
"chatUnjoinedDescription": "You haven't joined this channel, so you can't send messages either view messages in it.",
|
||||||
|
"chatUnjoinedPublicDescription": "Fortunately, this is a public channel, so you can join it as you want.",
|
||||||
|
"chatJoin": "Join the Channel",
|
||||||
|
"appInitStarting": "Starting",
|
||||||
|
"appInitNetwork": "Initializing Network",
|
||||||
|
"appInitUserdata": "Initializing User Data",
|
||||||
|
"appInitWebsocket": "Establishing Solar Link",
|
||||||
|
"appInitNotification": "Initializing Push Notifications",
|
||||||
|
"appInitKeyPair": "Initializing Key Pairs",
|
||||||
|
"appInitStickers": "Initializing Stickers",
|
||||||
|
"appInitUserDirectory": "Initializing User Directory",
|
||||||
|
"appInitRealm": "Initializing Realms",
|
||||||
|
"appInitChat": "Initializing Chat",
|
||||||
|
"appInitDone": "Completed",
|
||||||
|
"community": "Community",
|
||||||
|
"realmCommunity": "{}'s Community",
|
||||||
|
"postTotalCount": {
|
||||||
|
"one": "Total {} post",
|
||||||
|
"other": "Total {} posts"
|
||||||
|
},
|
||||||
|
"settingsHideBottomNav": "Hide Bottom Navigation",
|
||||||
|
"settingsHideBottomNavDescription": "Hide the bottom navigation bar, and show the navigation buttons in the drawer.",
|
||||||
|
"reCaptcha": "reCaptcha",
|
||||||
|
"friends": "Friends",
|
||||||
|
"friendsDescription": "Manage your friendships.",
|
||||||
|
"album": "Album",
|
||||||
|
"albumDescription": "View albums and manage attachments.",
|
||||||
|
"stickers": "Stickers",
|
||||||
|
"stickersDescription": "View sticker packs and manage stickers.",
|
||||||
|
"navBottomUnauthorizedCaption": "Or create an account",
|
||||||
|
"walletCurrencyGoldenShort": "GDP",
|
||||||
|
"walletCurrencyGolden": {
|
||||||
|
"one": "{} Golden Point",
|
||||||
|
"other": "{} Golden Points"
|
||||||
|
},
|
||||||
|
"walletTransactionTypeNormal": "Source Point",
|
||||||
|
"walletTransactionTypeGolden": "Golden Point",
|
||||||
|
"accountProgram": "Programs",
|
||||||
|
"accountProgramDescription": "Explore the available member programs.",
|
||||||
|
"accountProgramJoin": "Join Program",
|
||||||
|
"accountProgramJoinRequirements": "Requirements",
|
||||||
|
"accountProgramJoinPricing": "Pricing",
|
||||||
|
"accountProgramJoinPricingHint": "Billed every (30 days) month.",
|
||||||
|
"accountProgramLeaveHint": "After leaving the program, the source points will not be refunded.",
|
||||||
|
"accountProgramJoined": "Joined Program.",
|
||||||
|
"accountProgramAlreadyJoined": "Joined",
|
||||||
|
"accountProgramLeft": "Left Program.",
|
||||||
|
"leave": "Leave",
|
||||||
|
"attachmentFailedToLoadMedia": "Unable to load media file, please try again later. If this error occurs repeatedly, the source file may not exist or the network connection may be abnormal.",
|
||||||
|
"accountPunishments": "Punishments",
|
||||||
|
"accountPunishmentsDescription": "View your account's reputation status.",
|
||||||
|
"punishmentType0": "Strike",
|
||||||
|
"punishmentType1": "Limited",
|
||||||
|
"punishmentType2": "Banned",
|
||||||
|
"punishmentOverall": "Overall Status",
|
||||||
|
"punishmentStatusNormal": "All abilities normal",
|
||||||
|
"punishmentStatusWarned": "All abilities normal, but at least one strike is in effect",
|
||||||
|
"punishmentStatusLimited": "Some abilities limited, at least one limited punishment is in effect",
|
||||||
|
"punishmentStatusLimitedFully": "All abilities limited, at least one completely limited punishment is in effect",
|
||||||
|
"punishmentStatusBanned": "All services are terminated, banned",
|
||||||
|
"punishmentCreatedAt": "Applied since {}",
|
||||||
|
"punishmentExpiredAt": "Expired at {}",
|
||||||
|
"punishmentExpiredNever": "Never expired",
|
||||||
|
"punishmentModerator": "Moderator who made this punishment",
|
||||||
|
"punishmentMadeBySystem": "Made by auto-mod system",
|
||||||
|
"settingsAprilFoolFeatures": "April Fool Features",
|
||||||
|
"settingsAprilFoolFeaturesDescription": "Enable April Fool features during April Fool, this option will only be visible during April Fool.",
|
||||||
|
"settingsSoundEffects": "Sound Effects",
|
||||||
|
"settingsSoundEffectsDescription": "Enable the sound effects around the app.",
|
||||||
|
"settingsResetMemorizedWindowSize": "Reset Window Size",
|
||||||
|
"settingsResetMemorizedWindowSizeDescription": "Reset the memorized window size, and set it to the default size.",
|
||||||
|
"chatDirect": "Direct Messages",
|
||||||
|
"back": "Back",
|
||||||
|
"badgeProgramDeveloper": "Developer Program Member",
|
||||||
|
"badgeProgramStellar": "A Stellar",
|
||||||
|
"badgeProgramModerator": "Community Moderator",
|
||||||
|
"postEditedHint": "edited",
|
||||||
|
"splashScreenServer": "Server",
|
||||||
|
"splashScreenServerName": "Potato",
|
||||||
|
"splashScreenCaption": "Trying to establishing connection with HyperNet™"
|
||||||
|
}
|