Skip to content

Commit 55c22e9

Browse files
committed
minor fixes, test translations for Files,Settings
1 parent 1317088 commit 55c22e9

File tree

11 files changed

+774
-173
lines changed

11 files changed

+774
-173
lines changed

.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ indent_style = tab
1010
insert_final_newline = true
1111
trim_trailing_whitespace = true
1212

13+
[*.py]
14+
indent_style = space
15+
1316
[*.yml]
1417
indent_size = 2
1518
indent_style = space

.l10nignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
js/
22
vendor/
3+
.venv/
4+
venv/

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ register28:
6767
.PHONY: register
6868
register:
6969
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent --force || true
70-
docker exec master-nextcloud-1 rm -rf /tmp/ui_example_l10n && docker cp l10n master-nextcloud-1-1:/tmp/ui_example_l10n
70+
docker exec master-nextcloud-1 rm -rf /tmp/ui_example_l10n && docker cp l10n master-nextcloud-1:/tmp/ui_example_l10n
7171
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register ui_example manual_install --json-info \
7272
"{\"id\":\"ui_example\",\"name\":\"UI Example\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"port\":9035,\"scopes\":[],\"system_app\":0, \"translations_folder\":\"\/tmp\/ui_example_l10n\"}" \
7373
--force-scopes --wait-finish

l10n/uk.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,49 @@ OC.L10N.register(
22
"ui_example",
33
{
44
"UI example" : "Приклад UI",
5+
"Example of declarative settings" : "Приклад декларативних налаштувань",
6+
"These fields are rendered dynamically from declarative schema" : "Ці поля сгенеровані динамічно з декларавтиної схеми",
7+
"Select some option setting" : "Виберіть якусь опцію",
8+
"Select some multiple options" : "Виберіть якісь множинні опції",
9+
"Choose init status check background job interval" : "Виберіть інтервал фонової задачі перевірки статусу",
10+
"How often ExApp should check for initialization status" : "Як часто виконувати перевірку ініціалізації",
11+
"Each 40 minutes" : "Кожні 40 хвилин",
12+
"Each 60 minutes" : "Кожні 60 хвилин",
13+
"Each 120 minutes" : "Кожні 120 хвилин",
14+
"Each day" : "Кожен день",
15+
"Default text field" : "Звичайне текстове поле",
16+
"Set some simple text setting" : "Встановити простий текстовий параметр",
17+
"Enter text setting" : "Параметр email",
18+
"Email field" : "Поле email",
19+
"Set email config" : "Встановіть email конфугурацію",
20+
"Enter email" : "Введіть email",
21+
"Tel field" : "Поле телефону",
22+
"Set tel config" : "Вкажіть конфігурації телефону",
23+
"Enter your tel" : "Введіть ваш телефон",
24+
"Url (website) field" : "Посилання на веб-сайт",
25+
"Set url config" : "Встановіть конфігурацію посилання",
26+
"Enter url" : "Введіть посилання",
27+
"Number field" : "Введіть число",
28+
"Set number config" : "Опція число",
29+
"Enter number value" : "Введіть числову конфігурацію",
30+
"Password" : "Пароль",
31+
"Set some secure value setting" : "Встановіть захищене значення параметру",
32+
"Set secure value" : "Встановіть захищене значення",
33+
"Selection" : "Випадаючий список",
34+
"Toggle something" : "Перемикач",
35+
"Select checkbox option setting" : "Виберіть чекбокс",
36+
"Verify something if enabled" : "Верифікувати чи щось увімкнено",
37+
"Multiple checkbox toggles, describing one setting" : "Множинні чекбокс перемикачі, відповідаючих одному параметру",
38+
"Radio toggles, describing one setting like single select" : "Радіо перемикачі, відповідаючих одному параметру як одиночний select",
39+
"Select radio option setting" : "Налаштування одиночний перемикач",
40+
"Select single toggle" : "Одиночний перемикач",
41+
"First radio" : "Перший перемикач",
42+
"Second radio" : "Другий перемикач",
43+
"Third radio" : "Третій перемикач",
44+
"Test menu" : "Тестове меню",
545
"UI Example" : "Приклад UI",
646
"Example of displaying UI elements with l10n support" : "Приклад відображення UI елементів з підтримкою перекладів",
7-
"Simplest skeleton of the Nextcloud application written in Python" : "Найпростіший шаблон Nextcloud застосунку написаного за допомогою Python",
47+
"UI & Translations skeleton of the Nextcloud application written in Python" : "Найпростіший шаблон Nextcloud застосунку написаного за допомогою Python",
848
"Home page" : "Додому",
949
"Files page" : "Файли",
1050
"ExApp UI example" : "Приклад UI",

l10n/uk.json

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,48 @@
11
{ "translations": {
22
"UI example" : "Приклад UI",
3+
"Example of declarative settings" : "Приклад декларативних налаштувань",
4+
"These fields are rendered dynamically from declarative schema" : "Ці поля сгенеровані динамічно з декларавтиної схеми",
5+
"Select some option setting" : "Виберіть якусь опцію",
6+
"Select some multiple options" : "Виберіть якісь множинні опції",
7+
"Choose init status check background job interval" : "Виберіть інтервал фонової задачі перевірки статусу",
8+
"How often ExApp should check for initialization status" : "Як часто виконувати перевірку ініціалізації",
9+
"Each 40 minutes" : "Кожні 40 хвилин",
10+
"Each 60 minutes" : "Кожні 60 хвилин",
11+
"Each 120 minutes" : "Кожні 120 хвилин",
12+
"Each day" : "Кожен день",
13+
"Default text field" : "Звичайне текстове поле",
14+
"Set some simple text setting" : "Встановити простий текстовий параметр",
15+
"Enter text setting" : "Параметр email",
16+
"Email field" : "Поле email",
17+
"Set email config" : "Встановіть email конфугурацію",
18+
"Enter email" : "Введіть email",
19+
"Tel field" : "Поле телефону",
20+
"Set tel config" : "Вкажіть конфігурації телефону",
21+
"Enter your tel" : "Введіть ваш телефон",
22+
"Url (website) field" : "Посилання на веб-сайт",
23+
"Set url config" : "Встановіть конфігурацію посилання",
24+
"Enter url" : "Введіть посилання",
25+
"Number field" : "Введіть число",
26+
"Set number config" : "Опція число",
27+
"Enter number value" : "Введіть числову конфігурацію",
28+
"Password" : "Пароль",
29+
"Set some secure value setting" : "Встановіть захищене значення параметру",
30+
"Set secure value" : "Встановіть захищене значення",
31+
"Selection" : "Випадаючий список",
32+
"Toggle something" : "Перемикач",
33+
"Select checkbox option setting" : "Виберіть чекбокс",
34+
"Verify something if enabled" : "Верифікувати чи щось увімкнено",
35+
"Multiple checkbox toggles, describing one setting" : "Множинні чекбокс перемикачі, відповідаючих одному параметру",
36+
"Radio toggles, describing one setting like single select" : "Радіо перемикачі, відповідаючих одному параметру як одиночний select",
37+
"Select radio option setting" : "Налаштування одиночний перемикач",
38+
"Select single toggle" : "Одиночний перемикач",
39+
"First radio" : "Перший перемикач",
40+
"Second radio" : "Другий перемикач",
41+
"Third radio" : "Третій перемикач",
42+
"Test menu" : "Тестове меню",
343
"UI Example" : "Приклад UI",
444
"Example of displaying UI elements with l10n support" : "Приклад відображення UI елементів з підтримкою перекладів",
5-
"Simplest skeleton of the Nextcloud application written in Python" : "Найпростіший шаблон Nextcloud застосунку написаного за допомогою Python",
45+
"UI & Translations skeleton of the Nextcloud application written in Python" : "Найпростіший шаблон Nextcloud застосунку написаного за допомогою Python",
646
"Home page" : "Додому",
747
"Files page" : "Файли",
848
"ExApp UI example" : "Приклад UI",

lib/main.py

Lines changed: 60 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
import os
55
import random
66
from contextlib import asynccontextmanager
7+
from typing import Annotated
78

8-
from fastapi import FastAPI, responses
9+
from fastapi import FastAPI, responses, Header
910
from pydantic import BaseModel
1011

1112
from nc_py_api import NextcloudApp
@@ -16,23 +17,22 @@
1617
SettingsField,
1718
SettingsFieldType,
1819
SettingsForm,
20+
UiActionFileInfo
1921
)
2022

2123
import gettext
2224

2325
# ../locale/<lang>/LC_MESSAGES/<app_id>.(mo|po)
2426
localedir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "locale")
2527
locale.setlocale(locale.LC_ALL)
26-
# locale.bindtextdomain(os.getenv("APP_ID"), localedir) - do we need this? It does not work on macOS..
2728
my_l10n = gettext.translation(
28-
os.getenv("APP_ID"), localedir, fallback=True, languages=["en", "uk"]
29+
os.getenv("APP_ID"), localedir, fallback=True, languages=["en"] # English is always available and is the default
2930
)
3031
my_l10n.install()
3132

3233
_ = my_l10n.gettext
3334
_n = my_l10n.ngettext
3435

35-
3636
@asynccontextmanager
3737
async def lifespan(app: FastAPI):
3838
set_handlers(app, enabled_handler)
@@ -47,122 +47,122 @@ async def lifespan(app: FastAPI):
4747
id="settings_example",
4848
section_type="admin",
4949
section_id="ai_integration_team",
50-
title="Example of declarative settings",
51-
description="These fields are rendered dynamically from declarative schema",
50+
title=_("Example of declarative settings"),
51+
description=_("These fields are rendered dynamically from declarative schema"),
5252
fields=[
5353
SettingsField(
5454
id="field1",
5555
title="Multi-selection",
56-
description="Select some option setting",
56+
description=_("Select some option setting"),
5757
type=SettingsFieldType.MULTI_SELECT,
5858
default=["foo", "bar"],
59-
placeholder="Select some multiple options",
59+
placeholder=_("Select some multiple options"),
6060
options=["foo", "bar", "baz"],
6161
),
6262
SettingsField(
6363
id="some_real_setting",
64-
title="Choose init status check background job interval",
65-
description="How often ExApp should check for initialization status",
64+
title=_("Choose init status check background job interval"),
65+
description=_("How often ExApp should check for initialization status"),
6666
type=SettingsFieldType.RADIO,
6767
default="40m",
68-
placeholder="Choose init status check background job interval",
68+
placeholder=_("Choose init status check background job interval"),
6969
options={
70-
"Each 40 minutes": "40m",
71-
"Each 60 minutes": "60m",
72-
"Each 120 minutes": "120m",
73-
"Each day": f"{60 * 24}m",
70+
_("Each 40 minutes"): "40m",
71+
_("Each 60 minutes"): "60m",
72+
_("Each 120 minutes"): "120m",
73+
_("Each day"): f"{60 * 24}m",
7474
},
7575
),
7676
SettingsField(
7777
id="test_ex_app_field_1",
78-
title="Default text field",
79-
description="Set some simple text setting",
78+
title=_("Default text field"),
79+
description=_("Set some simple text setting"),
8080
type=SettingsFieldType.TEXT,
8181
default="foo",
82-
placeholder="Enter text setting",
82+
placeholder=_("Enter text setting"),
8383
),
8484
SettingsField(
8585
id="test_ex_app_field_1_1",
86-
title="Email field",
87-
description="Set email config",
86+
title=_("Email field"),
87+
description=_("Set email config"),
8888
type=SettingsFieldType.EMAIL,
8989
default="",
90-
placeholder="Enter email",
90+
placeholder=_("Enter email"),
9191
),
9292
SettingsField(
9393
id="test_ex_app_field_1_2",
94-
title="Tel field",
95-
description="Set tel config",
94+
title=_("Tel field"),
95+
description=_("Set tel config"),
9696
type=SettingsFieldType.TEL,
9797
default="",
98-
placeholder="Enter your tel",
98+
placeholder=_("Enter your tel"),
9999
),
100100
SettingsField(
101101
id="test_ex_app_field_1_3",
102-
title="Url (website) field",
103-
description="Set url config",
102+
title=_("Url (website) field"),
103+
description=_("Set url config"),
104104
type=SettingsFieldType.URL,
105105
default="",
106-
placeholder="Enter url",
106+
placeholder=_("Enter url"),
107107
),
108108
SettingsField(
109109
id="test_ex_app_field_1_4",
110-
title="Number field",
111-
description="Set number config",
110+
title=_("Number field"),
111+
description=_("Set number config"),
112112
type=SettingsFieldType.NUMBER,
113113
default=0,
114-
placeholder="Enter number value",
114+
placeholder=_("Enter number value"),
115115
),
116116
SettingsField(
117117
id="test_ex_app_field_2",
118-
title="Password",
119-
description="Set some secure value setting",
118+
title=_("Password"),
119+
description=_("Set some secure value setting"),
120120
type=SettingsFieldType.PASSWORD,
121121
default="",
122-
placeholder="Set secure value",
122+
placeholder=_("Set secure value"),
123123
),
124124
SettingsField(
125125
id="test_ex_app_field_3",
126-
title="Selection",
127-
description="Select some option setting",
126+
title=_("Selection"),
127+
description=_("Select some option setting"),
128128
type=SettingsFieldType.SELECT,
129129
default="foo",
130-
placeholder="Select some option setting",
130+
placeholder=_("Select some option setting"),
131131
options=["foo", "bar", "baz"],
132132
),
133133
SettingsField(
134134
id="test_ex_app_field_3",
135-
title="Selection",
136-
description="Select some option setting",
135+
title=_("Selection"),
136+
description=_("Select some option setting"),
137137
type=SettingsFieldType.SELECT,
138138
default="foo",
139-
placeholder="Select some option setting",
139+
placeholder=_("Select some option setting"),
140140
options=["foo", "bar", "baz"],
141141
),
142142
SettingsField(
143143
id="test_ex_app_field_4",
144-
title="Toggle something",
145-
description="Select checkbox option setting",
144+
title=_("Toggle something"),
145+
description=_("Select checkbox option setting"),
146146
type=SettingsFieldType.CHECKBOX,
147147
default=False,
148-
label="Verify something if enabled",
148+
label=_("Verify something if enabled"),
149149
),
150150
SettingsField(
151151
id="test_ex_app_field_5",
152-
title="Multiple checkbox toggles, describing one setting",
153-
description="Select checkbox option setting",
152+
title=_("Multiple checkbox toggles, describing one setting"),
153+
description=_("Select checkbox option setting"),
154154
type=SettingsFieldType.MULTI_CHECKBOX,
155155
default={"foo": True, "bar": True},
156156
options={"Foo": "foo", "Bar": "bar", "Baz": "baz", "Qux": "qux"},
157157
),
158158
SettingsField(
159159
id="test_ex_app_field_6",
160-
title="Radio toggles, describing one setting like single select",
161-
description="Select radio option setting",
160+
title=_("Radio toggles, describing one setting like single select"),
161+
description=_("Select radio option setting"),
162162
type=SettingsFieldType.RADIO,
163-
label="Select single toggle",
163+
label=_("Select single toggle"),
164164
default="foo",
165-
options={"First radio": "foo", "Second radio": "bar", "Third radie": "baz"},
165+
options={_("First radio"): "foo", _("Second radio"): "bar", _("Third radio"): "baz"},
166166
),
167167
],
168168
)
@@ -179,6 +179,8 @@ def enabled_handler(enabled: bool, nc: NextcloudApp) -> str:
179179
)
180180
nc.ui.resources.set_script("top_menu", "first_menu", "js/ui_example-main")
181181
nc.ui.top_menu.register("first_menu", "UI example", "img/app.svg")
182+
nc.ui.files_dropdown_menu.register("test_menu", _("Test menu"), "/test_menu", mime="image/jpeg", icon="img/app-dark.svg")
183+
182184
if nc.srv_version["major"] >= 29:
183185
nc.ui.settings.register_form(SETTINGS_EXAMPLE)
184186
else:
@@ -187,6 +189,7 @@ def enabled_handler(enabled: bool, nc: NextcloudApp) -> str:
187189
)
188190
nc.ui.resources.delete_script("top_menu", "first_menu", "js/ui_example-main")
189191
nc.ui.top_menu.unregister("first_menu")
192+
nc.ui.files_dropdown_menu.unregister("test_menu")
190193
return ""
191194

192195

@@ -203,6 +206,15 @@ async def verify_initial_value(
203206
content={"initial_value": str(random.randint(0, 100))}, status_code=200
204207
)
205208

209+
@APP.post("/test_menu")
210+
async def test_menu_handler(
211+
file: UiActionFileInfo,
212+
accept_language: Annotated[str | None, Header()] = None
213+
):
214+
print(f'File: {file}')
215+
print(f'Accept-Language: {accept_language}')
216+
return responses.Response()
217+
206218

207219
class FileInfo(BaseModel):
208220
getlastmodified: str
3.54 KB
Binary file not shown.

0 commit comments

Comments
 (0)