Compare commits

...
28 Commits
Author SHA1 Message Date
Lucas.Xu 3db9024a2d chore: release 0.3.1 (#3326)
* chore: update editor version

* fix: export name (with CJK) doesn't match the document name

* chore: bump version 0.3.1
2023-09-04 17:28:19 +08:00
Nathan.fooo a821740469 refactor: remove http server ref (#3327) 2023-09-04 15:50:38 +08:00
Lucas.Xu af0ae2e375 feat: enable heading in the table plugin (#3325) 2023-09-04 13:35:11 +08:00
Nils Jacobsen 7d6fa0b159 chore: update inlang.config.js and language files 2023-09-04 13:33:56 +08:00
Richard Shiueandnathan b73a34ed94 refactor: remove date cell persistence (#3095)
* refactor: remove date cell persistence

* refactor: use i64 rather than String in DateChangeset

* chore: code cleanup

* fix: tauri build

---------

Co-authored-by: nathan <nathan@appflowy.io>
2023-09-02 11:50:16 +08:00
Richard Shiue f3aaff77b9 chore: per-view field visibility UI (#3296)
* chore: default field settings if not exist

* chore: field settings listeners and services

* chore: don't need to updateFieldInfos

* feat: per-view field visibilty UI

* fix: remove unresolved imports
2023-09-02 00:42:46 +08:00
Vedant PandeyandRichard Shiue 9b7ff375b2 fix: trigger option selection on tap down (#2915)
* fix: trigger option selection on tap down

* chore: add TODO comment

---------

Co-authored-by: Richard Shiue <71320345+richardshiue@users.noreply.github.com>
2023-09-01 22:58:21 +08:00
Richard Shiueandnathan 18498c0479 feat: field settings application domain (#3284)
* chore: default field settings if not exist

* chore: field settings listeners and services

* chore: don't need to updateFieldInfos

* chore: load default field settings if none found

* chore: update collab ref

* chore: fix remidner compile errors

* fix: fix tests

* chore: update tauri project setting

---------

Co-authored-by: nathan <nathan@appflowy.io>
2023-09-01 22:40:17 +08:00
Nathan.fooo c652c32575 feat File storage (#3306)
* refactor: file upload

* refactor: support upload plan

* test: add tests
2023-09-01 22:27:29 +08:00
Mohammad Zolfaghari df8642d446 feat: support table plugin (#3280) 2023-09-01 14:45:21 +08:00
Nathan.fooo abb6eff23d fix: disable sync if keys aren't provided (#3304) 2023-09-01 11:32:45 +08:00
Nathan.fooo 3b4f8e53a2 feat: storage file (#3303) 2023-08-31 16:40:40 +08:00
Nathan.fooo 4847b8b114 chore: enable discord and github login (#3293) 2023-08-31 15:45:01 +08:00
Lucas.Xu e8f124b97c feat: support editing name when creating page (#3297) 2023-08-30 22:16:12 +08:00
Lucas.Xu f73d59fb57 feat: support text align and block align (#3292)
* feat: support text align and block align

* test: add test
2023-08-30 17:21:32 +08:00
Nathan.fooo 897d7980f6 chore: remove jwt secret env variable (#3291) 2023-08-30 11:51:33 +08:00
Mayur MahajanandLucas.Xu b88aed887a fix: paste multiple lines in codeblock (#3151)
* fix: paste multiple lines in codeblock

* fix: works with non collapsed selection

* chore: localize code block

* test: multiline paste in codeblock

* chore: remove unused import

* fix: only hanlde code block paste command if all the selected nodes are code block

---------

Co-authored-by: Lucas.Xu <lucas.xu@appflowy.io>
2023-08-30 09:58:56 +08:00
Alex Wallen 4e863bc87f feat: add hover color to question bubble like mockup (#3222) 2023-08-29 21:03:58 +02:00
nathan 507554a596 chore: only show email if supabase is enabled 2023-08-29 09:52:41 +08:00
Nathan.fooo 0806436c19 chore: share database via csv (#3285)
* chore: share database via csv

* fix: flutter test
2023-08-28 23:20:56 +08:00
Nathan.fooo 1205f0ebf7 chore: enable edit user email (#3286) 2023-08-28 21:00:55 +08:00
Aryan Arora 26e56194ea fix: nightmode support for no recents text on the emoji menu (#3239) 2023-08-28 17:09:20 +08:00
Nathan.fooo 4e67282f2b feat: Data sync on signup (#3283)
* chore: sync all data

* chore: sync database row and document in the row

* chore: sync inline view id

* chore: sync row and document in row

* fix: tests

* fix: migrate document in row

* chore: retry when create collab fail

* fix: invalid secret cause rerun application

* chore: fix clippy warnnings
2023-08-28 13:28:24 +08:00
Lucas.Xu 41ec2d992e feat: improve CJK IME support (#3278) 2023-08-28 10:58:26 +08:00
Richard Shiue f0e4f3db61 chore: per-view field settings (#3199)
* chore: field-setting entities-events-notifications

* chore: update field settings

* chore: add tests

* chore: add docs

* chore: use an enum for field visibility

* chore: clippy warnings

* fix: deps fields

* chore: collab merge main

* chore: collab ref

* test: fix tests

* fix: tauri bump collab rev
2023-08-27 22:31:32 +08:00
Lucas.Xu 6634a0ecb3 chore: update supabase version and setup new deeplink for linux (#3272) 2023-08-25 18:06:23 +08:00
Lucas.Xu 255f30590f feat: add custom context menu items for copy, cut, and paste commands 2023-08-24 22:23:50 +08:00
Nathan.fooo 1ba7224088 docs: improve documentation (#3265) 2023-08-24 14:00:34 +08:00
257 changed files with 13417 additions and 7080 deletions

No files matched your search

+16
View File
@@ -1,5 +1,21 @@
# Release Notes
## Version 0.3.1 - 09/04/2023
### New Features
- Improve CJK (Chinese, Japanese, Korean) input method support.
- Share a database in CSV format.
- Support for aligning the block component with the toolbar.
- Support for editing name when creating a new page.
- Support for inserting a table in the document page.
- Database views allow for independent field visibility toggling.
### Bug fixes
- Paste multiple lines in code block.
- Some UI issues
## Version 0.3.0 - 08/22/2023
### New Features
+1 -1
View File
@@ -24,7 +24,7 @@ CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true
CARGO_MAKE_CRATE_FS_NAME = "dart_ffi"
CARGO_MAKE_CRATE_NAME = "dart-ffi"
LIB_NAME = "dart_ffi"
CURRENT_APP_VERSION = "0.3.0"
CURRENT_APP_VERSION = "0.3.1"
FLUTTER_DESKTOP_FEATURES = "dart,rev-sqlite"
PRODUCT_NAME = "AppFlowy"
# CRATE_TYPE: https://doc.rust-lang.org/reference/linkage.html
@@ -0,0 +1,55 @@
import 'package:appflowy/plugins/database_view/grid/presentation/grid_page.dart';
import 'package:appflowy/plugins/database_view/tar_bar/tar_bar_add_button.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pbenum.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'util/database_test_op.dart';
import 'util/util.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('database field settings', () {
testWidgets('field visibility', (tester) async {
await tester.initializeAppFlowy();
await tester.tapGoButton();
await tester.createNewPageWithName(layout: ViewLayoutPB.Grid);
await tester.tapCreateLinkedDatabaseViewButton(AddButtonAction.grid);
// create a field
await tester.scrollToRight(find.byType(GridPage));
await tester.tapNewPropertyButton();
await tester.renameField('New field 1');
await tester.dismissFieldEditor();
// hide the field
await tester.tapGridFieldWithName('New field 1');
await tester.tapHidePropertyButton();
await tester.noFieldWithName('New field 1');
// go back to inline database view, expect field to be shown
await tester.tapTabBarLinkedViewByViewName('Untitled');
await tester.findFieldWithName('New field 1');
// go back to linked database view, expect field to be hidden
await tester.tapTabBarLinkedViewByViewName('grid');
await tester.noFieldWithName('New field 1');
// use the settings button to show the field
await tester.tapDatabaseSettingButton();
await tester.tapViewPropertiesButton();
await tester.tapViewTogglePropertyVisibilityButtonByName('New field 1');
await tester.dismissFieldEditor();
await tester.findFieldWithName('New field 1');
// open first row in popup then hide the field
await tester.openFirstRowDetailPage();
await tester.tapGridFieldWithNameInRowDetailPage('New field 1');
await tester.tapHidePropertyButtonInFieldEditor();
await tester.dismissRowDetailPage();
await tester.noFieldWithName('New field 1');
});
});
}
@@ -106,26 +106,6 @@ void main() {
await tester.pumpAndSettle();
});
testWidgets('hide field', (tester) async {
await tester.initializeAppFlowy();
await tester.tapGoButton();
await tester.createNewPageWithName(layout: ViewLayoutPB.Grid);
// create a field
await tester.scrollToRight(find.byType(GridPage));
await tester.tapNewPropertyButton();
await tester.renameField('New field 1');
await tester.dismissFieldEditor();
// Delete the field
await tester.tapGridFieldWithName('New field 1');
await tester.tapHidePropertyButton();
await tester.noFieldWithName('New field 1');
await tester.pumpAndSettle();
});
testWidgets('create checklist field ', (tester) async {
await tester.initializeAppFlowy();
await tester.tapGoButton();
@@ -0,0 +1,46 @@
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import '../util/util.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('document alignment', () {
testWidgets('edit alignment in toolbar', (tester) async {
await tester.initializeAppFlowy();
await tester.tapGoButton();
final selection = Selection.single(
path: [0],
startOffset: 0,
endOffset: 1,
);
// click the first line of the readme
await tester.editor.tapLineOfEditorAt(0);
await tester.editor.updateSelection(selection);
await tester.pumpAndSettle();
// click the align center
await tester.tapButtonWithFlowySvgData(FlowySvgs.toolbar_align_left_s);
await tester.tapButtonWithFlowySvgData(FlowySvgs.toolbar_align_center_s);
// expect to see the align center
final editorState = tester.editor.getCurrentEditorState();
final first = editorState.getNodeAtPath([0])!;
expect(first.attributes[blockComponentAlign], 'center');
// click the align right
await tester.tapButtonWithFlowySvgData(FlowySvgs.toolbar_align_center_s);
await tester.tapButtonWithFlowySvgData(FlowySvgs.toolbar_align_right_s);
expect(first.attributes[blockComponentAlign], 'right');
// click the align left
await tester.tapButtonWithFlowySvgData(FlowySvgs.toolbar_align_right_s);
await tester.tapButtonWithFlowySvgData(FlowySvgs.toolbar_align_left_s);
expect(first.attributes[blockComponentAlign], 'left');
});
});
}
@@ -0,0 +1,60 @@
import 'dart:io';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import '../util/util.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('paste in codeblock', () {
testWidgets('paste multiple lines in codeblock', (tester) async {
await tester.initializeAppFlowy();
await tester.tapGoButton();
// create a new document
await tester.createNewPageWithName();
// mock the clipboard
const lines = 3;
final text = List.generate(lines, (index) => 'line $index').join('\n');
AppFlowyClipboard.mockSetData(
AppFlowyClipboardData(
text: text,
),
);
await insertCodeBlockInDocument(tester);
// paste the text
await tester.simulateKeyEvent(
LogicalKeyboardKey.keyV,
isControlPressed: Platform.isLinux || Platform.isWindows,
isMetaPressed: Platform.isMacOS,
);
await tester.pumpAndSettle();
final editorState = tester.editor.getCurrentEditorState();
expect(editorState.document.root.children.length, 1);
expect(
editorState.getNodeAtPath([0])!.delta!.toPlainText(),
text,
);
});
});
}
/// Inserts an codeBlock in the document
Future<void> insertCodeBlockInDocument(WidgetTester tester) async {
// open the actions menu and insert the codeBlock
await tester.editor.showSlashMenu();
await tester.editor.tapSlashMenuItemWithName(
LocaleKeys.document_selectionMenu_codeBlock.tr(),
);
await tester.pumpAndSettle();
}
@@ -226,6 +226,30 @@ void main() {
);
},
);
// https://github.com/AppFlowy-IO/AppFlowy/issues/3263
testWidgets(
'paste the image from clipboard when html and image are both available',
(tester) async {
const html =
'''<meta charset='utf-8'><img src="https://user-images.githubusercontent.com/9403740/262918875-603f4adb-58dd-49b5-8201-341d354935fd.png" alt="image"/>''';
final image = await rootBundle.load('assets/test/images/sample.png');
final bytes = image.buffer.asUint8List();
await tester.pasteContent(
html: html,
image: ('png', bytes),
(editorState) {
expect(editorState.document.root.children.length, 2);
final node = editorState.getNodeAtPath([0])!;
expect(node.type, ImageBlockKeys.type);
expect(
node.attributes[ImageBlockKeys.url],
'https://user-images.githubusercontent.com/9403740/262918875-603f4adb-58dd-49b5-8201-341d354935fd.png',
);
},
);
},
);
}
extension on WidgetTester {
@@ -1,5 +1,8 @@
import 'package:integration_test/integration_test.dart';
import 'document_alignment_test.dart' as document_alignment_test;
import 'document_codeblock_paste_test.dart' as document_codeblock_paste_test;
import 'document_copy_and_paste_test.dart' as document_copy_and_paste_test;
import 'document_create_and_delete_test.dart'
as document_create_and_delete_test;
import 'document_with_cover_image_test.dart' as document_with_cover_image_test;
@@ -7,10 +10,9 @@ import 'document_with_database_test.dart' as document_with_database_test;
import 'document_with_inline_math_equation_test.dart'
as document_with_inline_math_equation_test;
import 'document_with_inline_page_test.dart' as document_with_inline_page_test;
import 'document_with_outline_block_test.dart' as document_with_outline_block;
import 'document_with_toggle_list_test.dart' as document_with_toggle_list_test;
import 'edit_document_test.dart' as document_edit_test;
import 'document_with_outline_block_test.dart' as document_with_outline_block;
import 'document_copy_and_paste_test.dart' as document_copy_and_paste_test;
void startTesting() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
@@ -25,4 +27,6 @@ void startTesting() {
document_with_outline_block.main();
document_with_toggle_list_test.main();
document_copy_and_paste_test.main();
document_codeblock_paste_test.main();
document_alignment_test.main();
}
@@ -4,6 +4,7 @@ import 'package:integration_test/integration_test.dart';
import 'database_calendar_test.dart' as database_calendar_test;
import 'database_cell_test.dart' as database_cell_test;
import 'database_field_test.dart' as database_field_test;
import 'database_field_settings_test.dart' as database_field_settings_test;
import 'database_filter_test.dart' as database_filter_test;
import 'database_row_page_test.dart' as database_row_page_test;
import 'database_row_test.dart' as database_row_test;
@@ -47,6 +48,7 @@ void main() {
// Database integration tests
database_cell_test.main();
database_field_test.main();
database_field_settings_test.main();
database_share_test.main();
database_row_page_test.main();
database_row_test.main();
@@ -1,14 +1,14 @@
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/share/share_button.dart';
import 'package:appflowy/user/presentation/skip_log_in_screen.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/sidebar_new_page_button.dart';
import 'package:appflowy/workspace/presentation/home/menu/view/draggable_view_item.dart';
import 'package:appflowy/workspace/presentation/home/menu/view/view_action_type.dart';
import 'package:appflowy/workspace/presentation/home/menu/view/view_add_button.dart';
import 'package:appflowy/workspace/presentation/home/menu/view/view_more_action_button.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/share/share_button.dart';
import 'package:appflowy/user/presentation/skip_log_in_screen.dart';
import 'package:appflowy/workspace/presentation/settings/widgets/settings_language_view.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/widget/buttons/primary_button.dart';
@@ -279,6 +279,7 @@ extension CommonOperations on WidgetTester {
// create a new page
await tapAddViewButton(name: parentName ?? gettingStarted);
await tapButtonWithName(layout.menuName);
await tapOKButton();
await pumpAndSettle();
// hover on it and change it's name
@@ -409,6 +410,14 @@ extension CommonOperations on WidgetTester {
await gesture.up();
await pumpAndSettle();
}
// tap the button with [FlowySvgData]
Future<void> tapButtonWithFlowySvgData(FlowySvgData svg) async {
final button = find.byWidgetPredicate(
(widget) => widget is FlowySvg && widget.svg.path == svg.path,
);
await tapButton(button);
}
}
extension ViewLayoutPBTest on ViewLayoutPB {
@@ -35,6 +35,7 @@ import 'package:appflowy/plugins/database_view/grid/presentation/widgets/toolbar
import 'package:appflowy/plugins/database_view/tar_bar/tab_bar_header.dart';
import 'package:appflowy/plugins/database_view/tar_bar/tar_bar_add_button.dart';
import 'package:appflowy/plugins/database_view/widgets/database_layout_ext.dart';
import 'package:appflowy/plugins/database_view/widgets/field/grid_property.dart';
import 'package:appflowy/plugins/database_view/widgets/row/accessory/cell_accessory.dart';
import 'package:appflowy/plugins/database_view/widgets/row/cells/cells.dart';
import 'package:appflowy/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart';
@@ -503,6 +504,18 @@ extension AppFlowyDatabaseTest on WidgetTester {
await tapButton(findDateCell);
}
Future<void> tapGridFieldWithNameInRowDetailPage(String name) async {
final fields = find.byWidgetPredicate(
(widget) => widget is FieldCellButton && widget.field.name == name,
);
final field = find.descendant(
of: find.byType(RowDetailPage),
matching: fields,
);
await tapButton(field);
await pumpAndSettle();
}
Future<void> duplicateRowInRowDetailPage() async {
final duplicateButton = find.byType(RowDetailPageDuplicateButton);
await tapButton(duplicateButton);
@@ -585,6 +598,11 @@ extension AppFlowyDatabaseTest on WidgetTester {
await tapButton(field);
}
Future<void> tapHidePropertyButtonInFieldEditor() async {
final button = find.byType(HideFieldButton);
await tapButton(button);
}
Future<void> tapRowDetailPageCreatePropertyButton() async {
await tapButton(find.byType(CreateRowFieldButton));
}
@@ -925,6 +943,23 @@ extension AppFlowyDatabaseTest on WidgetTester {
await tapButton(button);
}
/// Should call [tapDatabaseSettingButton] first.
Future<void> tapViewPropertiesButton() async {
final findSettingItem = find.byType(DatabaseSettingItem);
final findLayoutButton = find.byWidgetPredicate(
(widget) =>
widget is FlowyText &&
widget.text == DatabaseSettingAction.showProperties.title(),
);
final button = find.descendant(
of: findSettingItem,
matching: findLayoutButton,
);
await tapButton(button);
}
/// Should call [tapDatabaseSettingButton] first.
Future<void> tapDatabaseLayoutButton() async {
final findSettingItem = find.byType(DatabaseSettingItem);
@@ -1111,6 +1146,11 @@ extension AppFlowyDatabaseTest on WidgetTester {
await tapButton(findCreateButton);
}
Future<void> tapTabBarLinkedViewByViewName(String name) async {
final viewButton = findTabBarLinkViewByViewName(name);
await tapButton(viewButton);
}
Finder findTabBarLinkViewByViewLayout(ViewLayoutPB layout) {
return find.byWidgetPredicate(
(widget) => widget is TabBarItemButton && widget.view.layout == layout,
@@ -1212,6 +1252,18 @@ extension AppFlowyDatabaseTest on WidgetTester {
Future<void> tapAddSelectOptionButton() async {
await tapButtonWithName(LocaleKeys.grid_field_addSelectOption.tr());
}
Future<void> tapViewTogglePropertyVisibilityButtonByName(
String fieldName,
) async {
final field = find.byWidgetPredicate(
(widget) =>
widget is GridPropertyCell && widget.fieldInfo.name == fieldName,
);
final toggleVisibilityButton =
find.descendant(of: field, matching: find.byType(FlowyIconButton));
await tapButton(toggleVisibilityButton);
}
}
Finder finderForDatabaseLayoutType(DatabaseLayoutPB layout) {
+1 -10
View File
@@ -29,21 +29,12 @@ abstract class Env {
defaultValue: '',
)
static final String supabaseAnonKey = _Env.supabaseAnonKey;
@EnviedField(
obfuscate: true,
varName: 'SUPABASE_JWT_SECRET',
defaultValue: '',
)
static final String supabaseJwtSecret = _Env.supabaseJwtSecret;
}
bool get isSupabaseEnabled {
// Only enable supabase in release and develop mode.
if (integrationMode().isRelease || integrationMode().isDevelop) {
return Env.supabaseUrl.isNotEmpty &&
Env.supabaseAnonKey.isNotEmpty &&
Env.supabaseJwtSecret.isNotEmpty;
return Env.supabaseUrl.isNotEmpty && Env.supabaseAnonKey.isNotEmpty;
} else {
return false;
}
@@ -13,7 +13,7 @@ typedef NumberCellController = CellController<String, String>;
typedef SelectOptionCellController
= CellController<SelectOptionCellDataPB, String>;
typedef ChecklistCellController = CellController<ChecklistCellDataPB, String>;
typedef DateCellController = CellController<DateCellDataPB, DateCellData>;
typedef DateCellController = CellController<DateCellDataPB, String>;
typedef URLCellController = CellController<URLCellDataPB, String>;
class CellControllerBuilder {
@@ -54,7 +54,7 @@ class CellControllerBuilder {
cellCache: _cellCache,
cellDataLoader: cellDataLoader,
cellDataPersistence:
DateCellDataPersistence(cellContext: _cellContext),
TextCellDataPersistence(cellContext: _cellContext),
);
case FieldType.Number:
final cellDataLoader = CellDataLoader(
@@ -1,7 +1,7 @@
part of 'cell_service.dart';
/// Save the cell data to disk
/// You can extend this class to do custom operations. For example, the DateCellDataPersistence.
/// You can extend this class to do custom operations.
abstract class CellDataPersistence<D> {
Future<Option<FlowyError>> save(D data);
}
@@ -28,51 +28,3 @@ class TextCellDataPersistence implements CellDataPersistence<String> {
});
}
}
@freezed
class DateCellData with _$DateCellData {
const factory DateCellData({
DateTime? dateTime,
String? time,
required bool includeTime,
bool? clearFlag,
}) = _DateCellData;
}
class DateCellDataPersistence implements CellDataPersistence<DateCellData> {
final DatabaseCellContext cellContext;
DateCellDataPersistence({
required this.cellContext,
});
@override
Future<Option<FlowyError>> save(DateCellData data) {
final payload = DateChangesetPB.create()
..cellId = _makeCellPath(cellContext);
if (data.dateTime != null) {
final date = (data.dateTime!.millisecondsSinceEpoch ~/ 1000).toString();
payload.date = date;
}
if (data.time != null) {
payload.time = data.time!;
}
if (data.clearFlag != null) {
payload.clearFlag = data.clearFlag!;
}
payload.includeTime = data.includeTime;
return DatabaseEventUpdateDateCell(payload).send().then((result) {
return result.fold(
(l) => none(),
(err) => Some(err),
);
});
}
}
CellIdPB _makeCellPath(DatabaseCellContext cellId) {
return CellIdPB.create()
..viewId = cellId.viewId
..fieldId = cellId.fieldId
..rowId = cellId.rowId;
}
@@ -0,0 +1,47 @@
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/cell_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:fixnum/fixnum.dart';
final class DateCellBackendService {
final CellIdPB cellId;
DateCellBackendService({
required String viewId,
required String fieldId,
required String rowId,
}) : cellId = CellIdPB.create()
..viewId = viewId
..fieldId = fieldId
..rowId = rowId;
Future<Either<Unit, FlowyError>> update({
DateTime? date,
String? time,
required includeTime,
}) {
final payload = DateChangesetPB.create()
..cellId = cellId
..includeTime = includeTime;
if (date != null) {
final dateTimestamp = date.millisecondsSinceEpoch ~/ 1000;
payload.date = Int64(dateTimestamp);
}
if (time != null) {
payload.time = time;
}
return DatabaseEventUpdateDateCell(payload).send();
}
Future<Either<Unit, FlowyError>> clear() {
final payload = DateChangesetPB.create()
..cellId = cellId
..clearFlag = true;
return DatabaseEventUpdateDateCell(payload).send();
}
}
@@ -1,5 +1,7 @@
import 'package:appflowy/plugins/database_view/application/field_settings/field_settings_service.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'field_service.dart';
@@ -8,13 +10,18 @@ part 'field_action_sheet_bloc.freezed.dart';
class FieldActionSheetBloc
extends Bloc<FieldActionSheetEvent, FieldActionSheetState> {
final String fieldId;
final FieldBackendService fieldService;
final FieldSettingsBackendService fieldSettingsService;
FieldActionSheetBloc({required FieldContext fieldCellContext})
: fieldService = FieldBackendService(
: fieldId = fieldCellContext.field.id,
fieldService = FieldBackendService(
viewId: fieldCellContext.viewId,
fieldId: fieldCellContext.field.id,
),
fieldSettingsService =
FieldSettingsBackendService(viewId: fieldCellContext.viewId),
super(
FieldActionSheetState.initial(
TypeOptionPB.create()..field_2 = fieldCellContext.field,
@@ -31,14 +38,20 @@ class FieldActionSheetBloc
);
},
hideField: (_HideField value) async {
final result = await fieldService.updateField(visibility: false);
final result = await fieldSettingsService.updateFieldSettings(
fieldId: fieldId,
fieldVisibility: FieldVisibility.AlwaysHidden,
);
result.fold(
(l) => null,
(err) => Log.error(err),
);
},
showField: (_ShowField value) async {
final result = await fieldService.updateField(visibility: true);
final result = await fieldSettingsService.updateFieldSettings(
fieldId: fieldId,
fieldVisibility: FieldVisibility.AlwaysShown,
);
result.fold(
(l) => null,
(err) => Log.error(err),
@@ -1,24 +1,27 @@
import 'dart:collection';
import 'package:appflowy_backend/protobuf/flowy-database2/filter_changeset.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/sort_entities.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy/plugins/database_view/application/database_view_service.dart';
import 'package:appflowy/plugins/database_view/application/field_settings/field_settings_listener.dart';
import 'package:appflowy/plugins/database_view/application/field_settings/field_settings_service.dart';
import 'package:appflowy/plugins/database_view/application/filter/filter_listener.dart';
import 'package:appflowy/plugins/database_view/application/filter/filter_service.dart';
import 'package:appflowy/plugins/database_view/application/row/row_cache.dart';
import 'package:appflowy/plugins/database_view/application/setting/setting_listener.dart';
import 'package:appflowy/plugins/database_view/application/sort/sort_listener.dart';
import 'package:appflowy/plugins/database_view/application/sort/sort_service.dart';
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart';
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/sort/sort_info.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/filter_changeset.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/group.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/setting_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/sort_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/util.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:collection/collection.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/foundation.dart';
import '../../grid/presentation/widgets/filter/filter_info.dart';
import '../../grid/presentation/widgets/sort/sort_info.dart';
import '../database_view_service.dart';
import '../filter/filter_listener.dart';
import '../filter/filter_service.dart';
import '../row/row_cache.dart';
import '../setting/setting_listener.dart';
import '../setting/setting_service.dart';
import '../sort/sort_listener.dart';
import '../sort/sort_service.dart';
import 'field_info.dart';
import 'field_listener.dart';
@@ -72,20 +75,23 @@ typedef OnReceiveUpdateFields = void Function(List<FieldInfo>);
typedef OnReceiveFields = void Function(List<FieldInfo>);
typedef OnReceiveFilters = void Function(List<FilterInfo>);
typedef OnReceiveSorts = void Function(List<SortInfo>);
typedef OnReceiveFieldSettings = void Function(List<FieldInfo>);
class FieldController {
final String viewId;
// Listeners
final FieldsListener _fieldListener;
final DatabaseSettingListener _settingListener;
final FiltersListener _filtersListener;
final SortsListener _sortsListener;
final FieldSettingsListener _fieldSettingsListener;
// FFI services
final DatabaseViewBackendService _databaseViewBackendSvc;
final SettingBackendService _settingBackendSvc;
final FilterBackendService _filterBackendSvc;
final SortBackendService _sortBackendSvc;
final FieldSettingsBackendService _fieldSettingsBackendSvc;
bool _isDisposed = false;
@@ -97,18 +103,17 @@ class FieldController {
final Map<OnReceiveUpdateFields, void Function(List<FieldInfo>)>
_updatedFieldCallbacks = {};
// Group callbacks
final Map<String, GroupSettingPB> _groupConfigurationByFieldId = {};
// Filter callbacks
final Map<OnReceiveFilters, VoidCallback> _filterCallbacks = {};
_GridFilterNotifier? _filterNotifier = _GridFilterNotifier();
final Map<String, FilterPB> _filterPBByFieldId = {};
// Sort callbacks
final Map<OnReceiveSorts, VoidCallback> _sortCallbacks = {};
_GridSortNotifier? _sortNotifier = _GridSortNotifier();
final Map<String, SortPB> _sortPBByFieldId = {};
// Database settings temporary storage
final Map<String, GroupSettingPB> _groupConfigurationByFieldId = {};
final List<FieldSettingsPB> _fieldSettings = [];
// Getters
List<FieldInfo> get fieldInfos => [..._fieldNotifier.fieldInfos];
@@ -116,39 +121,28 @@ class FieldController {
List<SortInfo> get sortInfos => [..._sortNotifier?.sorts ?? []];
FieldInfo? getField(String fieldId) {
final fields = _fieldNotifier.fieldInfos
.where((element) => element.id == fieldId)
.toList();
if (fields.isEmpty) {
return null;
}
assert(fields.length == 1);
return fields.first;
return _fieldNotifier.fieldInfos
.firstWhereOrNull((element) => element.id == fieldId);
}
FilterInfo? getFilter(String filterId) {
final filters = _filterNotifier?.filters
.where((element) => element.filter.id == filterId)
.toList() ??
[];
if (filters.isEmpty) {
return null;
}
assert(filters.length == 1);
return filters.first;
FilterInfo? getFilterByFilterId(String filterId) {
return _filterNotifier?.filters
.firstWhereOrNull((element) => element.filterId == filterId);
}
SortInfo? getSort(String sortId) {
final sorts = _sortNotifier?.sorts
.where((element) => element.sortId == sortId)
.toList() ??
[];
if (sorts.isEmpty) {
return null;
}
assert(sorts.length == 1);
return sorts.first;
FilterInfo? getFilterByFieldId(String fieldId) {
return _filterNotifier?.filters
.firstWhereOrNull((element) => element.fieldId == fieldId);
}
SortInfo? getSortBySortId(String sortId) {
return _sortNotifier?.sorts
.firstWhereOrNull((element) => element.sortId == sortId);
}
SortInfo? getSortByFieldId(String fieldId) {
return _sortNotifier?.sorts
.firstWhereOrNull((element) => element.fieldId == fieldId);
}
FieldController({required this.viewId})
@@ -159,34 +153,18 @@ class FieldController {
_databaseViewBackendSvc = DatabaseViewBackendService(viewId: viewId),
_sortBackendSvc = SortBackendService(viewId: viewId),
_sortsListener = SortsListener(viewId: viewId),
_settingBackendSvc = SettingBackendService(viewId: viewId) {
//Listen on field's changes
_fieldSettingsListener = FieldSettingsListener(viewId: viewId),
_fieldSettingsBackendSvc = FieldSettingsBackendService(viewId: viewId) {
// Start listeners
_listenOnFieldChanges();
//Listen on setting changes
_listenOnSettingChanges();
//Listen on the filter changes
_listenOnFilterChanges();
//Listen on the sort changes
_listenOnSortChanged();
_settingBackendSvc.getSetting().then((result) {
if (_isDisposed) {
return;
}
result.fold(
(setting) => _updateSetting(setting),
(err) => Log.error(err),
);
});
_listenOnFieldSettingsChanged();
}
/// Listen for filter changes in the backend.
void _listenOnFilterChanges() {
//Listen on the filter changes
deleteFilterFromChangeset(
List<FilterInfo> filters,
FilterChangesetNotificationPB changeset,
@@ -196,9 +174,6 @@ class FieldController {
filters.retainWhere(
(element) => !deleteFilterIds.contains(element.filter.id),
);
_filterPBByFieldId
.removeWhere((key, value) => deleteFilterIds.contains(value.id));
}
}
@@ -216,7 +191,6 @@ class FieldController {
fieldType: newFilter.fieldType,
);
if (fieldInfo != null) {
_filterPBByFieldId[fieldInfo.id] = newFilter;
filters.add(FilterInfo(viewId, newFilter, fieldInfo));
}
}
@@ -234,8 +208,6 @@ class FieldController {
// Remove the old filter
if (filterIndex != -1) {
filters.removeAt(filterIndex);
_filterPBByFieldId
.removeWhere((key, value) => value.id == updatedFilter.filterId);
}
// Insert the filter if there is a filter and its field info is
@@ -257,7 +229,6 @@ class FieldController {
} else {
filters.add(filterInfo);
}
_filterPBByFieldId[fieldInfo.id] = updatedFilter.filter;
}
}
}
@@ -272,16 +243,17 @@ class FieldController {
result.fold(
(FilterChangesetNotificationPB changeset) {
final List<FilterInfo> filters = filterInfos;
// Deletes the filters
// delete removed filters
deleteFilterFromChangeset(filters, changeset);
// Inserts the new filter if it's not exist
// insert new filters
insertFilterFromChangeset(filters, changeset);
// edit modified filters
updateFilterFromChangeset(filters, changeset);
_updateFieldInfos();
_filterNotifier?.filters = filters;
_updateFieldInfos();
},
(err) => Log.error(err),
);
@@ -289,6 +261,7 @@ class FieldController {
);
}
/// Listen for sort changes in the backend.
void _listenOnSortChanged() {
deleteSortFromChangeset(
List<SortInfo> newSortInfos,
@@ -299,9 +272,6 @@ class FieldController {
newSortInfos.retainWhere(
(element) => !deleteSortIds.contains(element.sortId),
);
_sortPBByFieldId
.removeWhere((key, value) => deleteSortIds.contains(value.id));
}
}
@@ -320,7 +290,6 @@ class FieldController {
);
if (fieldInfo != null) {
_sortPBByFieldId[newSortPB.fieldId] = newSortPB;
newSortInfos.add(SortInfo(sortPB: newSortPB, fieldInfo: fieldInfo));
}
}
@@ -356,7 +325,6 @@ class FieldController {
} else {
newSortInfos.add(newSortInfo);
}
_sortPBByFieldId[updatedSort.fieldId] = updatedSort;
}
}
}
@@ -373,7 +341,6 @@ class FieldController {
insertSortFromChangeset(newSortInfos, changeset);
updateSortFromChangeset(newSortInfos, changeset);
_updateFieldInfos();
_sortNotifier?.sorts = newSortInfos;
},
(err) => Log.error(err),
@@ -382,8 +349,8 @@ class FieldController {
);
}
/// Listen for databse setting changes in the backend.
void _listenOnSettingChanges() {
//Listen on setting changes
_settingListener.start(
onSettingUpdated: (result) {
if (_isDisposed) {
@@ -398,19 +365,95 @@ class FieldController {
);
}
/// Listen for field changes in the backend.
void _listenOnFieldChanges() {
//Listen on field's changes
void deleteFields(List<FieldIdPB> deletedFields) {
if (deletedFields.isEmpty) {
return;
}
final List<FieldInfo> newFields = fieldInfos;
final Map<String, FieldIdPB> deletedFieldMap = {
for (var fieldOrder in deletedFields) fieldOrder.fieldId: fieldOrder
};
newFields.retainWhere((field) => (deletedFieldMap[field.id] == null));
_fieldNotifier.fieldInfos = newFields;
}
Future<FieldInfo> attachFieldSettings(FieldInfo fieldInfo) async {
return _fieldSettingsBackendSvc
.getFieldSettings(fieldInfo.id)
.then((result) {
final fieldSettings = result.fold(
(fieldSettings) => fieldSettings,
(err) {
return null;
},
);
if (fieldSettings == null) {
return fieldInfo;
}
final updatedFieldInfo =
fieldInfo.copyWith(fieldSettings: fieldSettings);
return updatedFieldInfo;
});
}
Future<void> insertFields(List<IndexFieldPB> insertedFields) async {
if (insertedFields.isEmpty) {
return;
}
final List<FieldInfo> newFieldInfos = fieldInfos;
for (final indexField in insertedFields) {
final initial = FieldInfo.initial(indexField.field_1);
final fieldInfo = await attachFieldSettings(initial);
if (newFieldInfos.length > indexField.index) {
newFieldInfos.insert(indexField.index, fieldInfo);
} else {
newFieldInfos.add(fieldInfo);
}
}
_fieldNotifier.fieldInfos = newFieldInfos;
}
Future<List<FieldInfo>> updateFields(List<FieldPB> updatedFieldPBs) async {
if (updatedFieldPBs.isEmpty) {
return [];
}
final List<FieldInfo> newFields = fieldInfos;
final List<FieldInfo> updatedFields = [];
for (final updatedFieldPB in updatedFieldPBs) {
final index =
newFields.indexWhere((field) => field.id == updatedFieldPB.id);
if (index != -1) {
newFields.removeAt(index);
final initial = FieldInfo.initial(updatedFieldPB);
final fieldInfo = await attachFieldSettings(initial);
newFields.insert(index, fieldInfo);
updatedFields.add(fieldInfo);
}
}
if (updatedFields.isNotEmpty) {
_fieldNotifier.fieldInfos = newFields;
}
return updatedFields;
}
// Listen on field's changes
_fieldListener.start(
onFieldsChanged: (result) {
onFieldsChanged: (result) async {
result.fold(
(changeset) {
(changeset) async {
if (_isDisposed) {
return;
}
_deleteFields(changeset.deletedFields);
_insertFields(changeset.insertedFields);
deleteFields(changeset.deletedFields);
insertFields(changeset.insertedFields);
final updatedFields = _updateFields(changeset.updatedFields);
final updatedFields = await updateFields(changeset.updatedFields);
for (final listener in _updatedFieldCallbacks.values) {
listener(updatedFields);
}
@@ -421,31 +464,70 @@ class FieldController {
);
}
/// Listen for field setting changes in the backend.
void _listenOnFieldSettingsChanged() {
FieldInfo updateFieldSettings(FieldSettingsPB updatedFieldSettings) {
final List<FieldInfo> newFields = fieldInfos;
FieldInfo updatedField = newFields[0];
final index = newFields
.indexWhere((field) => field.id == updatedFieldSettings.fieldId);
if (index != -1) {
newFields[index] =
newFields[index].copyWith(fieldSettings: updatedFieldSettings);
updatedField = newFields[index];
}
_fieldNotifier.fieldInfos = newFields;
return updatedField;
}
_fieldSettingsListener.start(
onFieldSettingsChanged: (result) {
if (_isDisposed) {
return;
}
result.fold(
(fieldSettings) {
final updatedFieldInfo = updateFieldSettings(fieldSettings);
for (final listener in _updatedFieldCallbacks.values) {
listener([updatedFieldInfo]);
}
},
(err) => Log.error(err),
);
},
);
}
/// Updates sort, filter, group and field info from `DatabaseViewSettingPB`
void _updateSetting(DatabaseViewSettingPB setting) {
_groupConfigurationByFieldId.clear();
for (final configuration in setting.groupSettings.items) {
_groupConfigurationByFieldId[configuration.fieldId] = configuration;
}
for (final filter in setting.filters.items) {
_filterPBByFieldId[filter.fieldId] = filter;
}
_filterNotifier?.filters = _filterInfoListFromPBs(setting.filters.items);
for (final sort in setting.sorts.items) {
_sortPBByFieldId[sort.fieldId] = sort;
}
_sortNotifier?.sorts = _sortInfoListFromPBs(setting.sorts.items);
_fieldSettings.clear();
_fieldSettings.addAll(setting.fieldSettings.items);
_updateFieldInfos();
}
/// Attach sort, filter, group information and field settings to `FieldInfo`
void _updateFieldInfos() {
final List<FieldInfo> newFieldInfos = [];
for (final field in _fieldNotifier.fieldInfos) {
newFieldInfos.add(
field.copyWith(
fieldSettings: _fieldSettings
.firstWhereOrNull((setting) => setting.fieldId == field.id),
isGroupField: _groupConfigurationByFieldId[field.id] != null,
hasFilter: _filterPBByFieldId[field.id] != null,
hasSort: _sortPBByFieldId[field.id] != null,
hasFilter: getFilterByFieldId(field.id) != null,
hasSort: getSortByFieldId(field.id) != null,
),
);
}
@@ -453,52 +535,27 @@ class FieldController {
_fieldNotifier.fieldInfos = newFieldInfos;
}
Future<void> dispose() async {
if (_isDisposed) {
Log.warn('FieldController is already disposed');
return;
}
_isDisposed = true;
await _fieldListener.stop();
await _filtersListener.stop();
await _settingListener.stop();
await _sortsListener.stop();
for (final callback in _fieldCallbacks.values) {
_fieldNotifier.removeListener(callback);
}
_fieldNotifier.dispose();
for (final callback in _filterCallbacks.values) {
_filterNotifier?.removeListener(callback);
}
for (final callback in _sortCallbacks.values) {
_sortNotifier?.removeListener(callback);
}
_filterNotifier?.dispose();
_filterNotifier = null;
_sortNotifier?.dispose();
_sortNotifier = null;
}
/// Load all of the fields. This is required when opening the database
Future<Either<Unit, FlowyError>> loadFields({
required List<FieldIdPB> fieldIds,
}) async {
final result = await _databaseViewBackendSvc.getFields(fieldIds: fieldIds);
return Future(
() => result.fold(
(newFields) {
(newFields) async {
if (_isDisposed) {
return left(unit);
}
_fieldNotifier.fieldInfos =
newFields.map((field) => FieldInfo.initial(field)).toList();
_loadFilters();
_loadSorts();
await Future.wait([
_loadFilters(),
_loadSorts(),
_loadAllFieldSettings(),
]);
_updateFieldInfos();
return left(unit);
},
(err) => right(err),
@@ -506,24 +563,12 @@ class FieldController {
);
}
/// Load all the filters from the backend. Required by `loadFields`
Future<Either<Unit, FlowyError>> _loadFilters() async {
return _filterBackendSvc.getAllFilters().then((result) {
return result.fold(
(filterPBs) {
final List<FilterInfo> filters = [];
for (final filterPB in filterPBs) {
final fieldInfo = _findFieldInfo(
fieldInfos: fieldInfos,
fieldId: filterPB.fieldId,
fieldType: filterPB.fieldType,
);
if (fieldInfo != null) {
final filterInfo = FilterInfo(viewId, filterPB, fieldInfo);
filters.add(filterInfo);
}
}
_filterNotifier?.filters = filters;
_filterNotifier?.filters = _filterInfoListFromPBs(filterPBs);
return left(unit);
},
(err) => right(err),
@@ -531,26 +576,12 @@ class FieldController {
});
}
/// Load all the sorts from the backend. Required by `loadFields`
Future<Either<Unit, FlowyError>> _loadSorts() async {
return _sortBackendSvc.getAllSorts().then((result) {
return result.fold(
(sortPBs) {
final List<SortInfo> sortInfos = [];
for (final sortPB in sortPBs) {
final fieldInfo = _findFieldInfo(
fieldInfos: fieldInfos,
fieldId: sortPB.fieldId,
fieldType: sortPB.fieldType,
);
if (fieldInfo != null) {
final sortInfo = SortInfo(sortPB: sortPB, fieldInfo: fieldInfo);
sortInfos.add(sortInfo);
}
}
_updateFieldInfos();
_sortNotifier?.sorts = sortInfos;
_sortNotifier?.sorts = _sortInfoListFromPBs(sortPBs);
return left(unit);
},
(err) => right(err),
@@ -558,6 +589,56 @@ class FieldController {
});
}
/// Load all the field settings from the backend. Required by `loadFields`
Future<Either<Unit, FlowyError>> _loadAllFieldSettings() async {
return _fieldSettingsBackendSvc.getAllFieldSettings().then((result) {
return result.fold(
(fieldSettingsList) {
_fieldSettings.clear();
_fieldSettings.addAll(fieldSettingsList);
return left(unit);
},
(err) => right(err),
);
});
}
/// Attach corresponding `FieldInfo`s to the `FilterPB`s
List<FilterInfo> _filterInfoListFromPBs(List<FilterPB> filterPBs) {
FilterInfo? getFilterInfo(FilterPB filterPB) {
final fieldInfo = _findFieldInfo(
fieldInfos: fieldInfos,
fieldId: filterPB.fieldId,
fieldType: filterPB.fieldType,
);
return fieldInfo != null ? FilterInfo(viewId, filterPB, fieldInfo) : null;
}
return filterPBs
.map((filterPB) => getFilterInfo(filterPB))
.whereType<FilterInfo>()
.toList();
}
/// Attach corresponding `FieldInfo`s to the `SortPB`s
List<SortInfo> _sortInfoListFromPBs(List<SortPB> sortPBs) {
SortInfo? getSortInfo(SortPB sortPB) {
final fieldInfo = _findFieldInfo(
fieldInfos: fieldInfos,
fieldId: sortPB.fieldId,
fieldType: sortPB.fieldType,
);
return fieldInfo != null
? SortInfo(sortPB: sortPB, fieldInfo: fieldInfo)
: null;
}
return sortPBs
.map((sortPB) => getSortInfo(sortPB))
.whereType<SortInfo>()
.toList();
}
void addListener({
OnReceiveFields? onReceiveFields,
OnReceiveUpdateFields? onFieldsChanged,
@@ -640,57 +721,35 @@ class FieldController {
}
}
void _deleteFields(List<FieldIdPB> deletedFields) {
if (deletedFields.isEmpty) {
/// Stop listeners, dispose notifiers and clear listener callbacks
Future<void> dispose() async {
if (_isDisposed) {
Log.warn('FieldController is already disposed');
return;
}
final List<FieldInfo> newFields = fieldInfos;
final Map<String, FieldIdPB> deletedFieldMap = {
for (var fieldOrder in deletedFields) fieldOrder.fieldId: fieldOrder
};
_isDisposed = true;
await _fieldListener.stop();
await _filtersListener.stop();
await _settingListener.stop();
await _sortsListener.stop();
await _fieldSettingsListener.stop();
newFields.retainWhere((field) => (deletedFieldMap[field.id] == null));
_fieldNotifier.fieldInfos = newFields;
}
for (final callback in _fieldCallbacks.values) {
_fieldNotifier.removeListener(callback);
}
_fieldNotifier.dispose();
void _insertFields(List<IndexFieldPB> insertedFields) {
if (insertedFields.isEmpty) {
return;
for (final callback in _filterCallbacks.values) {
_filterNotifier?.removeListener(callback);
}
final List<FieldInfo> newFieldInfos = fieldInfos;
for (final indexField in insertedFields) {
final fieldInfo = FieldInfo.initial(indexField.field_1);
if (newFieldInfos.length > indexField.index) {
newFieldInfos.insert(indexField.index, fieldInfo);
} else {
newFieldInfos.add(fieldInfo);
}
}
_fieldNotifier.fieldInfos = newFieldInfos;
}
_filterNotifier?.dispose();
_filterNotifier = null;
List<FieldInfo> _updateFields(List<FieldPB> updatedFieldPBs) {
if (updatedFieldPBs.isEmpty) {
return [];
for (final callback in _sortCallbacks.values) {
_sortNotifier?.removeListener(callback);
}
final List<FieldInfo> newFields = fieldInfos;
final List<FieldInfo> updatedFields = [];
for (final updatedFieldPB in updatedFieldPBs) {
final index =
newFields.indexWhere((field) => field.id == updatedFieldPB.id);
if (index != -1) {
newFields.removeAt(index);
final fieldInfo = FieldInfo.initial(updatedFieldPB);
newFields.insert(index, fieldInfo);
updatedFields.add(fieldInfo);
}
}
if (updatedFields.isNotEmpty) {
_fieldNotifier.fieldInfos = newFields;
}
return updatedFields;
_sortNotifier?.dispose();
_sortNotifier = null;
}
}
@@ -727,12 +786,7 @@ FieldInfo? _findFieldInfo({
required String fieldId,
required FieldType fieldType,
}) {
final fieldIndex = fieldInfos.indexWhere((element) {
return element.id == fieldId && element.fieldType == fieldType;
});
if (fieldIndex != -1) {
return fieldInfos[fieldIndex];
} else {
return null;
}
return fieldInfos.firstWhereOrNull(
(element) => element.id == fieldId && element.fieldType == fieldType,
);
}
@@ -1,4 +1,5 @@
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'field_info.freezed.dart';
@@ -8,6 +9,7 @@ class FieldInfo with _$FieldInfo {
const factory FieldInfo({
required FieldPB field,
required FieldSettingsPB? fieldSettings,
required bool isGroupField,
required bool hasFilter,
required bool hasSort,
@@ -21,8 +23,11 @@ class FieldInfo with _$FieldInfo {
bool get isPrimary => field.isPrimary;
FieldVisibility? get visibility => fieldSettings?.visibility;
factory FieldInfo.initial(FieldPB field) => FieldInfo(
field: field,
fieldSettings: null,
hasFilter: false,
hasSort: false,
isGroupField: false,
@@ -30,7 +30,6 @@ class FieldBackendService {
Future<Either<Unit, FlowyError>> updateField({
String? name,
bool? frozen,
bool? visibility,
double? width,
}) {
final payload = FieldChangesetPB.create()
@@ -45,10 +44,6 @@ class FieldBackendService {
payload.frozen = frozen;
}
if (visibility != null) {
payload.visibility = visibility;
}
if (width != null) {
payload.width = width.toInt();
}
@@ -0,0 +1,51 @@
import 'dart:typed_data';
import 'package:appflowy/core/notification/grid_notification.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_infra/notifier.dart';
typedef FieldSettingsValue = Either<FieldSettingsPB, FlowyError>;
class FieldSettingsListener {
final String viewId;
PublishNotifier<FieldSettingsValue>? _fieldSettingsNotifier =
PublishNotifier();
DatabaseNotificationListener? _listener;
FieldSettingsListener({required this.viewId});
void start({
required void Function(FieldSettingsValue) onFieldSettingsChanged,
}) {
_fieldSettingsNotifier?.addPublishListener(onFieldSettingsChanged);
_listener = DatabaseNotificationListener(
objectId: viewId,
handler: _handler,
);
}
void _handler(
DatabaseNotification ty,
Either<Uint8List, FlowyError> result,
) {
switch (ty) {
case DatabaseNotification.DidUpdateFieldSettings:
result.fold(
(payload) => _fieldSettingsNotifier?.value =
left(FieldSettingsPB.fromBuffer(payload)),
(error) => _fieldSettingsNotifier?.value = right(error),
);
break;
default:
break;
}
}
Future<void> stop() async {
await _listener?.stop();
_fieldSettingsNotifier?.dispose();
_fieldSettingsNotifier = null;
}
}
@@ -0,0 +1,54 @@
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/database_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:dartz/dartz.dart';
class FieldSettingsBackendService {
final String viewId;
FieldSettingsBackendService({required this.viewId});
Future<Either<FieldSettingsPB, FlowyError>> getFieldSettings(
String fieldId,
) {
final id = FieldIdPB(fieldId: fieldId);
final ids = RepeatedFieldIdPB()..items.add(id);
final payload = FieldIdsPB()
..viewId = viewId
..fieldIds = ids;
return DatabaseEventGetFieldSettings(payload).send().then((result) {
return result.fold(
(fieldSettings) => left(fieldSettings.items.first),
(r) => right(r),
);
});
}
Future<Either<List<FieldSettingsPB>, FlowyError>> getAllFieldSettings() {
final payload = DatabaseViewIdPB()..value = viewId;
return DatabaseEventGetAllFieldSettings(payload).send().then((result) {
return result.fold(
(fieldSettings) => left(fieldSettings.items),
(r) => right(r),
);
});
}
Future<Either<Unit, FlowyError>> updateFieldSettings({
required String fieldId,
FieldVisibility? fieldVisibility,
}) {
final FieldSettingsChangesetPB payload = FieldSettingsChangesetPB.create()
..viewId = viewId
..fieldId = fieldId;
if (fieldVisibility != null) {
payload.visibility = fieldVisibility;
}
return DatabaseEventUpdateFieldSettings(payload).send();
}
}
@@ -74,6 +74,7 @@ class RowCache {
final rowInfo = buildGridRow(row);
_rowList.add(rowInfo);
}
_changedNotifier.receive(const ChangedReason.setInitialRows());
}
Future<void> dispose() async {
@@ -245,7 +246,8 @@ class RowCache {
// ignore: prefer_collection_literals
final cellContextMap = CellContextByFieldId();
for (final fieldInfo in _fieldDelegate.fieldInfos) {
if (fieldInfo.field.visibility) {
if (fieldInfo.visibility != null &&
fieldInfo.visibility != FieldVisibility.AlwaysHidden) {
cellContextMap[fieldInfo.id] = DatabaseCellContext(
rowMeta: rowMeta,
viewId: viewId,
@@ -281,6 +283,7 @@ class RowChangesetNotifier extends ChangeNotifier {
initial: (_) {},
reorderRows: (_) => notifyListeners(),
reorderSingleRow: (_) => notifyListeners(),
setInitialRows: (_) => notifyListeners(),
);
}
}
@@ -313,6 +316,7 @@ class ChangedReason with _$ChangedReason {
ReorderSingleRowPB reorderRow,
RowInfo rowInfo,
) = _ReorderSingleRow;
const factory ChangedReason.setInitialRows() = _SetInitialRows;
}
class InsertedIndex {
@@ -1,6 +1,8 @@
import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy/plugins/database_view/application/field_settings/field_settings_service.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'dart:async';
@@ -28,13 +30,13 @@ class DatabasePropertyBloc
_startListening();
},
setFieldVisibility: (_SetFieldVisibility value) async {
final fieldBackendSvc = FieldBackendService(
final fieldSettingsSvc = FieldSettingsBackendService(
viewId: viewId,
fieldId: value.fieldId,
);
final result = await fieldBackendSvc.updateField(
visibility: value.visibility,
final result = await fieldSettingsSvc.updateFieldSettings(
fieldId: value.fieldId,
fieldVisibility: value.visibility,
);
result.fold((l) => null, (err) => Log.error(err));
@@ -84,7 +86,7 @@ class DatabasePropertyEvent with _$DatabasePropertyEvent {
const factory DatabasePropertyEvent.initial() = _Initial;
const factory DatabasePropertyEvent.setFieldVisibility(
String fieldId,
bool visibility,
FieldVisibility visibility,
) = _SetFieldVisibility;
const factory DatabasePropertyEvent.didReceiveFieldUpdate(
List<FieldInfo> fields,
@@ -0,0 +1,66 @@
import 'dart:io';
import 'package:appflowy/workspace/application/settings/share/export_service.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-document2/entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart';
part 'share_bloc.freezed.dart';
class DatabaseShareBloc extends Bloc<DatabaseShareEvent, DatabaseShareState> {
DatabaseShareBloc({
required this.view,
}) : super(const DatabaseShareState.initial()) {
on<ShareCSV>(_onShareCSV);
}
final ViewPB view;
Future<void> _onShareCSV(
ShareCSV event,
Emitter<DatabaseShareState> emit,
) async {
emit(const DatabaseShareState.loading());
final result = await BackendExportService.exportDatabaseAsCSV(view.id);
result.fold(
(l) => _saveCSVToPath(l.data, event.path),
(r) => Log.error(r),
);
emit(
DatabaseShareState.finish(
result.fold(
(l) {
_saveCSVToPath(l.data, event.path);
return left(unit);
},
(r) => right(r),
),
),
);
}
ExportDataPB _saveCSVToPath(String markdown, String path) {
File(path).writeAsStringSync(markdown);
return ExportDataPB()
..data = markdown
..exportType = ExportType.Markdown;
}
}
@freezed
class DatabaseShareEvent with _$DatabaseShareEvent {
const factory DatabaseShareEvent.shareCSV(String path) = ShareCSV;
}
@freezed
class DatabaseShareState with _$DatabaseShareState {
const factory DatabaseShareState.initial() = _Initial;
const factory DatabaseShareState.loading() = _Loading;
const factory DatabaseShareState.finish(
Either<Unit, FlowyError> successOrFail,
) = _Finish;
}
@@ -2,6 +2,7 @@ import 'package:appflowy/plugins/database_view/application/field/field_controlle
import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'dart:async';
@@ -16,18 +17,25 @@ class GridHeaderBloc extends Bloc<GridHeaderEvent, GridHeaderState> {
GridHeaderBloc({
required this.viewId,
required this.fieldController,
}) : super(GridHeaderState.initial(fieldController.fieldInfos)) {
}) : super(GridHeaderState.initial()) {
on<GridHeaderEvent>(
(event, emit) async {
await event.map(
initial: (_InitialHeader value) async {
_startListening();
add(
GridHeaderEvent.didReceiveFieldUpdate(fieldController.fieldInfos),
);
},
didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
emit(
state.copyWith(
fields: value.fields
.where((element) => element.field.visibility)
.where(
(element) =>
element.visibility != null &&
element.visibility != FieldVisibility.AlwaysHidden,
)
.toList(),
),
);
@@ -83,9 +91,5 @@ class GridHeaderState with _$GridHeaderState {
const factory GridHeaderState({required List<FieldInfo> fields}) =
_GridHeaderState;
factory GridHeaderState.initial(List<FieldInfo> fields) {
// final List<FieldPB> newFields = List.from(fields);
// newFields.retainWhere((field) => field.visibility);
return GridHeaderState(fields: fields);
}
factory GridHeaderState.initial() => const GridHeaderState(fields: []);
}
@@ -1,5 +1,7 @@
import 'package:appflowy/plugins/database_view/application/field_settings/field_settings_service.dart';
import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'dart:async';
@@ -10,18 +12,18 @@ part 'row_detail_bloc.freezed.dart';
class RowDetailBloc extends Bloc<RowDetailEvent, RowDetailState> {
final RowBackendService rowService;
final RowController dataController;
final RowController rowController;
RowDetailBloc({
required this.dataController,
}) : rowService = RowBackendService(viewId: dataController.viewId),
required this.rowController,
}) : rowService = RowBackendService(viewId: rowController.viewId),
super(RowDetailState.initial()) {
on<RowDetailEvent>(
(event, emit) async {
await event.when(
initial: () async {
await _startListening();
final cells = dataController.loadData();
final cells = rowController.loadData();
if (!isClosed) {
add(RowDetailEvent.didReceiveCellDatas(cells.values.toList()));
}
@@ -32,9 +34,24 @@ class RowDetailBloc extends Bloc<RowDetailEvent, RowDetailState> {
deleteField: (fieldId) {
_fieldBackendService(fieldId).deleteField();
},
showField: (fieldId) async {
final result =
await FieldSettingsBackendService(viewId: rowController.viewId)
.updateFieldSettings(
fieldId: fieldId,
fieldVisibility: FieldVisibility.AlwaysShown,
);
result.fold(
(l) {},
(err) => Log.error(err),
);
},
hideField: (fieldId) async {
final result = await _fieldBackendService(fieldId).updateField(
visibility: false,
final result =
await FieldSettingsBackendService(viewId: rowController.viewId)
.updateFieldSettings(
fieldId: fieldId,
fieldVisibility: FieldVisibility.AlwaysHidden,
);
result.fold(
(l) {},
@@ -57,12 +74,12 @@ class RowDetailBloc extends Bloc<RowDetailEvent, RowDetailState> {
@override
Future<void> close() async {
dataController.dispose();
rowController.dispose();
return super.close();
}
Future<void> _startListening() async {
dataController.addListener(
rowController.addListener(
onRowChanged: (cells, reason) {
if (!isClosed) {
add(RowDetailEvent.didReceiveCellDatas(cells.values.toList()));
@@ -73,7 +90,7 @@ class RowDetailBloc extends Bloc<RowDetailEvent, RowDetailState> {
FieldBackendService _fieldBackendService(String fieldId) {
return FieldBackendService(
viewId: dataController.viewId,
viewId: rowController.viewId,
fieldId: fieldId,
);
}
@@ -83,6 +100,7 @@ class RowDetailBloc extends Bloc<RowDetailEvent, RowDetailState> {
class RowDetailEvent with _$RowDetailEvent {
const factory RowDetailEvent.initial() = _Initial;
const factory RowDetailEvent.deleteField(String fieldId) = _DeleteField;
const factory RowDetailEvent.showField(String fieldId) = _ShowField;
const factory RowDetailEvent.hideField(String fieldId) = _HideField;
const factory RowDetailEvent.deleteRow(String rowId) = _DeleteRow;
const factory RowDetailEvent.duplicateRow(String rowId, String? groupId) =
@@ -22,6 +22,10 @@ class FilterInfo {
);
}
String get filterId => filter.id;
String get fieldId => filter.fieldId;
DateFilterPB? dateFilter() {
if (![
FieldType.DateTime,
@@ -164,11 +164,6 @@ class FieldCellButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Using this technique to have proper text ellipsis
// https://github.com/flutter/flutter/issues/18761#issuecomment-812390920
final text = Characters(field.name)
.replaceAll(Characters(''), Characters('\u{200B}'))
.toString();
return FlowyButton(
hoverColor: AFThemeExtension.of(context).greyHover,
onTap: onTap,
@@ -177,7 +172,7 @@ class FieldCellButton extends StatelessWidget {
),
radius: radius,
text: FlowyText.medium(
text,
field.name,
maxLines: maxLines,
overflow: TextOverflow.ellipsis,
),
@@ -102,7 +102,7 @@ class _FieldEditorState extends State<FieldEditor> {
builder: (context, state) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0),
child: _HideFieldButton(
child: HideFieldButton(
popoverMutex: popoverMutex,
onHidden: () {
state.field.fold(
@@ -236,11 +236,12 @@ class _DeleteFieldButton extends StatelessWidget {
}
}
class _HideFieldButton extends StatelessWidget {
@visibleForTesting
class HideFieldButton extends StatelessWidget {
final PopoverMutex popoverMutex;
final VoidCallback? onHidden;
const _HideFieldButton({
const HideFieldButton({
required this.popoverMutex,
required this.onHidden,
Key? key,
@@ -42,12 +42,10 @@ class _GridHeaderSliverAdaptorState extends State<GridHeaderSliverAdaptor> {
Widget build(BuildContext context) {
return BlocProvider(
create: (context) {
final bloc = getIt<GridHeaderBloc>(
return getIt<GridHeaderBloc>(
param1: widget.viewId,
param2: widget.fieldController,
);
bloc.add(const GridHeaderEvent.initial());
return bloc;
)..add(const GridHeaderEvent.initial());
},
child: BlocBuilder<GridHeaderBloc, GridHeaderState>(
buildWhen: (previous, current) =>
@@ -97,7 +95,6 @@ class _GridHeaderState extends State<_GridHeader> {
buildWhen: (previous, current) => previous.fields != current.fields,
builder: (context, state) {
final cells = state.fields
.where((fieldInfo) => fieldInfo.field.visibility)
.map(
(field) => FieldContext(
viewId: widget.viewId,
@@ -8,4 +8,6 @@ class SortInfo {
SortInfo({required this.sortPB, required this.fieldInfo});
String get sortId => sortPB.id;
String get fieldId => sortPB.fieldId;
}
@@ -1,4 +1,5 @@
import 'package:appflowy/plugins/database_view/application/tar_bar_bloc.dart';
import 'package:appflowy/plugins/database_view/widgets/share_button.dart';
import 'package:appflowy/plugins/util.dart';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
@@ -212,4 +213,16 @@ class DatabasePluginWidgetBuilder extends PluginWidgetBuilder {
@override
List<NavigationItem> get navigationItems => [this];
@override
Widget? get rightBarItem {
return Row(
children: [
DatabaseShareButton(
key: ValueKey(notifier.view.id),
view: notifier.view,
),
],
);
}
}
@@ -5,6 +5,7 @@ import 'package:appflowy/plugins/database_view/application/field/type_option/typ
import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart';
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/theme_extension.dart';
@@ -44,7 +45,7 @@ class _DatabasePropertyListState extends State<DatabasePropertyList> {
child: BlocBuilder<DatabasePropertyBloc, DatabasePropertyState>(
builder: (context, state) {
final cells = state.fieldContexts.map((field) {
return _GridPropertyCell(
return GridPropertyCell(
key: ValueKey(field.id),
viewId: widget.viewId,
fieldInfo: field,
@@ -75,12 +76,13 @@ class _DatabasePropertyListState extends State<DatabasePropertyList> {
}
}
class _GridPropertyCell extends StatefulWidget {
@visibleForTesting
class GridPropertyCell extends StatefulWidget {
final FieldInfo fieldInfo;
final String viewId;
final PopoverMutex popoverMutex;
const _GridPropertyCell({
const GridPropertyCell({
super.key,
required this.fieldInfo,
required this.viewId,
@@ -88,26 +90,22 @@ class _GridPropertyCell extends StatefulWidget {
});
@override
State<_GridPropertyCell> createState() => _GridPropertyCellState();
State<GridPropertyCell> createState() => _GridPropertyCellState();
}
class _GridPropertyCellState extends State<_GridPropertyCell> {
class _GridPropertyCellState extends State<GridPropertyCell> {
final PopoverController _popoverController = PopoverController();
@override
Widget build(BuildContext context) {
final checkmark = FlowySvg(
widget.fieldInfo.field.visibility ? FlowySvgs.show_m : FlowySvgs.hide_m,
final visiblity = widget.fieldInfo.visibility;
final visibleIcon = FlowySvg(
visiblity != null && visiblity != FieldVisibility.AlwaysHidden
? FlowySvgs.show_m
: FlowySvgs.hide_m,
color: Theme.of(context).iconTheme.color,
);
return SizedBox(
height: GridSize.popoverItemHeight,
child: _editFieldButton(context, checkmark),
);
}
Widget _editFieldButton(BuildContext context, Widget checkmark) {
return AppFlowyPopover(
mutex: widget.popoverMutex,
controller: _popoverController,
@@ -116,30 +114,40 @@ class _GridPropertyCellState extends State<_GridPropertyCell> {
constraints: BoxConstraints.loose(const Size(240, 400)),
triggerActions: PopoverTriggerFlags.none,
margin: EdgeInsets.zero,
child: FlowyButton(
hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
widget.fieldInfo.name,
color: AFThemeExtension.of(context).textColor,
),
leftIcon: FlowySvg(
widget.fieldInfo.fieldType.icon(),
color: Theme.of(context).iconTheme.color,
),
rightIcon: FlowyIconButton(
hoverColor: Colors.transparent,
onPressed: () {
context.read<DatabasePropertyBloc>().add(
DatabasePropertyEvent.setFieldVisibility(
widget.fieldInfo.id,
!widget.fieldInfo.field.visibility,
),
);
},
icon: checkmark.padding(all: 6.0),
),
onTap: () => _popoverController.show(),
).padding(horizontal: 6.0),
child: SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
widget.fieldInfo.name,
color: AFThemeExtension.of(context).textColor,
),
leftIcon: FlowySvg(
widget.fieldInfo.fieldType.icon(),
color: Theme.of(context).iconTheme.color,
),
rightIcon: FlowyIconButton(
hoverColor: Colors.transparent,
onPressed: () {
if (widget.fieldInfo.fieldSettings == null) {
return;
}
final newVisiblity = _newFieldVisibility(
widget.fieldInfo.fieldSettings!.visibility,
);
context.read<DatabasePropertyBloc>().add(
DatabasePropertyEvent.setFieldVisibility(
widget.fieldInfo.id,
newVisiblity,
),
);
},
icon: visibleIcon.padding(all: 6.0),
),
onTap: () => _popoverController.show(),
).padding(horizontal: 6.0),
),
popupBuilder: (BuildContext context) {
return FieldEditor(
viewId: widget.viewId,
@@ -151,4 +159,12 @@ class _GridPropertyCellState extends State<_GridPropertyCell> {
},
);
}
FieldVisibility _newFieldVisibility(FieldVisibility current) {
return switch (current) {
FieldVisibility.AlwaysShown => FieldVisibility.AlwaysHidden,
FieldVisibility.AlwaysHidden => FieldVisibility.AlwaysShown,
_ => FieldVisibility.AlwaysHidden,
};
}
}
@@ -2,7 +2,7 @@ import 'dart:async';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
import 'package:appflowy/plugins/database_view/application/cell/cell_service.dart';
import 'package:appflowy/plugins/database_view/application/cell/date_cell_service.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pb.dart';
@@ -19,6 +19,7 @@ part 'date_cal_bloc.freezed.dart';
class DateCellCalendarBloc
extends Bloc<DateCellCalendarEvent, DateCellCalendarState> {
final DateCellBackendService _dateCellBackendService;
final DateCellController cellController;
void Function()? _onCellChangedFn;
@@ -26,18 +27,24 @@ class DateCellCalendarBloc
required DateTypeOptionPB dateTypeOptionPB,
required DateCellDataPB? cellData,
required this.cellController,
}) : super(DateCellCalendarState.initial(dateTypeOptionPB, cellData)) {
}) : _dateCellBackendService = DateCellBackendService(
viewId: cellController.viewId,
fieldId: cellController.fieldId,
rowId: cellController.rowId,
),
super(DateCellCalendarState.initial(dateTypeOptionPB, cellData)) {
on<DateCellCalendarEvent>(
(event, emit) async {
await event.when(
initial: () async => _startListening(),
didReceiveCellUpdate: (DateCellDataPB? cellData) {
final dateData = _dateDataFromCellData(cellData);
final (dateTime, time, includeTime) =
_dateDataFromCellData(cellData);
emit(
state.copyWith(
dateTime: dateData.dateTime,
time: dateData.time,
includeTime: dateData.includeTime,
dateTime: dateTime,
time: time,
includeTime: includeTime,
),
);
},
@@ -45,13 +52,13 @@ class DateCellCalendarBloc
emit(state.copyWith(timeFormatError: timeFormatError));
},
selectDay: (date) async {
await _updateDateData(emit, date: date);
await _updateDateData(date: date);
},
setIncludeTime: (includeTime) async {
await _updateDateData(emit, includeTime: includeTime);
await _updateDateData(includeTime: includeTime);
},
setTime: (time) async {
await _updateDateData(emit, time: time);
await _updateDateData(time: time);
},
setDateFormat: (dateFormat) async {
await _updateTypeOption(emit, dateFormat: dateFormat);
@@ -66,15 +73,14 @@ class DateCellCalendarBloc
emit(state.copyWith(focusedDay: focusedDay));
},
clearDate: () async {
await _clearDate(emit);
await _clearDate();
},
);
},
);
}
Future<void> _updateDateData(
Emitter<DateCellCalendarState> emit, {
Future<void> _updateDateData({
DateTime? date,
String? time,
bool? includeTime,
@@ -86,76 +92,60 @@ class DateCellCalendarBloc
date != null && time == null,
);
final String? newTime = time ?? state.time;
DateTime? newDate = _utcToLocalAddTime(date);
DateTime? newDate = _utcToLocalAndAddCurrentTime(date);
if (time != null && time.isNotEmpty) {
newDate = state.dateTime ?? DateTime.now();
}
final DateCellData newDateData = DateCellData(
dateTime: newDate,
final result = await _dateCellBackendService.update(
date: newDate,
time: newTime,
includeTime: includeTime ?? state.includeTime,
);
cellController.saveCellData(
newDateData,
onFinish: (result) {
result.fold(
() {
if (!isClosed && state.timeFormatError != null) {
add(const DateCellCalendarEvent.didReceiveTimeFormatError(null));
}
},
(err) {
switch (err.code) {
case ErrorCode.InvalidDateTimeFormat:
if (isClosed) return;
add(
DateCellCalendarEvent.didReceiveTimeFormatError(
timeFormatPrompt(err),
),
);
break;
default:
Log.error(err);
}
},
);
result.fold(
(_) {
if (!isClosed && state.timeFormatError != null) {
add(const DateCellCalendarEvent.didReceiveTimeFormatError(null));
}
},
(err) {
switch (err.code) {
case ErrorCode.InvalidDateTimeFormat:
if (isClosed) return;
add(
DateCellCalendarEvent.didReceiveTimeFormatError(
timeFormatPrompt(err),
),
);
break;
default:
Log.error(err);
}
},
);
}
Future<void> _clearDate(Emitter<DateCellCalendarState> emit) async {
final DateCellData newDateData = DateCellData(
dateTime: null,
time: null,
includeTime: state.includeTime,
clearFlag: true,
);
cellController.saveCellData(
newDateData,
onFinish: (result) {
result.fold(
() {
if (!isClosed) {
add(const DateCellCalendarEvent.didReceiveTimeFormatError(null));
}
},
(err) => Log.error(err),
);
Future<void> _clearDate() async {
final result = await _dateCellBackendService.clear();
result.fold(
(_) {
if (!isClosed) {
add(const DateCellCalendarEvent.didReceiveTimeFormatError(null));
}
},
(err) => Log.error(err),
);
}
DateTime? _utcToLocalAddTime(DateTime? date) {
DateTime? _utcToLocalAndAddCurrentTime(DateTime? date) {
if (date == null) {
return null;
}
final now = DateTime.now();
// the incoming date is Utc. this trick converts it into Local
// and add the current time, though the time may be overwritten by
// explicitly provided time string
// the incoming date is Utc. This trick converts it into Local
// and add the current time. The time may be overwritten by
// explicitly provided time string in the backend though
return DateTime(
date.year,
date.month,
@@ -285,14 +275,14 @@ class DateCellCalendarState with _$DateCellCalendarState {
DateTypeOptionPB dateTypeOptionPB,
DateCellDataPB? cellData,
) {
final dateData = _dateDataFromCellData(cellData);
final (dateTime, time, includeTime) = _dateDataFromCellData(cellData);
return DateCellCalendarState(
dateTypeOptionPB: dateTypeOptionPB,
format: CalendarFormat.month,
focusedDay: DateTime.now(),
dateTime: dateData.dateTime,
time: dateData.time,
includeTime: dateData.includeTime,
dateTime: dateTime,
time: time,
includeTime: includeTime,
timeFormatError: null,
timeHintText: _timeHintText(dateTypeOptionPB),
);
@@ -310,11 +300,11 @@ String _timeHintText(DateTypeOptionPB typeOption) {
}
}
DateCellData _dateDataFromCellData(DateCellDataPB? cellData) {
(DateTime?, String?, bool) _dateDataFromCellData(DateCellDataPB? cellData) {
// a null DateCellDataPB may be returned, indicating that all the fields are
// at their default values: empty strings and false booleans
if (cellData == null) {
return const DateCellData(includeTime: false);
return (null, null, false);
}
DateTime? dateTime;
@@ -326,5 +316,5 @@ DateCellData _dateDataFromCellData(DateCellDataPB? cellData) {
}
final bool includeTime = cellData.includeTime;
return DateCellData(dateTime: dateTime, time: time, includeTime: includeTime);
return (dateTime, time, includeTime);
}
@@ -168,7 +168,8 @@ class SelectOptionTagCell extends StatelessWidget {
...children,
],
),
onTap: () => onSelected(option),
// TODO(richard): find alternative solution to onTapDown
onTapDown: (_) => onSelected(option),
),
);
}
@@ -48,7 +48,7 @@ class _RowDetailPageState extends State<RowDetailPage> {
return FlowyDialog(
child: BlocProvider(
create: (context) {
return RowDetailBloc(dataController: widget.rowController)
return RowDetailBloc(rowController: widget.rowController)
..add(const RowDetailEvent.initial());
},
child: ListView(
@@ -0,0 +1,155 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/database_view/application/share_bloc.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/util/string_extension.dart';
import 'package:appflowy/workspace/application/view/view_listener.dart';
import 'package:appflowy/workspace/presentation/home/toast.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/file_picker/file_picker_service.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class DatabaseShareButton extends StatelessWidget {
const DatabaseShareButton({
super.key,
required this.view,
});
final ViewPB view;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DatabaseShareBloc(view: view),
child: BlocListener<DatabaseShareBloc, DatabaseShareState>(
listener: (context, state) {
state.mapOrNull(
finish: (state) {
state.successOrFail.fold(
(data) => _handleExportData(context),
_handleExportError,
);
},
);
},
child: BlocBuilder<DatabaseShareBloc, DatabaseShareState>(
builder: (context, state) => ConstrainedBox(
constraints: const BoxConstraints.expand(
height: 30,
width: 100,
),
child: DatabaseShareActionList(view: view),
),
),
),
);
}
void _handleExportData(BuildContext context) {
showSnackBarMessage(
context,
LocaleKeys.settings_files_exportFileSuccess.tr(),
);
}
void _handleExportError(FlowyError error) {
showMessageToast(error.msg);
}
}
class DatabaseShareActionList extends StatefulWidget {
const DatabaseShareActionList({
super.key,
required this.view,
});
final ViewPB view;
@override
State<DatabaseShareActionList> createState() =>
DatabaseShareActionListState();
}
@visibleForTesting
class DatabaseShareActionListState extends State<DatabaseShareActionList> {
late String name;
late final ViewListener viewListener = ViewListener(viewId: widget.view.id);
@override
void initState() {
super.initState();
listenOnViewUpdated();
}
@override
void dispose() {
viewListener.stop();
super.dispose();
}
@override
Widget build(BuildContext context) {
final databaseShareBloc = context.read<DatabaseShareBloc>();
return PopoverActionList<ShareActionWrapper>(
direction: PopoverDirection.bottomWithCenterAligned,
offset: const Offset(0, 8),
actions: ShareAction.values
.map((action) => ShareActionWrapper(action))
.toList(),
buildChild: (controller) {
return RoundedTextButton(
title: LocaleKeys.shareAction_buttonText.tr(),
onPressed: () => controller.show(),
);
},
onSelected: (action, controller) async {
switch (action.inner) {
case ShareAction.csv:
final exportPath = await getIt<FilePickerService>().saveFile(
dialogTitle: '',
fileName: '${name.toFileName()}.csv',
);
if (exportPath != null) {
databaseShareBloc.add(DatabaseShareEvent.shareCSV(exportPath));
}
break;
}
controller.close();
},
);
}
void listenOnViewUpdated() {
name = widget.view.name;
viewListener.start(
onViewUpdated: (view) {
name = view.name;
},
);
}
}
enum ShareAction {
csv,
}
class ShareActionWrapper extends ActionCell {
final ShareAction inner;
ShareActionWrapper(this.inner);
Widget? icon(Color iconColor) => null;
@override
String get name {
switch (inner) {
case ShareAction.csv:
return LocaleKeys.shareAction_csv.tr();
}
}
}
@@ -193,6 +193,7 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
if (lastNode == null || lastNode.delta == null) {
final transaction = editorState.transaction;
transaction.insertNode([document.root.children.length], paragraphNode());
transaction.afterSelection = transaction.beforeSelection;
await editorState.apply(transaction);
}
}
@@ -1,5 +1,7 @@
import 'package:appflowy/plugins/document/application/document_data_pb_extension.dart';
import 'dart:async';
import 'package:appflowy/plugins/document/application/doc_service.dart';
import 'package:appflowy/plugins/document/application/document_data_pb_extension.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-document2/protobuf.dart';
import 'package:appflowy_editor/appflowy_editor.dart'
@@ -12,10 +14,9 @@ import 'package:appflowy_editor/appflowy_editor.dart'
DeleteOperation,
PathExtensions,
Node,
Path,
composeAttributes;
import 'package:collection/collection.dart';
import 'dart:async';
import 'package:nanoid/nanoid.dart';
/// Uses to adjust the data structure between the editor and the backend.
@@ -46,7 +47,7 @@ class TransactionAdapter {
}
}
extension on Operation {
extension BlockAction on Operation {
List<BlockActionPB> toBlockAction(EditorState editorState) {
final op = this;
if (op is InsertOperation) {
@@ -61,19 +62,22 @@ extension on Operation {
}
extension on InsertOperation {
List<BlockActionPB> toBlockAction(EditorState editorState) {
List<BlockActionPB> toBlockAction(
EditorState editorState, {
Node? previousNode,
}) {
Path currentPath = path;
final List<BlockActionPB> actions = [];
// store the previous node for continuous insertion.
// because the backend needs to know the previous node's id.
Node? previousNode;
for (final node in nodes) {
final parentId =
node.parent?.id ?? editorState.getNodeAtPath(path.parent)?.id ?? '';
final parentId = node.parent?.id ??
editorState.getNodeAtPath(currentPath.parent)?.id ??
'';
var prevId = previousNode?.id ??
editorState.getNodeAtPath(path.previous)?.id ??
editorState.getNodeAtPath(currentPath.previous)?.id ??
'';
assert(parentId.isNotEmpty);
if (path.equals(path.previous) && !path.equals([0])) {
if (currentPath.equals(currentPath.previous) &&
!currentPath.equals([0])) {
prevId = '';
} else {
assert(prevId.isNotEmpty && prevId != node.id);
@@ -89,12 +93,17 @@ extension on InsertOperation {
..payload = payload,
);
if (node.children.isNotEmpty) {
final childrenActions = node.children
.map((e) => InsertOperation(e.path, [e]).toBlockAction(editorState))
.expand((element) => element);
actions.addAll(childrenActions);
Node? prevChild;
for (final child in node.children) {
actions.addAll(
InsertOperation(currentPath + child.path, [child])
.toBlockAction(editorState, previousNode: prevChild),
);
prevChild = child;
}
}
previousNode = node;
currentPath = currentPath.next;
}
return actions;
}
@@ -1,11 +1,13 @@
import 'dart:io';
import 'package:appflowy/workspace/application/export/document_exporter.dart';
import 'package:appflowy_backend/protobuf/flowy-document2/entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'share_bloc.freezed.dart';
class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
@@ -102,7 +102,8 @@ class _DocumentPageState extends State<DocumentPage> {
editorState: editorState!,
styleCustomizer: EditorStyleCustomizer(
context: context,
padding: const EdgeInsets.symmetric(horizontal: 50),
// the 44 is the width of the left action list
padding: const EdgeInsets.only(left: 40, right: 40 + 44),
),
header: _buildCoverAndIcon(context),
);
@@ -57,15 +57,21 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
];
final List<ToolbarItem> toolbarItems = [
smartEditItem,
paragraphItem,
...headingItems,
smartEditItem..isActive = onlyShowInSingleTextTypeSelectionAndExcludeTable,
paragraphItem..isActive = onlyShowInSingleTextTypeSelectionAndExcludeTable,
...(headingItems
..forEach(
(e) => e.isActive = onlyShowInSingleSelectionAndTextType,
)),
...markdownFormatItems,
quoteItem,
bulletedListItem,
numberedListItem,
quoteItem..isActive = onlyShowInSingleTextTypeSelectionAndExcludeTable,
bulletedListItem
..isActive = onlyShowInSingleTextTypeSelectionAndExcludeTable,
numberedListItem
..isActive = onlyShowInSingleTextTypeSelectionAndExcludeTable,
inlineMathEquationItem,
linkItem,
alignToolbarItem,
buildTextColorItem(),
buildHighlightColorItem(),
];
@@ -159,6 +165,7 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
// customize the shortcuts
characterShortcutEvents: characterShortcutEvents,
commandShortcutEvents: commandShortcutEvents,
contextMenuItems: customContextMenuItems,
header: widget.header,
footer: const VSpace(200),
);
@@ -239,6 +246,28 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
),
),
),
TableBlockKeys.type: TableBlockComponentBuilder(
menuBuilder: (node, editorState, position, dir, onBuild, onClose) =>
TableMenu(
node: node,
editorState: editorState,
position: position,
dir: dir,
onBuild: onBuild,
onClose: onClose,
),
),
TableCellBlockKeys.type: TableCellBlockComponentBuilder(
menuBuilder: (node, editorState, position, dir, onBuild, onClose) =>
TableMenu(
node: node,
editorState: editorState,
position: position,
dir: dir,
onBuild: onBuild,
onClose: onClose,
),
),
DatabaseBlockKeys.gridType: DatabaseViewBlockComponentBuilder(
configuration: configuration.copyWith(
padding: (_) => const EdgeInsets.symmetric(vertical: 10),
@@ -336,7 +365,8 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
if (supportAlignBuilderType.contains(entry.key)) ...alignAction,
];
builder.showActions = (_) => true;
builder.showActions =
(node) => node.parent?.type != TableCellBlockKeys.type;
builder.actionBuilder = (context, state) {
final top = builder.configuration.padding(context.node).top;
final padding = context.node.type == HeadingBlockKeys.type
@@ -0,0 +1,153 @@
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
final alignToolbarItem = ToolbarItem(
id: 'editor.align',
group: 4,
isActive: onlyShowInTextType,
builder: (context, editorState, highlightColor) {
final selection = editorState.selection!;
final nodes = editorState.getNodesInSelection(selection);
bool isSatisfyCondition(bool Function(Object? value) test) {
return nodes.every(
(n) => test(n.attributes[blockComponentAlign]),
);
}
bool isHighlight = false;
FlowySvgData data = FlowySvgs.toolbar_align_left_s;
if (isSatisfyCondition((value) => value == 'left')) {
isHighlight = true;
data = FlowySvgs.toolbar_align_left_s;
} else if (isSatisfyCondition((value) => value == 'center')) {
isHighlight = true;
data = FlowySvgs.toolbar_align_center_s;
} else if (isSatisfyCondition((value) => value == 'right')) {
isHighlight = true;
data = FlowySvgs.toolbar_align_right_s;
}
final child = FlowySvg(
data,
size: const Size.square(16),
color: isHighlight ? highlightColor : Colors.white,
);
return _AlignmentButtons(
child: child,
onAlignChanged: (align) async {
await editorState.updateNode(
selection,
(node) => node.copyWith(
attributes: {
...node.attributes,
blockComponentAlign: align,
},
),
);
},
);
},
);
class _AlignmentButtons extends StatefulWidget {
const _AlignmentButtons({
required this.child,
required this.onAlignChanged,
});
final Widget child;
final Function(String align) onAlignChanged;
@override
State<_AlignmentButtons> createState() => _AlignmentButtonsState();
}
class _AlignmentButtonsState extends State<_AlignmentButtons> {
@override
Widget build(BuildContext context) {
return AppFlowyPopover(
windowPadding: const EdgeInsets.all(0),
margin: const EdgeInsets.all(0),
direction: PopoverDirection.bottomWithCenterAligned,
offset: const Offset(0, 10),
child: widget.child,
popupBuilder: (_) => _AlignButtons(onAlignChanged: widget.onAlignChanged),
);
}
}
class _AlignButtons extends StatelessWidget {
const _AlignButtons({
required this.onAlignChanged,
});
final Function(String align) onAlignChanged;
@override
Widget build(BuildContext context) {
return SizedBox(
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const HSpace(4),
_AlignButton(
icon: FlowySvgs.toolbar_align_left_s,
onTap: () => onAlignChanged('left'),
),
const _Divider(),
_AlignButton(
icon: FlowySvgs.toolbar_align_center_s,
onTap: () => onAlignChanged('center'),
),
const _Divider(),
_AlignButton(
icon: FlowySvgs.toolbar_align_right_s,
onTap: () => onAlignChanged('right'),
),
const HSpace(4),
],
),
);
}
}
class _AlignButton extends StatelessWidget {
const _AlignButton({
required this.icon,
required this.onTap,
});
final FlowySvgData icon;
final VoidCallback onTap;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: FlowySvg(
icon,
size: const Size.square(16),
),
);
}
}
class _Divider extends StatelessWidget {
const _Divider();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8),
child: Container(
width: 1,
color: Colors.grey,
),
);
}
}
@@ -0,0 +1,29 @@
import 'package:appflowy_editor/appflowy_editor.dart';
bool notShowInTable(EditorState editorState) {
final selection = editorState.selection;
if (selection == null) {
return false;
}
final nodes = editorState.getNodesInSelection(selection);
return nodes.every((element) {
if (element.type == TableBlockKeys.type) {
return false;
}
var parent = element.parent;
while (parent != null) {
if (parent.type == TableBlockKeys.type) {
return false;
}
parent = parent.parent;
}
return true;
});
}
bool onlyShowInSingleTextTypeSelectionAndExcludeTable(
EditorState editorState,
) {
return onlyShowInSingleSelectionAndTextType(editorState) &&
notShowInTable(editorState);
}
@@ -195,7 +195,7 @@ class _CalloutBlockComponentWidgetState
child: child,
);
if (widget.actionBuilder != null) {
if (widget.showActions && widget.actionBuilder != null) {
child = BlockComponentActionWrapper(
node: widget.node,
actionBuilder: widget.actionBuilder!,
@@ -1,7 +1,9 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_item_list_menu.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/base/string_extension.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:highlight/highlight.dart' as highlight;
@@ -40,7 +42,7 @@ Node codeBlockNode({
// defining the callout block menu item for selection
SelectionMenuItem codeBlockItem = SelectionMenuItem.node(
name: 'Code Block',
name: LocaleKeys.document_selectionMenu_codeBlock.tr(),
iconData: Icons.abc,
keywords: ['code', 'codeblock'],
nodeBuilder: (editorState, _) => codeBlockNode(),
@@ -201,7 +203,7 @@ class _CodeBlockComponentWidgetState extends State<CodeBlockComponentWidget>
child: child,
);
if (widget.actionBuilder != null) {
if (widget.showActions && widget.actionBuilder != null) {
child = BlockComponentActionWrapper(
node: widget.node,
actionBuilder: widget.actionBuilder!,
@@ -9,9 +9,10 @@ final List<CharacterShortcutEvent> codeBlockCharacterEvents = [
final List<CommandShortcutEvent> codeBlockCommands = [
insertNewParagraphNextToCodeBlockCommand,
pasteInCodeblock,
selectAllInCodeBlockCommand,
tabToInsertSpacesInCodeBlockCommand,
tabToDeleteSpacesInCodeBlockCommand,
selectAllInCodeBlockCommand,
];
/// press the enter key in code block to insert a new line in it.
@@ -97,6 +98,18 @@ final CommandShortcutEvent selectAllInCodeBlockCommand = CommandShortcutEvent(
handler: _selectAllInCodeBlockCommandHandler,
);
/// ctrl + v to paste text in code block.
///
/// - support
/// - desktop
/// - web
final CommandShortcutEvent pasteInCodeblock = CommandShortcutEvent(
key: 'paste in codeblock',
command: 'ctrl+v',
macOSCommand: 'cmd+v',
handler: _pasteInCodeBlock,
);
CharacterShortcutEventHandler _enterInCodeBlockCommandHandler =
(editorState) async {
final selection = editorState.selection;
@@ -267,3 +280,49 @@ CommandShortcutEventHandler _selectAllInCodeBlockCommandHandler =
return KeyEventResult.handled;
};
CommandShortcutEventHandler _pasteInCodeBlock = (editorState) {
var selection = editorState.selection;
if (selection == null) {
return KeyEventResult.ignored;
}
if (editorState.getNodesInSelection(selection).length != 1) {
return KeyEventResult.ignored;
}
final node = editorState.getNodeAtPath(selection.end.path);
if (node == null || node.type != CodeBlockKeys.type) {
return KeyEventResult.ignored;
}
// delete the selection first.
if (!selection.isCollapsed) {
editorState.deleteSelection(selection);
}
// fetch selection again.
selection = editorState.selection;
if (selection == null) {
return KeyEventResult.skipRemainingHandlers;
}
assert(selection.isCollapsed);
() async {
final data = await AppFlowyClipboard.getData();
final text = data.text;
if (text != null && text.isNotEmpty) {
final transaction = editorState.transaction
..insertText(
node,
selection!.end.offset,
text,
);
await editorState.apply(transaction);
}
}();
return KeyEventResult.handled;
};
@@ -0,0 +1,21 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
final List<List<ContextMenuItem>> customContextMenuItems = [
[
ContextMenuItem(
name: LocaleKeys.document_plugins_contextMenu_copy.tr(),
onPressed: (editorState) => customCopyCommand.execute(editorState),
),
ContextMenuItem(
name: LocaleKeys.document_plugins_contextMenu_paste.tr(),
onPressed: (editorState) => customPasteCommand.execute(editorState),
),
ContextMenuItem(
name: LocaleKeys.document_plugins_contextMenu_cut.tr(),
onPressed: (editorState) => customCutCommand.execute(editorState),
),
],
];
@@ -17,15 +17,7 @@ extension PasteNodes on EditorState {
if (delta.isEmpty) {
transaction.insertNode(
selection.end.path.next,
insertedDelta == null
? node.copyWith(
type: node.type,
attributes: {
...node.attributes,
...insertedNode.attributes,
},
)
: insertedNode,
insertedNode,
);
transaction.deleteNode(node);
final path = calculatePath(selection.end.path, [insertedNode]);
@@ -88,7 +88,7 @@ class _DatabaseBlockComponentWidgetState
child: child,
);
if (widget.actionBuilder != null) {
if (widget.showActions && widget.actionBuilder != null) {
child = BlockComponentActionWrapper(
node: widget.node,
actionBuilder: widget.actionBuilder!,
@@ -1,6 +1,6 @@
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flutter/material.dart';
import 'config.dart';
import 'emoji_picker.dart';
import 'emoji_picker_builder.dart';
@@ -284,10 +284,11 @@ class DefaultEmojiPickerViewState extends State<DefaultEmojiPickerView>
Widget _buildNoRecent() {
return Center(
child: Text(
widget.config.noRecentsText,
style: widget.config.noRecentsStyle,
textAlign: TextAlign.center,
),);
child: FlowyText.regular(
widget.config.noRecentsText,
color: Theme.of(context).colorScheme.tertiary.withAlpha(77),
fontSize: widget.config.noRecentsStyle.fontSize,
textAlign: TextAlign.center,
),);
}
}
@@ -3,7 +3,6 @@ import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/widget/ignore_parent_gesture.dart';
import 'package:flutter/material.dart';
@@ -144,7 +144,7 @@ class _MathEquationBlockComponentWidgetState
),
);
if (widget.actionBuilder != null) {
if (widget.showActions && widget.actionBuilder != null) {
child = BlockComponentActionWrapper(
node: node,
actionBuilder: widget.actionBuilder!,
@@ -1,26 +1,19 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/smart_edit_action.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';
import 'package:appflowy/user/application/user_service.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flutter/material.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:easy_localization/easy_localization.dart';
final ToolbarItem smartEditItem = ToolbarItem(
id: 'appflowy.editor.smart_edit',
group: 0,
isActive: (editorState) {
final selection = editorState.selection;
if (selection == null) {
return false;
}
final nodes = editorState.getNodesInSelection(selection);
return nodes.every((element) => element.delta != null);
},
isActive: onlyShowInSingleSelectionAndTextType,
builder: (context, editorState, _) => SmartEditActionList(
editorState: editorState,
),
@@ -1,8 +1,11 @@
export 'actions/block_action_list.dart';
export 'actions/option_action.dart';
export 'align_toolbar_item/align_toolbar_item.dart';
export 'base/toolbar_extension.dart';
export 'callout/callout_block_component.dart';
export 'code_block/code_block_component.dart';
export 'code_block/code_block_shortcut_event.dart';
export 'context_menu/custom_context_menu.dart';
export 'copy_and_paste/custom_copy_command.dart';
export 'copy_and_paste/custom_cut_command.dart';
export 'copy_and_paste/custom_paste_command.dart';
@@ -23,5 +26,7 @@ export 'openai/widgets/auto_completion_node_widget.dart';
export 'openai/widgets/smart_edit_node_widget.dart';
export 'openai/widgets/smart_edit_toolbar_item.dart';
export 'outline/outline_block_component.dart';
export 'table/table_menu.dart';
export 'table/table_option_action.dart';
export 'toggle/toggle_block_component.dart';
export 'toggle/toggle_block_shortcut_event.dart';
@@ -0,0 +1,111 @@
import 'package:flutter/material.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/table/table_option_action.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'dart:math' as math;
const tableActions = <TableOptionAction>[
TableOptionAction.addAfter,
TableOptionAction.addBefore,
TableOptionAction.delete,
TableOptionAction.duplicate,
TableOptionAction.clear,
TableOptionAction.bgColor,
];
class TableMenu extends StatelessWidget {
const TableMenu({
super.key,
required this.node,
required this.editorState,
required this.position,
required this.dir,
this.onBuild,
this.onClose,
});
final Node node;
final EditorState editorState;
final int position;
final TableDirection dir;
final VoidCallback? onBuild;
final VoidCallback? onClose;
@override
Widget build(BuildContext context) {
final actions = tableActions.map((action) {
switch (action) {
case TableOptionAction.bgColor:
return TableColorOptionAction(
node: node,
editorState: editorState,
position: position,
dir: dir,
);
default:
return TableOptionActionWrapper(action);
}
}).toList();
return PopoverActionList<PopoverAction>(
direction: dir == TableDirection.col
? PopoverDirection.bottomWithCenterAligned
: PopoverDirection.rightWithTopAligned,
actions: actions,
onPopupBuilder: onBuild,
onClosed: onClose,
onSelected: (action, controller) {
if (action is TableOptionActionWrapper) {
_onSelectAction(action.inner);
controller.close();
}
},
buildChild: (controller) => _buildOptionButton(controller, context),
);
}
Widget _buildOptionButton(
PopoverController controller,
BuildContext context,
) {
return Card(
elevation: 1.0,
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: () => controller.show(),
child: Transform.rotate(
angle: dir == TableDirection.col ? math.pi / 2 : 0,
child: const FlowySvg(
FlowySvgs.drag_element_s,
size: Size.square(18.0),
),
),
),
),
);
}
void _onSelectAction(TableOptionAction action) {
switch (action) {
case TableOptionAction.addAfter:
TableActions.add(node, position + 1, editorState, dir);
break;
case TableOptionAction.addBefore:
TableActions.add(node, position, editorState, dir);
break;
case TableOptionAction.delete:
TableActions.delete(node, position, editorState, dir);
break;
case TableOptionAction.clear:
TableActions.clear(node, position, editorState, dir);
break;
case TableOptionAction.duplicate:
TableActions.duplicate(node, position, editorState, dir);
break;
default:
}
}
}
@@ -0,0 +1,154 @@
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/extensions/flowy_tint_extension.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:collection/collection.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/extension.dart';
import 'package:flutter/material.dart';
enum TableOptionAction {
addAfter,
addBefore,
delete,
duplicate,
clear,
/// row|cell background color
bgColor;
Widget icon(Color? color) {
switch (this) {
case TableOptionAction.addAfter:
return const FlowySvg(FlowySvgs.add_s);
case TableOptionAction.addBefore:
return const FlowySvg(FlowySvgs.add_s);
case TableOptionAction.delete:
return const FlowySvg(FlowySvgs.delete_s);
case TableOptionAction.duplicate:
return const FlowySvg(FlowySvgs.copy_s);
case TableOptionAction.clear:
return const FlowySvg(FlowySvgs.close_s);
case TableOptionAction.bgColor:
return const FlowySvg(
FlowySvgs.color_format_m,
size: Size.square(12),
).padding(all: 2.0);
}
}
String get description {
switch (this) {
case TableOptionAction.addAfter:
return LocaleKeys.document_plugins_table_addAfter.tr();
case TableOptionAction.addBefore:
return LocaleKeys.document_plugins_table_addBefore.tr();
case TableOptionAction.delete:
return LocaleKeys.document_plugins_table_delete.tr();
case TableOptionAction.duplicate:
return LocaleKeys.document_plugins_table_duplicate.tr();
case TableOptionAction.clear:
return LocaleKeys.document_plugins_table_clear.tr();
case TableOptionAction.bgColor:
return LocaleKeys.document_plugins_table_bgColor.tr();
}
}
}
class TableOptionActionWrapper extends ActionCell {
TableOptionActionWrapper(this.inner);
final TableOptionAction inner;
@override
Widget? leftIcon(Color iconColor) => inner.icon(iconColor);
@override
String get name => inner.description;
}
class TableColorOptionAction extends PopoverActionCell {
TableColorOptionAction({
required this.node,
required this.editorState,
required this.position,
required this.dir,
});
final Node node;
final EditorState editorState;
final int position;
final TableDirection dir;
@override
Widget? leftIcon(Color iconColor) =>
TableOptionAction.bgColor.icon(iconColor);
@override
String get name => TableOptionAction.bgColor.description;
@override
Widget Function(
BuildContext context,
PopoverController parentController,
PopoverController controller,
) get builder => (context, parentController, controller) {
int row = 0, col = position;
if (dir == TableDirection.row) {
col = 0;
row = position;
}
final cell = node.children.firstWhereOrNull(
(n) =>
n.attributes[TableCellBlockKeys.colPosition] == col &&
n.attributes[TableCellBlockKeys.rowPosition] == row,
);
final key = dir == TableDirection.col
? TableCellBlockKeys.colBackgroundColor
: TableCellBlockKeys.rowBackgroundColor;
final bgColor = cell?.attributes[key] as String?;
final selectedColor = bgColor?.toColor();
// get default background color from themeExtension
final defaultColor = AFThemeExtension.of(context).tableCellBGColor;
final colors = [
// reset to default background color
FlowyColorOption(
color: defaultColor,
name: LocaleKeys.document_plugins_optionAction_defaultColor.tr(),
),
...FlowyTint.values.map(
(e) => FlowyColorOption(
color: e.color(context),
name: e.tintName(AppFlowyEditorLocalizations.current),
),
),
];
return FlowyColorPicker(
colors: colors,
selected: selectedColor,
border: Border.all(
color: Theme.of(context).colorScheme.onBackground,
width: 1,
),
onTap: (color, index) async {
final backgroundColor = selectedColor != color ? color.toHex() : "";
TableActions.setBgColor(
node,
position,
editorState,
backgroundColor,
dir,
);
controller.close();
parentController.close();
},
);
};
}
@@ -132,7 +132,7 @@ class _ToggleListBlockComponentWidgetState
EdgeInsets get indentPadding => configuration.indentPadding(
node,
calculateTextDirection(
defaultTextDirection: Directionality.maybeOf(context),
layoutDirection: Directionality.maybeOf(context),
),
);
@@ -148,7 +148,7 @@ class _ToggleListBlockComponentWidgetState
@override
Widget buildComponent(BuildContext context) {
final textDirection = calculateTextDirection(
defaultTextDirection: Directionality.maybeOf(context),
layoutDirection: Directionality.maybeOf(context),
);
Widget child = Container(
@@ -195,7 +195,7 @@ class _ToggleListBlockComponentWidgetState
child: child,
);
if (widget.actionBuilder != null) {
if (widget.showActions && widget.actionBuilder != null) {
child = BlockComponentActionWrapper(
node: node,
actionBuilder: widget.actionBuilder!,
@@ -1,16 +1,17 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/plugins/document/application/share_bloc.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/util/string_extension.dart';
import 'package:appflowy/workspace/application/view/view_listener.dart';
import 'package:appflowy/workspace/presentation/home/toast.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_backend/protobuf/flowy-document2/entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/file_picker/file_picker_service.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -119,7 +120,7 @@ class ShareActionListState extends State<ShareActionList> {
final exportPath = await getIt<FilePickerService>().saveFile(
dialogTitle: '',
// encode the file name in case it contains special characters
fileName: '${Uri.encodeComponent(name)}.md',
fileName: '${name.toFileName()}.md',
);
if (exportPath != null) {
docShareBloc.add(DocShareEvent.shareMarkdown(exportPath));
@@ -34,7 +34,6 @@ AppFlowyEnv getAppFlowyEnv() {
enable_sync: true,
url: Env.supabaseUrl,
anon_key: Env.supabaseAnonKey,
jwt_secret: Env.supabaseJwtSecret,
);
return AppFlowyEnv(
@@ -46,19 +46,12 @@ class InitSupabaseTask extends LaunchTask {
realtimeService = null;
}
realtimeService = SupbaseRealtimeService(supabase: initializedSupabase);
supabase = initializedSupabase;
if (Platform.isWindows) {
// register deep link for Windows
registerProtocolHandler(appflowyDeepLinkSchema);
} else if (Platform.isLinux) {
// register deep link for Linux
await SupabaseAuth.instance.registerDBusService(
// these values should be compatible with the values in the desktop file
// dbus-interface.xml
'/io/appflowy/AppFlowy/Object',
'io.appflowy.AppFlowy',
);
}
}
}
@@ -12,8 +12,20 @@ class AuthServiceMapKeys {
static const String deviceId = 'device_id';
}
/// `AuthService` is an abstract class that defines methods related to user authentication.
///
/// This service provides various methods for user sign-in, sign-up,
/// OAuth-based registration, and other related functionalities.
abstract class AuthService {
/// Authenticates a user with their email and password.
///
/// - `email`: The email address of the user.
/// - `password`: The password of the user.
/// - `authType`: The type of authentication (optional).
/// - `params`: Additional parameters for authentication (optional).
///
/// Returns [UserProfilePB] if the user is authenticated, otherwise returns [FlowyError].
Future<Either<FlowyError, UserProfilePB>> signIn({
required String email,
required String password,
@@ -21,6 +33,14 @@ abstract class AuthService {
Map<String, String> params,
});
/// Registers a new user with their name, email, and password.
///
/// - `name`: The name of the user.
/// - `email`: The email address of the user.
/// - `password`: The password of the user.
/// - `authType`: The type of authentication (optional).
/// - `params`: Additional parameters for registration (optional).
///
/// Returns [UserProfilePB] if the user is authenticated, otherwise returns [FlowyError].
Future<Either<FlowyError, UserProfilePB>> signUp({
required String name,
@@ -30,27 +50,46 @@ abstract class AuthService {
Map<String, String> params,
});
/// Registers a new user with an OAuth platform.
///
/// - `platform`: The OAuth platform name.
/// - `authType`: The type of authentication (optional).
/// - `params`: Additional parameters for OAuth registration (optional).
///
/// Returns [UserProfilePB] if the user is authenticated, otherwise returns [FlowyError].
Future<Either<FlowyError, UserProfilePB>> signUpWithOAuth({
required String platform,
AuthTypePB authType,
Map<String, String> params,
});
/// Returns a default [UserProfilePB]
/// Registers a user as a guest.
///
/// - `authType`: The type of authentication (optional).
/// - `params`: Additional parameters for guest registration (optional).
///
/// Returns a default [UserProfilePB].
Future<Either<FlowyError, UserProfilePB>> signUpAsGuest({
AuthTypePB authType,
Map<String, String> params,
});
/// Authenticates a user with a magic link sent to their email.
///
/// - `email`: The email address of the user.
/// - `params`: Additional parameters for authentication with magic link (optional).
///
/// Returns [UserProfilePB] if the user is authenticated, otherwise returns [FlowyError].
Future<Either<FlowyError, UserProfilePB>> signInWithMagicLink({
required String email,
Map<String, String> params,
});
///
/// Signs out the currently authenticated user.
Future<void> signOut();
/// Returns [UserProfilePB] if the user has sign in, otherwise returns null.
/// Retrieves the currently authenticated user's profile.
///
/// Returns [UserProfilePB] if the user has signed in, otherwise returns [FlowyError].
Future<Either<FlowyError, UserProfilePB>> getUser();
}
@@ -2,6 +2,7 @@ import 'package:appflowy/core/config/kv.dart';
import 'package:appflowy/core/config/kv_keys.dart';
import 'package:appflowy/core/frameless_window.dart';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/user/application/auth/auth_service.dart';
import 'package:appflowy/user/application/historical_user_bloc.dart';
@@ -12,16 +13,15 @@ import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/size.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flowy_infra_ui/widget/rounded_input_field.dart';
import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
class SignInScreen extends StatelessWidget {
const SignInScreen({
@@ -73,19 +73,27 @@ class SignInScreen extends StatelessWidget {
}
void handleOpenWorkspaceError(BuildContext context, FlowyError error) {
if (error.code == ErrorCode.WorkspaceDataNotSync) {
final userFolder = UserFolderPB.fromBuffer(error.payload);
getIt<AuthRouter>().pushWorkspaceErrorScreen(context, userFolder, error);
} else {
Log.error(error);
showSnapBar(
context,
error.msg,
onClosed: () {
getIt<AuthService>().signOut();
runAppFlowy();
},
);
Log.error(error);
switch (error.code) {
case ErrorCode.WorkspaceDataNotSync:
final userFolder = UserFolderPB.fromBuffer(error.payload);
getIt<AuthRouter>().pushWorkspaceErrorScreen(context, userFolder, error);
break;
case ErrorCode.InvalidEncryptSecret:
showSnapBar(
context,
error.msg,
);
break;
default:
showSnapBar(
context,
error.msg,
onClosed: () {
getIt<AuthService>().signOut();
runAppFlowy();
},
);
}
}
@@ -422,26 +430,10 @@ class ThirdPartySignInButtons extends StatelessWidget {
mainAxisAlignment: mainAxisAlignment,
children: const [
GoogleSignUpButton(),
// const SizedBox(width: 20),
// ThirdPartySignInButton(
// icon: 'login/github-mark',
// onPressed: () {
// getIt<KeyValueStorage>().set(KVKeys.loginType, 'supabase');
// context
// .read<SignInBloc>()
// .add(const SignInEvent.signedInWithOAuth('github'));
// },
// ),
// const SizedBox(width: 20),
// ThirdPartySignInButton(
// icon: 'login/discord-mark',
// onPressed: () {
// getIt<KeyValueStorage>().set(KVKeys.loginType, 'supabase');
// context
// .read<SignInBloc>()
// .add(const SignInEvent.signedInWithOAuth('discord'));
// },
// ),
SizedBox(width: 20),
GitHubSignUpButton(),
SizedBox(width: 20),
DiscordSignUpButton(),
],
);
}
@@ -463,3 +455,37 @@ class GoogleSignUpButton extends StatelessWidget {
);
}
}
class GitHubSignUpButton extends StatelessWidget {
const GitHubSignUpButton({super.key});
@override
Widget build(BuildContext context) {
return ThirdPartySignInButton(
icon: FlowySvgs.github_mark_s,
onPressed: () {
getIt<KeyValueStorage>().set(KVKeys.loginType, 'supabase');
context
.read<SignInBloc>()
.add(const SignInEvent.signedInWithOAuth('github'));
},
);
}
}
class DiscordSignUpButton extends StatelessWidget {
const DiscordSignUpButton({super.key});
@override
Widget build(BuildContext context) {
return ThirdPartySignInButton(
icon: FlowySvgs.discord_mark_s,
onPressed: () {
getIt<KeyValueStorage>().set(KVKeys.loginType, 'supabase');
context
.read<SignInBloc>()
.add(const SignInEvent.signedInWithOAuth('discord'));
},
);
}
}
@@ -0,0 +1,20 @@
import 'package:flutter/material.dart';
extension EncodeString on String {
static const _specialCharacters = r'\/:*?"<>| ';
/// Encode a string to a file name.
///
/// Normalizes the string to remove special characters and replaces the "\/:*?"<>|" with underscores.
String toFileName() {
final buffer = StringBuffer();
for (final character in characters) {
if (_specialCharacters.contains(character)) {
buffer.write('_');
} else {
buffer.write(character);
}
}
return buffer.toString();
}
}
@@ -362,6 +362,7 @@ class AppearanceSettingsState with _$AppearanceSettingsState {
fontColor: theme.shader3,
),
calloutBGColor: theme.hoverBG3,
tableCellBGColor: theme.surface,
caption: _getFontStyle(
fontFamily: fontFamily,
fontSize: FontSizes.s11,
@@ -57,6 +57,14 @@ class SettingsUserViewBloc extends Bloc<SettingsUserEvent, SettingsUserState> {
openHistoricalUser: (HistoricalUserPB historicalUser) async {
await UserBackendService.openHistoricalUser(historicalUser);
},
updateUserEmail: (String email) {
_userService.updateUserProfile(email: email).then((result) {
result.fold(
(l) => null,
(err) => Log.error(err),
);
});
},
);
});
}
@@ -96,6 +104,7 @@ class SettingsUserViewBloc extends Bloc<SettingsUserEvent, SettingsUserState> {
class SettingsUserEvent with _$SettingsUserEvent {
const factory SettingsUserEvent.initial() = _Initial;
const factory SettingsUserEvent.updateUserName(String name) = _UpdateUserName;
const factory SettingsUserEvent.updateUserEmail(String email) = _UpdateEmail;
const factory SettingsUserEvent.updateUserIcon(String iconUrl) =
_UpdateUserIcon;
const factory SettingsUserEvent.updateUserOpenAIKey(String openAIKey) =
@@ -5,6 +5,7 @@ import 'package:appflowy/workspace/application/menu/menu_bloc.dart';
import 'package:appflowy/workspace/application/sidebar/folder/folder_bloc.dart';
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
import 'package:appflowy/workspace/presentation/home/menu/view/view_item.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
@@ -117,13 +118,22 @@ class _PersonalFolderHeaderState extends State<PersonalFolderHeader> {
width: iconSize,
icon: const FlowySvg(FlowySvgs.add_s),
onPressed: () {
context.read<MenuBloc>().add(
MenuEvent.createApp(
LocaleKeys.menuAppHeader_defaultNewPageName.tr(),
index: 0,
),
);
widget.onAdded();
NavigatorTextFieldDialog(
title: LocaleKeys.newPageText.tr(),
value: '',
confirm: (value) {
if (value.isNotEmpty) {
context.read<MenuBloc>().add(
MenuEvent.createApp(
value,
index: 0,
),
);
widget.onAdded();
}
},
).show(context);
},
),
]
@@ -12,9 +12,9 @@ import 'package:appflowy/workspace/presentation/home/menu/view/view_action_type.
import 'package:appflowy/workspace/presentation/home/menu/view/view_add_button.dart';
import 'package:appflowy/workspace/presentation/home/menu/view/view_more_action_button.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -350,13 +350,22 @@ class _SingleInnerViewItemState extends State<SingleInnerViewItem> {
createNewView,
) {
if (createNewView) {
context.read<ViewBloc>().add(
ViewEvent.createView(
name ?? LocaleKeys.menuAppHeader_defaultNewPageName.tr(),
pluginBuilder.layoutType!,
openAfterCreated: openAfterCreated,
),
);
NavigatorTextFieldDialog(
title: _convertLayoutToHintText(pluginBuilder.layoutType!),
value: LocaleKeys.menuAppHeader_defaultNewPageName.tr(),
autoSelectAllText: true,
confirm: (value) {
if (value.isNotEmpty) {
context.read<ViewBloc>().add(
ViewEvent.createView(
value,
pluginBuilder.layoutType!,
openAfterCreated: openAfterCreated,
),
);
}
},
).show(context);
}
context.read<ViewBloc>().add(
const ViewEvent.setIsExpanded(true),
@@ -408,6 +417,20 @@ class _SingleInnerViewItemState extends State<SingleInnerViewItem> {
),
);
}
String _convertLayoutToHintText(ViewLayoutPB layout) {
switch (layout) {
case ViewLayoutPB.Document:
return LocaleKeys.newDocumentText.tr();
case ViewLayoutPB.Grid:
return LocaleKeys.newGridText.tr();
case ViewLayoutPB.Board:
return LocaleKeys.newBoardText.tr();
case ViewLayoutPB.Calendar:
return LocaleKeys.newCalendarText.tr();
}
return LocaleKeys.newPageText.tr();
}
}
class _DotIconWidget extends StatelessWidget {
@@ -31,6 +31,14 @@ class SettingThirdPartyLogin extends StatelessWidget {
final indicator = state.isSubmitting
? const CircularProgressIndicator.adaptive()
: const SizedBox.shrink();
final promptMessage = state.isSubmitting
? FlowyText.medium(
LocaleKeys.signIn_syncPromptMessage.tr(),
maxLines: null,
)
: const SizedBox.shrink();
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -45,9 +53,12 @@ class SettingThirdPartyLogin extends StatelessWidget {
],
),
const VSpace(6),
promptMessage,
const VSpace(6),
const ThirdPartySignInButtons(
mainAxisAlignment: MainAxisAlignment.start,
),
const VSpace(6),
],
);
},
@@ -50,6 +50,12 @@ class SettingsUserView extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
_renderUserNameInput(context),
if (isSupabaseEnabled) ...[
const VSpace(20),
UserEmailInput(user.email)
],
const VSpace(20),
_renderCurrentIcon(context),
const VSpace(20),
@@ -174,6 +180,70 @@ class UserNameInputState extends State<UserNameInput> {
}
}
@visibleForTesting
class UserEmailInput extends StatefulWidget {
final String email;
const UserEmailInput(
this.email, {
Key? key,
}) : super(key: key);
@override
UserEmailInputState createState() => UserEmailInputState();
}
class UserEmailInputState extends State<UserEmailInput> {
late TextEditingController _controller;
Timer? _debounce;
final Duration _debounceDuration = const Duration(milliseconds: 500);
@override
void initState() {
super.initState();
_controller = TextEditingController(text: widget.email);
}
@override
Widget build(BuildContext context) {
return TextField(
controller: _controller,
decoration: InputDecoration(
labelText: LocaleKeys.settings_user_email.tr(),
labelStyle: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(fontWeight: FontWeight.w500),
enabledBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: Theme.of(context).colorScheme.onBackground),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Theme.of(context).colorScheme.primary),
),
),
onChanged: (val) {
if (_debounce?.isActive ?? false) {
_debounce!.cancel();
}
_debounce = Timer(_debounceDuration, () {
context
.read<SettingsUserViewBloc>()
.add(SettingsUserEvent.updateUserEmail(val));
});
},
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}
class _OpenaiKeyInput extends StatefulWidget {
final String openAIKey;
const _OpenaiKeyInput(
@@ -29,9 +29,30 @@ class QuestionBubble extends StatelessWidget {
}
}
class BubbleActionList extends StatelessWidget {
class BubbleActionList extends StatefulWidget {
const BubbleActionList({Key? key}) : super(key: key);
@override
State<BubbleActionList> createState() => _BubbleActionListState();
}
class _BubbleActionListState extends State<BubbleActionList> {
bool isOpen = false;
Color get fontColor => isOpen
? Theme.of(context).colorScheme.onPrimary
: Theme.of(context).colorScheme.tertiary;
Color get fillColor => isOpen
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.tertiaryContainer;
void toggle() {
setState(() {
isOpen = !isOpen;
});
}
@override
Widget build(BuildContext context) {
final List<PopoverAction> actions = [];
@@ -49,14 +70,18 @@ class BubbleActionList extends StatelessWidget {
'?',
tooltip: LocaleKeys.questionBubble_help.tr(),
fontWeight: FontWeight.w600,
fontColor: Theme.of(context).colorScheme.tertiary,
fillColor: Theme.of(context).colorScheme.tertiaryContainer,
hoverColor: Theme.of(context).colorScheme.tertiaryContainer,
fontColor: fontColor,
fillColor: fillColor,
hoverColor: Theme.of(context).colorScheme.primary,
mainAxisAlignment: MainAxisAlignment.center,
radius: Corners.s10Border,
onPressed: () => controller.show(),
onPressed: () {
toggle();
controller.show();
},
);
},
onClosed: toggle,
onSelected: (action, controller) {
if (action is BubbleActionWrapper) {
switch (action.inner) {
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.10)
project(runner LANGUAGES CXX)
set(BINARY_NAME "AppFlowy")
set(APPLICATION_ID "io.appflowy.appflowy")
set(APPLICATION_ID "io.appflowy.AppFlowy")
cmake_policy(SET CMP0063 NEW)
@@ -55,6 +55,7 @@ apply_standard_settings(${BINARY_NAME})
target_link_libraries(${BINARY_NAME} PRIVATE flutter)
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
add_dependencies(${BINARY_NAME} flutter_assemble)
# Only the install-generated bundle's copy of the executable will launch
# correctly, since the resources must in the right relative locations. To avoid
# people trying to run the unbundled copy, put it in a subdirectory instead of
@@ -68,11 +69,11 @@ set_target_properties(${BINARY_NAME}
# them to the application.
include(flutter/generated_plugins.cmake)
# === Installation ===
# By default, "installing" just makes a relocatable bundle in the build
# directory.
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
endif()
@@ -19,6 +19,13 @@ G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
static void my_application_activate(GApplication *application)
{
MyApplication *self = MY_APPLICATION(application);
GList* windows = gtk_application_get_windows(GTK_APPLICATION(application));
if (windows) {
gtk_window_present(GTK_WINDOW(windows->data));
return;
}
GtkWindow *window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
@@ -87,7 +94,7 @@ static gboolean my_application_local_command_line(GApplication *application, gch
g_application_activate(application);
*exit_status = 0;
return TRUE;
return FALSE;
}
// Implements GObject::dispose.
@@ -107,10 +114,9 @@ static void my_application_class_init(MyApplicationClass *klass)
static void my_application_init(MyApplication *self) {}
MyApplication *my_application_new()
{
MyApplication* my_application_new() {
return MY_APPLICATION(g_object_new(my_application_get_type(),
"application-id", APPLICATION_ID,
"flags", G_APPLICATION_NON_UNIQUE,
"flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN,
nullptr));
}
@@ -27,13 +27,11 @@ class SupabaseConfiguration {
final bool enable_sync;
final String url;
final String anon_key;
final String jwt_secret;
SupabaseConfiguration({
this.enable_sync = true,
required this.url,
required this.anon_key,
required this.jwt_secret,
});
factory SupabaseConfiguration.fromJson(Map<String, dynamic> json) =>
@@ -22,7 +22,6 @@ SupabaseConfiguration _$SupabaseConfigurationFromJson(
enable_sync: json['enable_sync'] as bool? ?? true,
url: json['url'] as String,
anon_key: json['anon_key'] as String,
jwt_secret: json['jwt_secret'] as String,
);
Map<String, dynamic> _$SupabaseConfigurationToJson(
@@ -31,5 +30,4 @@ Map<String, dynamic> _$SupabaseConfigurationToJson(
'enable_sync': instance.enable_sync,
'url': instance.url,
'anon_key': instance.anon_key,
'jwt_secret': instance.jwt_secret,
};
@@ -23,6 +23,7 @@ class AFThemeExtension extends ThemeExtension<AFThemeExtension> {
final Color progressBarBGColor;
final Color toggleButtonBGColor;
final Color calloutBGColor;
final Color tableCellBGColor;
final TextStyle code;
final TextStyle callout;
@@ -46,6 +47,7 @@ class AFThemeExtension extends ThemeExtension<AFThemeExtension> {
required this.toggleOffFill,
required this.textColor,
required this.calloutBGColor,
required this.tableCellBGColor,
required this.code,
required this.callout,
required this.caption,
@@ -72,6 +74,7 @@ class AFThemeExtension extends ThemeExtension<AFThemeExtension> {
Color? tint9,
Color? textColor,
Color? calloutBGColor,
Color? tableCellBGColor,
Color? greyHover,
Color? greySelect,
Color? lightGreyHover,
@@ -96,6 +99,7 @@ class AFThemeExtension extends ThemeExtension<AFThemeExtension> {
tint9: tint9 ?? this.tint9,
textColor: textColor ?? this.textColor,
calloutBGColor: calloutBGColor ?? this.calloutBGColor,
tableCellBGColor: tableCellBGColor ?? this.tableCellBGColor,
greyHover: greyHover ?? this.greyHover,
greySelect: greySelect ?? this.greySelect,
lightGreyHover: lightGreyHover ?? this.lightGreyHover,
@@ -128,6 +132,8 @@ class AFThemeExtension extends ThemeExtension<AFThemeExtension> {
tint9: Color.lerp(tint9, other.tint9, t)!,
textColor: Color.lerp(textColor, other.textColor, t)!,
calloutBGColor: Color.lerp(calloutBGColor, other.calloutBGColor, t)!,
tableCellBGColor:
Color.lerp(tableCellBGColor, other.tableCellBGColor, t)!,
greyHover: Color.lerp(greyHover, other.greyHover, t)!,
greySelect: Color.lerp(greySelect, other.greySelect, t)!,
lightGreyHover: Color.lerp(lightGreyHover, other.lightGreyHover, t)!,
@@ -7,7 +7,7 @@ void showSnapBar(BuildContext context, String title, {VoidCallback? onClosed}) {
ScaffoldMessenger.of(context)
.showSnackBar(
SnackBar(
duration: const Duration(milliseconds: 10000),
duration: const Duration(milliseconds: 8000),
content: WillPopScope(
onWillPop: () async {
ScaffoldMessenger.of(context).removeCurrentSnackBar();
+20 -12
View File
@@ -29,8 +29,8 @@ packages:
dependency: "direct overridden"
description:
path: "."
ref: f897e1d
resolved-ref: f897e1d81a3d9fcea632588479bc2814d493f7b5
ref: c64ce17
resolved-ref: c64ce174586267dbab1185ef9acb19b7c49fc7bd
url: "https://github.com/LucasXu0/app_links"
source: git
version: "3.4.3"
@@ -54,11 +54,11 @@ packages:
dependency: "direct main"
description:
path: "."
ref: f4db21c
resolved-ref: f4db21c3678290d133ae6cffa015d3d79920bf84
ref: "3f2db9b"
resolved-ref: "3f2db9b416f7c7512acba397e0cbb342fabaf7a2"
url: "https://github.com/AppFlowy-IO/appflowy-editor.git"
source: git
version: "1.2.3"
version: "1.3.0"
appflowy_popover:
dependency: "direct main"
description:
@@ -628,6 +628,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.1"
gtk:
dependency: transitive
description:
name: gtk
sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
url: "https://pub.dev"
source: hosted
version: "2.1.0"
highlight:
dependency: "direct main"
description:
@@ -1109,10 +1117,10 @@ packages:
dependency: transitive
description:
name: realtime_client
sha256: ff743de9bb0f46fcfffcfe64ae93062702dcd0f83a2ce8adc40d5fb7f542af90
sha256: b4b7bb293417dafc73943ed639209b2dcb796db8495e56bba29a4e26fadef5cd
url: "https://pub.dev"
source: hosted
version: "1.1.3"
version: "1.2.1"
reorderables:
dependency: "direct main"
description:
@@ -1434,19 +1442,19 @@ packages:
dependency: transitive
description:
name: supabase
sha256: "291e065aa8c9be06a0348743c184beafd038e109960bc3da201affd3eda811fc"
sha256: c48671b62720f15067f6b31abe964950bf1405b7eec367a97f683dee25715a77
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.11.1"
supabase_flutter:
dependency: "direct main"
description:
path: "packages/supabase_flutter"
ref: e882842
resolved-ref: e8828421720896c0e1600de18f0db54f9f96a3b3
ref: "852119e"
resolved-ref: "852119e110224cce83b332e8681bc6f216a56c05"
url: "https://github.com/LucasXu0/supabase-flutter"
source: git
version: "1.10.12"
version: "1.10.14"
super_clipboard:
dependency: "direct main"
description:
+4 -4
View File
@@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 0.3.0
version: 0.3.1
environment:
sdk: ">=3.0.0 <4.0.0"
@@ -48,7 +48,7 @@ dependencies:
appflowy_editor:
git:
url: https://github.com/AppFlowy-IO/appflowy-editor.git
ref: f4db21c
ref: 3f2db9b
appflowy_popover:
path: packages/appflowy_popover
@@ -131,12 +131,12 @@ dependency_overrides:
supabase_flutter:
git:
url: https://github.com/LucasXu0/supabase-flutter
ref: e882842
ref: 852119e
path: packages/supabase_flutter
app_links:
git:
url: https://github.com/LucasXu0/app_links
ref: f897e1d
ref: c64ce17
url_protocol:
git:
url: https://github.com/LucasXu0/flutter_url_protocol.git
@@ -0,0 +1,152 @@
import 'package:appflowy_backend/protobuf/flowy-document2/protobuf.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:appflowy/plugins/document/application/editor_transaction_adapter.dart';
void main() {
group('TransactionAdapter', () {
test('toBlockAction insert node with children operation', () {
final editorState = EditorState.blank();
final transaction = editorState.transaction;
transaction.insertNode(
[0],
paragraphNode(
children: [
paragraphNode(text: '1', children: [paragraphNode(text: '1.1')]),
paragraphNode(text: '2'),
paragraphNode(text: '3', children: [paragraphNode(text: '3.1')]),
paragraphNode(text: '4'),
],
),
);
expect(transaction.operations.length, 1);
expect(transaction.operations[0] is InsertOperation, true);
final actions = transaction.operations[0].toBlockAction(editorState);
expect(actions.length, 7);
for (final action in actions) {
expect(action.action, BlockActionTypePB.Insert);
}
expect(
actions[0].payload.parentId,
editorState.document.root.id,
reason: '0 - parent id',
);
expect(
actions[0].payload.prevId,
editorState.document.root.children.first.id,
reason: '0 - prev id',
);
expect(
actions[1].payload.parentId,
actions[0].payload.block.id,
reason: '1 - parent id',
);
expect(
actions[1].payload.prevId,
'',
reason: '1 - prev id',
);
expect(
actions[2].payload.parentId,
actions[1].payload.block.id,
reason: '2 - parent id',
);
expect(
actions[2].payload.prevId,
'',
reason: '2 - prev id',
);
expect(
actions[3].payload.parentId,
actions[0].payload.block.id,
reason: '3 - parent id',
);
expect(
actions[3].payload.prevId,
actions[1].payload.block.id,
reason: '3 - prev id',
);
expect(
actions[4].payload.parentId,
actions[0].payload.block.id,
reason: '4 - parent id',
);
expect(
actions[4].payload.prevId,
actions[3].payload.block.id,
reason: '4 - prev id',
);
expect(
actions[5].payload.parentId,
actions[4].payload.block.id,
reason: '5 - parent id',
);
expect(
actions[5].payload.prevId,
'',
reason: '5 - prev id',
);
expect(
actions[6].payload.parentId,
actions[0].payload.block.id,
reason: '6 - parent id',
);
expect(
actions[6].payload.prevId,
actions[4].payload.block.id,
reason: '6 - prev id',
);
});
test('toBlockAction insert node before all children nodes', () {
final document = Document(
root: Node(
type: 'page',
children: [
paragraphNode(children: [paragraphNode(text: '1')])
],
),
);
final editorState = EditorState(document: document);
final transaction = editorState.transaction;
transaction.insertNodes([0, 0], [paragraphNode(), paragraphNode()]);
expect(transaction.operations.length, 1);
expect(transaction.operations[0] is InsertOperation, true);
final actions = transaction.operations[0].toBlockAction(editorState);
expect(actions.length, 2);
for (final action in actions) {
expect(action.action, BlockActionTypePB.Insert);
}
expect(
actions[0].payload.parentId,
editorState.document.root.children.first.id,
reason: '0 - parent id',
);
expect(
actions[0].payload.prevId,
'',
reason: '0 - prev id',
);
expect(
actions[1].payload.parentId,
editorState.document.root.children.first.id,
reason: '1 - parent id',
);
expect(
actions[1].payload.prevId,
actions[0].payload.block.id,
reason: '1 - prev id',
);
});
});
}
+128 -69
View File
@@ -140,7 +140,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
[[package]]
name = "appflowy-integrate"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"collab",
@@ -203,18 +203,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
name = "async-trait"
version = "0.1.68"
version = "0.1.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -307,7 +307,7 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -728,7 +728,7 @@ dependencies = [
[[package]]
name = "collab"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"bytes",
@@ -746,7 +746,7 @@ dependencies = [
[[package]]
name = "collab-client-ws"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"bytes",
"collab-sync",
@@ -764,7 +764,7 @@ dependencies = [
[[package]]
name = "collab-database"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"async-trait",
@@ -781,6 +781,8 @@ dependencies = [
"serde",
"serde_json",
"serde_repr",
"strum",
"strum_macros 0.25.2",
"thiserror",
"tokio",
"tokio-stream",
@@ -791,15 +793,19 @@ dependencies = [
[[package]]
name = "collab-define"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"collab",
"serde",
"serde_repr",
"uuid",
]
[[package]]
name = "collab-derive"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"proc-macro2",
"quote",
@@ -811,7 +817,7 @@ dependencies = [
[[package]]
name = "collab-document"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"collab",
@@ -830,7 +836,7 @@ dependencies = [
[[package]]
name = "collab-folder"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"chrono",
@@ -850,7 +856,7 @@ dependencies = [
[[package]]
name = "collab-persistence"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"bincode",
"chrono",
@@ -870,7 +876,7 @@ dependencies = [
[[package]]
name = "collab-plugins"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"async-trait",
@@ -882,7 +888,6 @@ dependencies = [
"futures-util",
"parking_lot 0.12.1",
"rand 0.8.5",
"rusoto_credential",
"serde",
"serde_json",
"similar 2.2.1",
@@ -899,7 +904,7 @@ dependencies = [
[[package]]
name = "collab-sync"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"bytes",
"collab",
@@ -921,10 +926,11 @@ dependencies = [
[[package]]
name = "collab-user"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=cff1b9#cff1b99f4ed51f65dab73492eac4da8e7907f079"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=223011#223011a4340d0d98e7e10ca6bb19b8d622b0f568"
dependencies = [
"anyhow",
"collab",
"collab-define",
"parking_lot 0.12.1",
"serde",
"serde_json",
@@ -1118,7 +1124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -1182,7 +1188,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -1193,7 +1199,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a"
dependencies = [
"darling_core",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -1544,7 +1550,7 @@ dependencies = [
"flowy-sqlite",
"lib-dispatch",
"protobuf",
"strum_macros",
"strum_macros 0.21.1",
]
[[package]]
@@ -1629,7 +1635,7 @@ dependencies = [
"serde_json",
"serde_repr",
"strum",
"strum_macros",
"strum_macros 0.25.2",
"tokio",
"tracing",
"url",
@@ -1683,7 +1689,7 @@ dependencies = [
"protobuf",
"serde",
"serde_json",
"strum_macros",
"strum_macros 0.21.1",
"tokio",
"tokio-stream",
"tracing",
@@ -1756,7 +1762,7 @@ dependencies = [
"nanoid",
"parking_lot 0.12.1",
"protobuf",
"strum_macros",
"strum_macros 0.21.1",
"tokio",
"tokio-stream",
"tracing",
@@ -1806,6 +1812,7 @@ dependencies = [
"flowy-error",
"flowy-folder-deps",
"flowy-server-config",
"flowy-storage",
"flowy-user-deps",
"futures",
"futures-util",
@@ -1813,6 +1820,7 @@ dependencies = [
"hyper",
"lazy_static",
"lib-infra",
"mime_guess",
"parking_lot 0.12.1",
"postgrest",
"reqwest",
@@ -1822,7 +1830,9 @@ dependencies = [
"thiserror",
"tokio",
"tokio-retry",
"tokio-util",
"tracing",
"url",
"uuid",
]
@@ -1853,6 +1863,18 @@ dependencies = [
"tracing",
]
[[package]]
name = "flowy-storage"
version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"bytes",
"reqwest",
"serde",
"serde_json",
]
[[package]]
name = "flowy-task"
version = "0.1.0"
@@ -1868,11 +1890,13 @@ dependencies = [
name = "flowy-user"
version = "0.1.0"
dependencies = [
"anyhow",
"appflowy-integrate",
"base64 0.21.2",
"bytes",
"chrono",
"collab",
"collab-database",
"collab-document",
"collab-folder",
"collab-user",
@@ -1883,6 +1907,7 @@ dependencies = [
"flowy-derive",
"flowy-encrypt",
"flowy-error",
"flowy-folder-deps",
"flowy-notification",
"flowy-server-config",
"flowy-sqlite",
@@ -1897,7 +1922,7 @@ dependencies = [
"serde",
"serde_json",
"serde_repr",
"strum_macros",
"strum_macros 0.21.1",
"tokio",
"tracing",
"unicode-segmentation",
@@ -2033,7 +2058,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -3178,6 +3203,16 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "mime_guess"
version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
dependencies = [
"mime",
"unicase",
]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@@ -3455,7 +3490,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -3464,6 +3499,15 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
version = "111.27.0+1.1.1v"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
version = "0.9.90"
@@ -3472,6 +3516,7 @@ checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6"
dependencies = [
"cc",
"libc",
"openssl-src",
"pkg-config",
"vcpkg",
]
@@ -3632,7 +3677,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -3810,7 +3855,7 @@ checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -3927,7 +3972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282"
dependencies = [
"proc-macro2",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -4106,9 +4151,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.28"
version = "1.0.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
checksum = "5907a1b7c277254a8b15170f6e7c97cfa60ee7872a3217663bb81151e48184bb"
dependencies = [
"proc-macro2",
]
@@ -4336,6 +4381,7 @@ dependencies = [
"js-sys",
"log",
"mime",
"mime_guess",
"native-tls",
"once_cell",
"percent-encoding",
@@ -4348,10 +4394,12 @@ dependencies = [
"tokio",
"tokio-native-tls",
"tokio-rustls",
"tokio-util",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
"webpki-roots",
"winreg 0.10.1",
@@ -4410,24 +4458,6 @@ dependencies = [
"librocksdb-sys",
]
[[package]]
name = "rusoto_credential"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee0a6c13db5aad6047b6a44ef023dbbc21a056b6dab5be3b79ce4283d5c02d05"
dependencies = [
"async-trait",
"chrono",
"dirs-next",
"futures",
"hyper",
"serde",
"serde_json",
"shlex",
"tokio",
"zeroize",
]
[[package]]
name = "rust_decimal"
version = "1.30.0"
@@ -4685,7 +4715,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -4707,7 +4737,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -4756,7 +4786,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -5041,9 +5071,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strum"
version = "0.21.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
[[package]]
name = "strum_macros"
@@ -5057,6 +5087,19 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "strum_macros"
version = "0.25.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059"
dependencies = [
"heck 0.4.1",
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.29",
]
[[package]]
name = "subtle"
version = "2.5.0"
@@ -5076,9 +5119,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.22"
version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616"
checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [
"proc-macro2",
"quote",
@@ -5457,7 +5500,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -5560,7 +5603,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -5737,7 +5780,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
]
[[package]]
@@ -5933,6 +5976,15 @@ dependencies = [
"unic-common",
]
[[package]]
name = "unicase"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
dependencies = [
"version_check",
]
[[package]]
name = "unicode-bidi"
version = "0.3.13"
@@ -6133,7 +6185,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
"wasm-bindgen-shared",
]
@@ -6167,7 +6219,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.22",
"syn 2.0.29",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -6178,6 +6230,19 @@ version = "0.2.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
[[package]]
name = "wasm-streams"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078"
dependencies = [
"futures-util",
"js-sys",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
]
[[package]]
name = "web-sys"
version = "0.3.64"
@@ -6681,12 +6746,6 @@ dependencies = [
"thiserror",
]
[[package]]
name = "zeroize"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
[[package]]
name = "zstd-sys"
version = "2.0.8+zstd.1.5.5"
+9 -9
View File
@@ -34,15 +34,15 @@ default = ["custom-protocol"]
custom-protocol = ["tauri/custom-protocol"]
[patch.crates-io]
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-persistence = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
appflowy-integrate = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab-define = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "cff1b9" }
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-persistence = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
appflowy-integrate = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
collab-define = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "223011" }
#collab = { path = "../../../../AppFlowy-Collab/collab" }
#collab-folder = { path = "../../../../AppFlowy-Collab/collab-folder" }
@@ -25,7 +25,7 @@ export class DateCellDataPersistence extends CellDataPersistence<CalendarData> {
save(data: CalendarData): Promise<Result<void, FlowyError>> {
const payload = DateChangesetPB.fromObject({ cell_id: _makeCellId(this.cellIdentifier) });
payload.date = ((data.date.getTime() / 1000) | 0).toString();
payload.date = (data.date.getTime() / 1000) | 0;
if (data.time !== undefined) {
payload.time = data.time;
}
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="127px" height="96px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.982" fill="#5864f2" d="M 40.5,-0.5 C 42.5,-0.5 44.5,-0.5 46.5,-0.5C 46.7534,3.03777 48.5868,5.03777 52,5.5C 59.3333,4.16667 66.6667,4.16667 74,5.5C 77.4132,5.03777 79.2466,3.03777 79.5,-0.5C 81.8333,-0.5 84.1667,-0.5 86.5,-0.5C 93.6784,1.84095 100.845,4.50762 108,7.5C 117.556,21.9281 123.723,37.5947 126.5,54.5C 126.5,63.1667 126.5,71.8333 126.5,80.5C 117.234,86.2996 107.567,91.2996 97.5,95.5C 95.8333,95.5 94.1667,95.5 92.5,95.5C 90.2583,92.0205 88.2583,88.3538 86.5,84.5C 89.9621,82.9349 93.2954,81.1016 96.5,79C 95.8333,78.8333 95.1667,78.6667 94.5,78.5C 80.6757,84.0674 66.3424,85.9007 51.5,84C 44.0284,82.4993 36.6951,80.8327 29.5,79C 32.7046,81.1016 36.0379,82.9349 39.5,84.5C 37.7417,88.3538 35.7417,92.0205 33.5,95.5C 31.8333,95.5 30.1667,95.5 28.5,95.5C 18.4329,91.2996 8.76625,86.2996 -0.5,80.5C -0.5,71.8333 -0.5,63.1667 -0.5,54.5C 2.27734,37.5947 8.44401,21.9281 18,7.5C 25.419,4.30685 32.919,1.64019 40.5,-0.5 Z M 38.5,40.5 C 51.8373,41.4956 55.6706,48.1623 50,60.5C 42.3899,66.5776 36.3899,65.2442 32,56.5C 30.062,49.3891 32.2287,44.0558 38.5,40.5 Z M 80.5,40.5 C 93.8373,41.4956 97.6706,48.1623 92,60.5C 84.3899,66.5776 78.3899,65.2442 74,56.5C 72.062,49.3891 74.2287,44.0558 80.5,40.5 Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,4 @@
<svg width="207" height="205" viewBox="0 0 207 205" fill="none" xmlns="http://www.w3.org/2000/svg">
<ellipse cx="103.5" cy="102.5" rx="103.5" ry="102.5" fill="white"/>
<path d="M102.752 16C53.1943 16 13.0083 55.0187 13.0083 103.152C13.0083 141.658 38.7225 174.327 74.3807 185.851C78.8658 186.658 80.5127 183.96 80.5127 181.658C80.5127 179.58 80.4286 172.715 80.3907 165.433C55.4239 170.704 50.1557 155.15 50.1557 155.15C46.0731 145.076 40.1907 142.397 40.1907 142.397C32.0486 136.988 40.8049 137.1 40.8049 137.1C49.8163 137.714 54.5615 146.08 54.5615 146.08C62.5662 159.404 75.5565 155.552 80.6775 153.325C81.4831 147.693 83.8087 143.847 86.3755 141.671C66.442 139.468 45.4876 131.994 45.4876 98.6005C45.4876 89.0853 48.9932 81.3105 54.734 75.2072C53.8022 73.012 50.7306 64.1484 55.6034 52.1433C55.6034 52.1433 63.1397 49.8011 80.2898 61.077C87.4482 59.1461 95.1254 58.1779 102.752 58.1445C110.379 58.1779 118.063 59.1454 125.234 61.077C142.363 49.8018 149.889 52.144 149.889 52.144C154.774 64.1478 151.701 73.0127 150.769 75.2072C156.523 81.3105 160.005 89.0853 160.005 98.6005C160.005 132.074 139.011 139.445 119.027 141.602C122.245 144.307 125.114 149.611 125.114 157.742C125.114 169.402 125.01 178.787 125.01 181.658C125.01 183.978 126.625 186.695 131.174 185.838C166.813 174.302 192.495 141.646 192.495 103.153C192.495 55.0187 152.314 16 102.752 16ZM46.6206 140.15C46.4229 140.583 45.7211 140.713 45.0824 140.415C44.431 140.132 44.0658 139.541 44.2761 139.107C44.4696 138.661 45.1728 138.536 45.8221 138.835C46.4741 139.12 46.8457 139.716 46.6206 140.15ZM51.0349 143.975C50.6072 144.36 49.7701 144.181 49.2022 143.573C48.6153 142.965 48.5052 142.152 48.9392 141.762C49.3809 141.376 50.1921 141.557 50.7804 142.164C51.3679 142.779 51.4815 143.586 51.0349 143.975ZM54.0637 148.869C53.5133 149.24 52.6145 148.892 52.0585 148.118C51.5088 147.343 51.5088 146.413 52.0704 146.041C52.6278 145.668 53.5133 146.003 54.0763 146.773C54.6246 147.561 54.6246 148.49 54.063 148.87L54.0637 148.869ZM59.1847 154.537C58.6932 155.064 57.645 154.923 56.878 154.204C56.0935 153.501 55.8754 152.504 56.369 151.977C56.8668 151.449 57.9206 151.597 58.6932 152.311C59.4714 153.012 59.7098 154.017 59.1847 154.537ZM65.8047 156.451C65.5873 157.134 64.5777 157.444 63.5618 157.154C62.5466 156.855 61.8826 156.056 62.0873 155.366C62.2984 154.678 63.3122 154.356 64.3358 154.666C65.3496 154.963 66.0157 155.756 65.8047 156.451ZM73.3375 157.263C73.3627 157.981 72.501 158.577 71.4339 158.591C70.3612 158.614 69.4925 158.032 69.4806 157.324C69.4806 156.599 70.3234 156.009 71.3968 155.991C72.4639 155.971 73.3375 156.548 73.3375 157.263ZM80.7378 156.987C80.8654 157.689 80.1243 158.409 79.0642 158.601C78.023 158.785 77.0583 158.352 76.9258 157.657C76.7968 156.938 77.5519 156.218 78.5917 156.032C79.6532 155.853 80.6025 156.274 80.7378 156.987Z" fill="#161614"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1 @@
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 960 B

@@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 4L12 4" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5 8H11" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 12L12 12" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 355 B

@@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 4L12 4" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 8H10" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 12L12 12" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 355 B

@@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 4L12 4" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 8H12" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 12L12 12" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 355 B

+191 -135
View File
@@ -27,7 +27,8 @@
"passwordHint": "كلمة المرور",
"dontHaveAnAccount": "ليس لديك حساب؟",
"repeatPasswordEmptyError": "إعادة كلمة المرور لا يمكن أن تكون فارغة",
"unmatchedPasswordError": "تكرار كلمة المرور ليس هو نفسه كلمة المرور"
"unmatchedPasswordError": "تكرار كلمة المرور ليس هو نفسه كلمة المرور",
"loginAsGuestButtonText": "البدء"
},
"workspace": {
"create": "قم بإنشاء مساحة عمل",
@@ -45,12 +46,14 @@
"medium": "متوسط",
"large": "كبير",
"fontSize": "حجم الخط",
"import": "استيراد"
"import": "استيراد",
"moreOptions": "المزيد من الخيارات"
},
"disclosureAction": {
"rename": "إعادة تسمية",
"delete": "يمسح",
"duplicate": "كرر"
"duplicate": "كرر",
"openNewTab": "افتح في علامة تبويب جديدة"
},
"blankPageTitle": "صفحة فارغة",
"newPageText": "صفحة جديدة",
@@ -62,6 +65,14 @@
"fileName": "اسم الملف",
"lastModified": "آخر تعديل",
"created": "تم انشاؤها"
},
"confirmDeleteAll": {
"title": "هل أنت متأكد من حذف جميع الصفحات في المهملات؟",
"caption": "لا يمكن التراجع عن هذا الإجراء."
},
"confirmRestoreAll": {
"title": "هل أنت متأكد من استعادة جميع الصفحات في المهملات؟",
"caption": "لا يمكن التراجع عن هذا الإجراء."
}
},
"deletePagePrompt": {
@@ -79,7 +90,8 @@
"name": "معلومات التصحيح",
"success": "تم نسخ معلومات التصحيح إلى الحافظة!",
"fail": "تعذر نسخ معلومات التصحيح إلى الحافظة"
}
},
"feedback": "تعليق"
},
"menuAppHeader": {
"addPageTooltip": "أضف صفحة في الداخل بسرعة",
@@ -100,7 +112,9 @@
"quote": "كتلة اقتباس",
"header": "رأس",
"highlight": "تسليط الضوء",
"color": "لون"
"color": "لون",
"addLink": "إضافة رابط",
"link": "وصلة"
},
"tooltip": {
"lightMode": "قم بالتبديل إلى وضع الإضاءة",
@@ -109,7 +123,9 @@
"addNewRow": "أضف صفًا جديدًا",
"openMenu": "انقر لفتح القائمة",
"viewDataBase": "عرض قاعدة البيانات",
"referencePage": "تمت الإشارة إلى هذا {name}"
"referencePage": "تمت الإشارة إلى هذا {name}",
"dragRow": "اضغط مطولاً لإعادة ترتيب الصف",
"addBlockBelow": "إضافة كتلة أدناه"
},
"sideBar": {
"closeSidebar": "إغلاق الشريط الجانبي",
@@ -141,7 +157,13 @@
"tryAgain": "حاول ثانية",
"discard": "تجاهل",
"replace": "يستبدل",
"insertBelow": "إدراج أدناه"
"insertBelow": "إدراج أدناه",
"upload": "رفع",
"edit": "يحرر",
"delete": "يمسح",
"duplicate": "ينسخ",
"done": "منتهي",
"putback": "ضعها بالخلف"
},
"label": {
"welcome": "مرحباً!",
@@ -170,7 +192,8 @@
"language": "لغة",
"user": "مستخدم",
"files": "الملفات",
"open": "أفتح الإعدادات"
"open": "أفتح الإعدادات",
"supabaseSetting": "إعداد Supabase"
},
"appearance": {
"themeMode": {
@@ -179,7 +202,23 @@
"dark": "الوضع الداكن",
"system": "التكيف مع النظام"
},
"theme": "سمة"
"theme": "سمة",
"fontFamily": {
"label": "خط العائلة",
"search": "يبحث"
},
"themeUpload": {
"button": "رفع",
"description": "قم بتحميل قالب AppFlowy الخاص بك باستخدام الزر أدناه.",
"failure": "النسق الذي تم تحميله به تنسيق غير صالح.",
"loading": "يرجى الانتظار بينما نقوم بالتحقق من صحة السمة الخاصة بك وتحميلها ...",
"uploadSuccess": "تم تحميل موضوعك بنجاح",
"deletionFailure": "فشل حذف الموضوع. حاول حذفه يدويًا.",
"filePickerDialogTitle": "اختر ملف .flowy_plugin",
"urlUploadFailure": "فشل فتح عنوان url: {}"
},
"builtInsLabel": "ثيمات مدمجة",
"pluginsLabel": "الإضافات"
},
"files": {
"defaultLocation": "أين يتم تخزين بياناتك الآن",
@@ -201,7 +240,21 @@
"create": "يخلق",
"folderPath": "مسار لتخزين المجلد الخاص بك",
"locationCannotBeEmpty": "لا يمكن أن يكون المسار فارغًا",
"pathCopiedSnackbar": "تم نسخ مسار تخزين الملفات إلى الحافظة!"
"pathCopiedSnackbar": "تم نسخ مسار تخزين الملفات إلى الحافظة!",
"copy": "ينسخ",
"exportData": "قم بتصدير بياناتك",
"selectAll": "اختر الكل",
"deselectAll": "الغاء تحديد الكل",
"defineWhereYourDataIsStored": "حدد مكان تخزين بياناتك",
"set": "تعيين",
"changeLocationTooltips": "قم بتغيير دليل البيانات",
"change": "يتغير",
"openLocationTooltips": "افتح دليل بيانات آخر",
"openCurrentDataFolder": "افتح دليل البيانات الحالي",
"recoverLocationTooltips": "إعادة التعيين إلى دليل البيانات الافتراضي لـ AppFlowy",
"exportFileSuccess": "تم تصدير الملف بنجاح!",
"exportFileFail": "فشل تصدير الملف!",
"export": "يصدّر"
},
"user": {
"name": "اسم",
@@ -221,7 +274,10 @@
"deleteFilter": "حذف عامل التصفية",
"filterBy": "مصنف بواسطة...",
"typeAValue": "اكتب قيمة ...",
"layout": "تَخطِيط"
"layout": "تَخطِيط",
"properties": "ملكيات",
"reorderPropertiesTooltip": "اسحب لإعادة ترتيب الخصائص",
"databaseLayout": "تَخطِيط"
},
"textFilter": {
"contains": "يتضمن",
@@ -294,7 +350,9 @@
"addOption": "إضافة خيار",
"editProperty": "تحرير الملكية",
"newProperty": "خاصية جديدة",
"deleteFieldPromptMessage": "هل أنت متأكد؟ سيتم حذف هذه الخاصية"
"deleteFieldPromptMessage": "هل أنت متأكد؟ سيتم حذف هذه الخاصية",
"updatedAtFieldName": "وقت آخر تعديل",
"createdAtFieldName": "وقت الإنشاء"
},
"sort": {
"ascending": "تصاعدي",
@@ -308,7 +366,8 @@
"textPlaceholder": "فارغ",
"copyProperty": "نسخ الممتلكات إلى الحافظة",
"count": "عدد",
"newRow": "صف جديد"
"newRow": "صف جديد",
"action": "فعل"
},
"selectOption": {
"create": "يخلق",
@@ -330,7 +389,9 @@
"panelTitle": "أضف عنصرًا"
},
"menuName": "شبكة",
"referencedGridPrefix": "نظرا ل"
"referencedGridPrefix": "نظرا ل",
"deleteView": "هل أنت متأكد أنك تريد حذف هذا العرض؟",
"createView": "جديد"
},
"document": {
"menuName": "وثيقة",
@@ -346,6 +407,10 @@
"grid": {
"selectAGridToLinkTo": "حدد الشبكة للارتباط بها",
"createANewGrid": "قم بإنشاء شبكة جديدة"
},
"calendar": {
"selectACalendarToLinkTo": "حدد تقويمًا للارتباط به",
"createANewCalendar": "قم بإنشاء تقويم جديد"
}
},
"plugins": {
@@ -393,6 +458,77 @@
"mathEquation": {
"addMathEquation": "أضف معادلة رياضية",
"editMathEquation": "تحرير المعادلة الرياضية"
},
"referencedCalendar": "التقويم المشار إليه",
"autoGeneratorRewrite": "اعادة كتابة",
"smartEditImproveWriting": "تحسين الكتابة",
"smartEditMakeLonger": "اجعله أطول",
"createInlineMathEquation": "اصنع معادلة",
"toggleList": "تبديل القائمة",
"optionAction": {
"click": "انقر",
"toOpenMenu": " لفتح القائمة",
"delete": "يمسح",
"duplicate": "ينسخ",
"turnInto": "تحول إلى",
"moveUp": "تحرك",
"moveDown": "تحرك لأسفل",
"color": "لون",
"align": "محاذاة",
"left": "غادر",
"center": "مركز",
"right": "يمين",
"defaultColor": "تقصير"
},
"image": {
"copiedToPasteBoard": "تم نسخ رابط الصورة إلى الحافظة"
},
"outline": {
"addHeadingToCreateOutline": "أضف عناوين لإنشاء جدول محتويات."
}
},
"selectionMenu": {
"outline": "الخطوط العريضة"
},
"textBlock": {
"placeholder": "اكتب \"/\" للأوامر"
},
"title": {
"placeholder": "بدون عنوان"
},
"imageBlock": {
"placeholder": "انقر لإضافة الصورة",
"upload": {
"label": "رفع",
"placeholder": "انقر لتحميل الصورة"
},
"url": {
"label": "رابط الصورة",
"placeholder": "أدخل عنوان URL للصورة"
},
"support": "الحد الأقصى لحجم الصورة هو 5 ميغا بايت. التنسيقات المدعومة: JPEG ، PNG ، GIF ، SVG",
"error": {
"invalidImage": "صورة غير صالحة",
"invalidImageSize": "يجب أن يكون حجم الصورة أقل من 5 ميغا بايت",
"invalidImageFormat": "تنسيق الصورة غير مدعوم. التنسيقات المدعومة: JPEG ، PNG ، GIF ، SVG",
"invalidImageUrl": "عنوان URL للصورة غير صالح"
}
},
"codeBlock": {
"language": {
"label": "لغة",
"placeholder": "اختار اللغة"
}
},
"inlineLink": {
"placeholder": "الصق أو اكتب ارتباطًا",
"url": {
"label": "URL رابط",
"placeholder": "أدخل رابط URL"
},
"title": {
"label": "عنوان الارتباط",
"placeholder": "أدخل عنوان الارتباط"
}
}
},
@@ -416,129 +552,49 @@
"showWeekNumbers": "إظهار أرقام الأسبوع",
"showWeekends": "عرض عطلات نهاية الأسبوع",
"firstDayOfWeek": "اليوم الأول من الأسبوع",
"layoutDateField": "تقويم التخطيط بواسطة"
}
"layoutDateField": "تقويم التخطيط بواسطة",
"noDateTitle": "بدون تاريخ",
"noDateHint": "ستظهر الأحداث غير المجدولة هنا",
"clickToAdd": "انقر للإضافة إلى التقويم",
"name": "تخطيط التقويم"
},
"referencedCalendarPrefix": "نظرا ل"
},
"youCanAlso": "بامكانك ايضا",
"and": "و",
"blockActions.addBelowTooltip": "انقر للإضافة أدناه",
"blockActions.addAboveCmd": "Alt + انقر",
"blockActions.addAboveMacCmd": "Option + انقر",
"blockActions.addAboveTooltip": "لإضافة أعلاه",
"signIn.loginAsGuestButtonText": "البدء",
"moreAction.moreOptions": "المزيد من الخيارات",
"importPanel.textAndMarkdown": "نص و Markdown",
"importPanel.documentFromV010": "مستند من الإصدار 0.1.0",
"importPanel.databaseFromV010": "قاعدة بيانات من الإصدار 0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "قاعدة البيانات",
"disclosureAction.openNewTab": "افتح في علامة تبويب جديدة",
"trash.confirmDeleteAll.title": "هل أنت متأكد من حذف جميع الصفحات في المهملات؟",
"trash.confirmDeleteAll.caption": "لا يمكن التراجع عن هذا الإجراء.",
"trash.confirmRestoreAll.title": "هل أنت متأكد من استعادة جميع الصفحات في المهملات؟",
"trash.confirmRestoreAll.caption": "لا يمكن التراجع عن هذا الإجراء.",
"questionBubble.feedback": "تعليق",
"toolbar.addLink": "إضافة رابط",
"toolbar.link": "وصلة",
"tooltip.dragRow": "اضغط مطولاً لإعادة ترتيب الصف",
"tooltip.addBlockBelow": "إضافة كتلة أدناه",
"button.upload": "رفع",
"button.edit": "يحرر",
"button.delete": "يمسح",
"button.duplicate": "ينسخ",
"button.done": "منتهي",
"button.putback": "ضعها بالخلف",
"settings.menu.supabaseSetting": "إعداد Supabase",
"settings.appearance.fontFamily.label": "خط العائلة",
"settings.appearance.fontFamily.search": "يبحث",
"settings.appearance.themeUpload.button": "رفع",
"settings.appearance.themeUpload.description": "قم بتحميل قالب AppFlowy الخاص بك باستخدام الزر أدناه.",
"settings.appearance.themeUpload.failure": "النسق الذي تم تحميله به تنسيق غير صالح.",
"settings.appearance.themeUpload.loading": "يرجى الانتظار بينما نقوم بالتحقق من صحة السمة الخاصة بك وتحميلها ...",
"settings.appearance.themeUpload.uploadSuccess": "تم تحميل موضوعك بنجاح",
"settings.appearance.themeUpload.deletionFailure": "فشل حذف الموضوع. حاول حذفه يدويًا.",
"settings.appearance.themeUpload.filePickerDialogTitle": "اختر ملف .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "فشل فتح عنوان url: {}",
"settings.appearance.builtInsLabel": "ثيمات مدمجة",
"settings.appearance.pluginsLabel": "الإضافات",
"settings.files.copy": "ينسخ",
"settings.files.exportData": "قم بتصدير بياناتك",
"settings.files.selectAll": "اختر الكل",
"settings.files.deselectAll": "الغاء تحديد الكل",
"settings.files.defineWhereYourDataIsStored": "حدد مكان تخزين بياناتك",
"settings.files.set": "تعيين",
"settings.files.changeLocationTooltips": "قم بتغيير دليل البيانات",
"settings.files.change": "يتغير",
"settings.files.openLocationTooltips": "افتح دليل بيانات آخر",
"settings.files.openCurrentDataFolder": "افتح دليل البيانات الحالي",
"settings.files.recoverLocationTooltips": "إعادة التعيين إلى دليل البيانات الافتراضي لـ AppFlowy",
"settings.files.exportFileSuccess": "تم تصدير الملف بنجاح!",
"settings.files.exportFileFail": "فشل تصدير الملف!",
"settings.files.export": "يصدّر",
"grid.deleteView": "هل أنت متأكد أنك تريد حذف هذا العرض؟",
"grid.createView": "جديد",
"grid.settings.properties": "ملكيات",
"grid.settings.reorderPropertiesTooltip": "اسحب لإعادة ترتيب الخصائص",
"grid.settings.databaseLayout": "تَخطِيط",
"grid.field.updatedAtFieldName": "وقت آخر تعديل",
"grid.field.createdAtFieldName": "وقت الإنشاء",
"grid.row.action": "فعل",
"document.slashMenu.calendar.selectACalendarToLinkTo": "حدد تقويمًا للارتباط به",
"document.slashMenu.calendar.createANewCalendar": "قم بإنشاء تقويم جديد",
"document.selectionMenu.outline": "الخطوط العريضة",
"document.plugins.referencedCalendar": "التقويم المشار إليه",
"document.plugins.autoGeneratorRewrite": "اعادة كتابة",
"document.plugins.smartEditImproveWriting": "تحسين الكتابة",
"document.plugins.smartEditMakeLonger": "اجعله أطول",
"document.plugins.createInlineMathEquation": "اصنع معادلة",
"document.plugins.toggleList": "تبديل القائمة",
"document.plugins.optionAction.click": "انقر",
"document.plugins.optionAction.toOpenMenu": " لفتح القائمة",
"document.plugins.optionAction.delete": "يمسح",
"document.plugins.optionAction.duplicate": "ينسخ",
"document.plugins.optionAction.turnInto": "تحول إلى",
"document.plugins.optionAction.moveUp": "تحرك",
"document.plugins.optionAction.moveDown": "تحرك لأسفل",
"document.plugins.optionAction.color": "لون",
"document.plugins.optionAction.align": "محاذاة",
"document.plugins.optionAction.left": "غادر",
"document.plugins.optionAction.center": "مركز",
"document.plugins.optionAction.right": "يمين",
"document.plugins.optionAction.defaultColor": "تقصير",
"document.plugins.image.copiedToPasteBoard": "تم نسخ رابط الصورة إلى الحافظة",
"document.plugins.outline.addHeadingToCreateOutline": "أضف عناوين لإنشاء جدول محتويات.",
"document.textBlock.placeholder": "اكتب \"/\" للأوامر",
"document.title.placeholder": "بدون عنوان",
"document.imageBlock.placeholder": "انقر لإضافة الصورة",
"document.imageBlock.upload.label": "رفع",
"document.imageBlock.upload.placeholder": "انقر لتحميل الصورة",
"document.imageBlock.url.label": "رابط الصورة",
"document.imageBlock.url.placeholder": "أدخل عنوان URL للصورة",
"document.imageBlock.support": "الحد الأقصى لحجم الصورة هو 5 ميغا بايت. التنسيقات المدعومة: JPEG ، PNG ، GIF ، SVG",
"document.imageBlock.error.invalidImage": "صورة غير صالحة",
"document.imageBlock.error.invalidImageSize": "يجب أن يكون حجم الصورة أقل من 5 ميغا بايت",
"document.imageBlock.error.invalidImageFormat": "تنسيق الصورة غير مدعوم. التنسيقات المدعومة: JPEG ، PNG ، GIF ، SVG",
"document.imageBlock.error.invalidImageUrl": "عنوان URL للصورة غير صالح",
"document.codeBlock.language.label": "لغة",
"document.codeBlock.language.placeholder": "اختار اللغة",
"document.inlineLink.placeholder": "الصق أو اكتب ارتباطًا",
"document.inlineLink.url.label": "URL رابط",
"document.inlineLink.url.placeholder": "أدخل رابط URL",
"document.inlineLink.title.label": "عنوان الارتباط",
"document.inlineLink.title.placeholder": "أدخل عنوان الارتباط",
"calendar.settings.noDateTitle": "بدون تاريخ",
"calendar.settings.noDateHint": "ستظهر الأحداث غير المجدولة هنا",
"calendar.settings.clickToAdd": "انقر للإضافة إلى التقويم",
"calendar.settings.name": "تخطيط التقويم",
"calendar.referencedCalendarPrefix": "نظرا ل",
"errorDialog.title": "خطأ AppFlowy",
"errorDialog.howToFixFallback": "نأسف للإزعاج! قم بإرسال مشكلة على صفحة GitHub الخاصة بنا والتي تصف الخطأ الخاص بك.",
"errorDialog.github": "عرض على جيثب",
"search.label": "يبحث",
"search.placeholder.actions": "إجراءات البحث ...",
"message.copy.success": "نسخ!",
"message.copy.fail": "غير قادر على النسخ",
"blockActions": {
"addBelowTooltip": "انقر للإضافة أدناه",
"addAboveCmd": "Alt + انقر",
"addAboveMacCmd": "Option + انقر",
"addAboveTooltip": "لإضافة أعلاه"
},
"importPanel": {
"textAndMarkdown": "نص و Markdown",
"documentFromV010": "مستند من الإصدار 0.1.0",
"databaseFromV010": "قاعدة بيانات من الإصدار 0.1.0",
"csv": "CSV",
"database": "قاعدة البيانات"
},
"errorDialog": {
"title": "خطأ AppFlowy",
"howToFixFallback": "نأسف للإزعاج! قم بإرسال مشكلة على صفحة GitHub الخاصة بنا والتي تصف الخطأ الخاص بك.",
"github": "عرض على جيثب"
},
"search": {
"label": "يبحث",
"placeholder": {
"actions": "إجراءات البحث ..."
}
},
"message": {
"copy": {
"success": "نسخ!",
"fail": "غير قادر على النسخ"
}
},
"unSupportBlock": "الإصدار الحالي لا يدعم هذه الكتلة.",
"views.deleteContentTitle": "هل أنت متأكد من أنك تريد حذف {pageType}؟",
"views.deleteContentCaption": "إذا قمت بحذف {pageType} هذه ، فيمكنك استعادتها من سلة المهملات."
"views": {
"deleteContentTitle": "هل أنت متأكد من أنك تريد حذف {pageType}؟",
"deleteContentCaption": "إذا قمت بحذف {pageType} هذه ، فيمكنك استعادتها من سلة المهملات."
}
}
+451 -331
View File
@@ -27,7 +27,8 @@
"passwordHint": "Contrasenya",
"dontHaveAnAccount": "No tens un compte?",
"repeatPasswordEmptyError": "La contrasenya repetida no pot ser buida",
"unmatchedPasswordError": "Les contrasenyes no concorden"
"unmatchedPasswordError": "Les contrasenyes no concorden",
"loginAsGuestButtonText": "Començar"
},
"workspace": {
"create": "Crear un espai de treball",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Canviar el nom",
"delete": "Eliminar",
"duplicate": "Duplicar"
"duplicate": "Duplicar",
"openNewTab": "Obre en una pestanya nova"
},
"blankPageTitle": "Pàgina en blanc",
"newPageText": "Nova pàgina",
@@ -55,6 +57,14 @@
"fileName": "Nom del fitxer",
"lastModified": "Última modificació",
"created": "Creat"
},
"confirmDeleteAll": {
"title": "Esteu segur que suprimiu totes les pàgines de la paperera?",
"caption": "Aquesta acció no es pot desfer."
},
"confirmRestoreAll": {
"title": "Esteu segur de restaurar totes les pàgines a la paperera?",
"caption": "Aquesta acció no es pot desfer."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Informació de depuració",
"success": "S'ha copiat la informació de depuració!",
"fail": "No es pot copiar la informació de depuració"
}
},
"shortcuts": "Dreceres",
"markdown": "Reducció",
"feedback": "Feedback"
},
"menuAppHeader": {
"addPageTooltip": "Afegeix ràpidament una pàgina dins",
@@ -90,11 +103,21 @@
"inlineCode": "Inserir codi",
"quote": "Bloc citat",
"header": "Capçalera",
"highlight": "Subratllar"
"highlight": "Subratllar",
"color": "Color",
"addLink": "Afegeix un enllaç",
"link": "Enllaç"
},
"tooltip": {
"lightMode": "Canviar a mode clar",
"darkMode": "Canviar a mode fosc"
"darkMode": "Canviar a mode fosc",
"openAsPage": "Obre com a pàgina",
"addNewRow": "Afegeix una fila nova",
"openMenu": "Feu clic per obrir el menú",
"dragRow": "Premeu llargament per reordenar la fila",
"viewDataBase": "Veure base de dades",
"referencePage": "Es fa referència a aquest {nom}",
"addBlockBelow": "Afegeix un bloc a continuació"
},
"contactsPage": {
"title": "Contactes",
@@ -108,7 +131,21 @@
"signIn": "Iniciar sessió",
"signOut": "Tancar sessió",
"complete": "Completar",
"save": "Guardar"
"save": "Guardar",
"Done": "Fet",
"generate": "Generar",
"esc": "ESC",
"keep": "Mantenir",
"tryAgain": "Torna-ho a provar",
"discard": "Descartar",
"replace": "Substitueix",
"insertBelow": "Insereix a continuació",
"upload": "Carrega",
"edit": "Edita",
"delete": "Suprimeix",
"duplicate": "Duplicat",
"done": "Fet",
"putback": "Posar enrere"
},
"label": {
"welcome": "Benvingut!",
@@ -135,7 +172,10 @@
"menu": {
"appearance": "Aparença",
"language": "Idioma",
"open": "Obrir la configuració"
"open": "Obrir la configuració",
"user": "Usuari",
"files": "Fitxers",
"supabaseSetting": "Configuració Supabase"
},
"appearance": {
"themeMode": {
@@ -143,337 +183,417 @@
"light": "Mode Clar",
"dark": "Mode Fosc",
"system": "Adapt to System"
}
},
"fontFamily": {
"label": "Família de lletres",
"search": "Cerca"
},
"themeUpload": {
"button": "Carrega",
"description": "Carregueu el vostre propi tema AppFlowy amb el botó següent.",
"failure": "El tema que s'ha penjat tenia un format no vàlid.",
"loading": "Si us plau, espereu mentre validem i carreguem el vostre tema...",
"uploadSuccess": "El teu tema s'ha penjat correctament",
"deletionFailure": "No s'ha pogut suprimir el tema. Intenta esborrar-lo manualment.",
"filePickerDialogTitle": "Trieu un fitxer .flowy_plugin",
"urlUploadFailure": "No s'ha pogut obrir l'URL: {}"
},
"theme": "Tema",
"builtInsLabel": "Temes integrats",
"pluginsLabel": "Connectors"
},
"files": {
"copy": "Còpia",
"defaultLocation": "Llegir fitxers i ubicació d'emmagatzematge de dades",
"exportData": "Exporteu les vostres dades",
"doubleTapToCopy": "Fes doble toc per copiar el camí",
"restoreLocation": "Restaura al camí predeterminat d'AppFlowy",
"customizeLocation": "Obriu una altra carpeta",
"restartApp": "Si us plau, reinicieu l'aplicació perquè els canvis tinguin efecte.",
"exportDatabase": "Exportar la base de dades",
"selectFiles": "Seleccioneu els fitxers que cal exportar",
"selectAll": "Seleccionar tot",
"deselectAll": "Deseleccionar tot",
"createNewFolder": "Creeu una carpeta nova",
"createNewFolderDesc": "Digueu-nos on voleu emmagatzemar les vostres dades",
"defineWhereYourDataIsStored": "Definiu on s'emmagatzemen les vostres dades",
"open": "Obert",
"openFolder": "Obre una carpeta existent",
"openFolderDesc": "Llegiu-lo i escriviu-lo a la vostra carpeta AppFlowy existent",
"folderHintText": "nom de la carpeta",
"location": "Creació d'una carpeta nova",
"locationDesc": "Trieu un nom per a la vostra carpeta de dades d'AppFlowy",
"browser": "Navega",
"create": "Crear",
"set": "Conjunt",
"folderPath": "Camí per emmagatzemar la vostra carpeta",
"locationCannotBeEmpty": "El camí no pot estar buit",
"pathCopiedSnackbar": "S'ha copiat el camí d'emmagatzematge del fitxer al porta-retalls!",
"changeLocationTooltips": "Canvia el directori de dades",
"change": "Canviar",
"openLocationTooltips": "Obriu un altre directori de dades",
"openCurrentDataFolder": "Obre el directori de dades actual",
"recoverLocationTooltips": "Restableix al directori de dades predeterminat d'AppFlowy",
"exportFileSuccess": "Exporta el fitxer correctament!",
"exportFileFail": "Ha fallat l'exportació del fitxer!",
"export": "Exporta"
},
"user": {
"name": "Nom",
"icon": "Icona",
"selectAnIcon": "Seleccioneu una icona",
"pleaseInputYourOpenAIKey": "si us plau, introduïu la vostra clau OpenAI"
}
},
"sideBar": {
"openSidebar": "Open sidebar",
"closeSidebar": "Close sidebar"
},
"moreAction.small": "petit",
"moreAction": {
"small": "petit",
"medium": "mitjà",
"large": "gran",
"fontSize": "Mida de la font",
"import": "Importar",
"moreOptions": "Més opcions"
},
"youCanAlso": "Tu pots també",
"and": "i",
"blockActions.addBelowTooltip": "Feu clic per afegir a continuació",
"blockActions.addAboveCmd": "Alt+clic",
"blockActions.addAboveMacCmd": "Opció+clic",
"blockActions.addAboveTooltip": "afegir a dalt",
"signIn.loginAsGuestButtonText": "Començar",
"moreAction.medium": "mitjà",
"moreAction.large": "gran",
"moreAction.fontSize": "Mida de la font",
"moreAction.import": "Importar",
"moreAction.moreOptions": "Més opcions",
"importPanel.textAndMarkdown": "Text i rebaixa",
"importPanel.documentFromV010": "Document de la v0.1.0",
"importPanel.databaseFromV010": "Base de dades de la v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Base de dades",
"disclosureAction.openNewTab": "Obre en una pestanya nova",
"trash.confirmDeleteAll.title": "Esteu segur que suprimiu totes les pàgines de la paperera?",
"trash.confirmDeleteAll.caption": "Aquesta acció no es pot desfer.",
"trash.confirmRestoreAll.title": "Esteu segur de restaurar totes les pàgines a la paperera?",
"trash.confirmRestoreAll.caption": "Aquesta acció no es pot desfer.",
"questionBubble.shortcuts": "Dreceres",
"questionBubble.markdown": "Reducció",
"questionBubble.feedback": "Feedback",
"toolbar.color": "Color",
"toolbar.addLink": "Afegeix un enllaç",
"toolbar.link": "Enllaç",
"tooltip.openAsPage": "Obre com a pàgina",
"tooltip.addNewRow": "Afegeix una fila nova",
"tooltip.openMenu": "Feu clic per obrir el menú",
"tooltip.dragRow": "Premeu llargament per reordenar la fila",
"tooltip.viewDataBase": "Veure base de dades",
"tooltip.referencePage": "Es fa referència a aquest {nom}",
"tooltip.addBlockBelow": "Afegeix un bloc a continuació",
"notifications.export.markdown": "Nota exportada a Markdown",
"notifications.export.path": "Documents/fluides",
"button.Done": "Fet",
"button.generate": "Generar",
"button.esc": "ESC",
"button.keep": "Mantenir",
"button.tryAgain": "Torna-ho a provar",
"button.discard": "Descartar",
"button.replace": "Substitueix",
"button.insertBelow": "Insereix a continuació",
"button.upload": "Carrega",
"button.edit": "Edita",
"button.delete": "Suprimeix",
"button.duplicate": "Duplicat",
"button.done": "Fet",
"button.putback": "Posar enrere",
"settings.menu.user": "Usuari",
"settings.menu.files": "Fitxers",
"settings.menu.supabaseSetting": "Configuració Supabase",
"settings.appearance.fontFamily.label": "Família de lletres",
"settings.appearance.fontFamily.search": "Cerca",
"settings.appearance.themeUpload.button": "Carrega",
"settings.appearance.themeUpload.description": "Carregueu el vostre propi tema AppFlowy amb el botó següent.",
"settings.appearance.themeUpload.failure": "El tema que s'ha penjat tenia un format no vàlid.",
"settings.appearance.themeUpload.loading": "Si us plau, espereu mentre validem i carreguem el vostre tema...",
"settings.appearance.themeUpload.uploadSuccess": "El teu tema s'ha penjat correctament",
"settings.appearance.themeUpload.deletionFailure": "No s'ha pogut suprimir el tema. Intenta esborrar-lo manualment.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Trieu un fitxer .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "No s'ha pogut obrir l'URL: {}",
"settings.appearance.theme": "Tema",
"settings.appearance.builtInsLabel": "Temes integrats",
"settings.appearance.pluginsLabel": "Connectors",
"settings.files.copy": "Còpia",
"settings.files.defaultLocation": "Llegir fitxers i ubicació d'emmagatzematge de dades",
"settings.files.exportData": "Exporteu les vostres dades",
"settings.files.doubleTapToCopy": "Fes doble toc per copiar el camí",
"settings.files.restoreLocation": "Restaura al camí predeterminat d'AppFlowy",
"settings.files.customizeLocation": "Obriu una altra carpeta",
"settings.files.restartApp": "Si us plau, reinicieu l'aplicació perquè els canvis tinguin efecte.",
"settings.files.exportDatabase": "Exportar la base de dades",
"settings.files.selectFiles": "Seleccioneu els fitxers que cal exportar",
"settings.files.selectAll": "Seleccionar tot",
"settings.files.deselectAll": "Deseleccionar tot",
"settings.files.createNewFolder": "Creeu una carpeta nova",
"settings.files.createNewFolderDesc": "Digueu-nos on voleu emmagatzemar les vostres dades",
"settings.files.defineWhereYourDataIsStored": "Definiu on s'emmagatzemen les vostres dades",
"settings.files.open": "Obert",
"settings.files.openFolder": "Obre una carpeta existent",
"settings.files.openFolderDesc": "Llegiu-lo i escriviu-lo a la vostra carpeta AppFlowy existent",
"settings.files.folderHintText": "nom de la carpeta",
"settings.files.location": "Creació d'una carpeta nova",
"settings.files.locationDesc": "Trieu un nom per a la vostra carpeta de dades d'AppFlowy",
"settings.files.browser": "Navega",
"settings.files.create": "Crear",
"settings.files.set": "Conjunt",
"settings.files.folderPath": "Camí per emmagatzemar la vostra carpeta",
"settings.files.locationCannotBeEmpty": "El camí no pot estar buit",
"settings.files.pathCopiedSnackbar": "S'ha copiat el camí d'emmagatzematge del fitxer al porta-retalls!",
"settings.files.changeLocationTooltips": "Canvia el directori de dades",
"settings.files.change": "Canviar",
"settings.files.openLocationTooltips": "Obriu un altre directori de dades",
"settings.files.openCurrentDataFolder": "Obre el directori de dades actual",
"settings.files.recoverLocationTooltips": "Restableix al directori de dades predeterminat d'AppFlowy",
"settings.files.exportFileSuccess": "Exporta el fitxer correctament!",
"settings.files.exportFileFail": "Ha fallat l'exportació del fitxer!",
"settings.files.export": "Exporta",
"settings.user.name": "Nom",
"settings.user.icon": "Icona",
"settings.user.selectAnIcon": "Seleccioneu una icona",
"settings.user.pleaseInputYourOpenAIKey": "si us plau, introduïu la vostra clau OpenAI",
"grid.deleteView": "Esteu segur que voleu suprimir aquesta vista?",
"grid.createView": "Nou",
"grid.settings.filter": "Filtre",
"grid.settings.sort": "Ordena",
"grid.settings.sortBy": "Ordenar per",
"grid.settings.properties": "Propietats",
"grid.settings.reorderPropertiesTooltip": "Arrossegueu per reordenar les propietats",
"grid.settings.group": "Grup",
"grid.settings.addFilter": "Afegeix un filtre",
"grid.settings.deleteFilter": "Suprimeix el filtre",
"grid.settings.filterBy": "Filtra per...",
"grid.settings.typeAValue": "Escriu un valor...",
"grid.settings.layout": "Disseny",
"grid.settings.databaseLayout": "Disseny",
"grid.textFilter.contains": "Conté",
"grid.textFilter.doesNotContain": "No conté",
"grid.textFilter.endsWith": "Acaba amb",
"grid.textFilter.startWith": "Comença amb",
"grid.textFilter.is": "És",
"grid.textFilter.isNot": "No és",
"grid.textFilter.isEmpty": "Està buit",
"grid.textFilter.isNotEmpty": "No està buit",
"grid.textFilter.choicechipPrefix.isNot": "No",
"grid.textFilter.choicechipPrefix.startWith": "Comença amb",
"grid.textFilter.choicechipPrefix.endWith": "Acaba amb",
"grid.textFilter.choicechipPrefix.isEmpty": "està buit",
"grid.textFilter.choicechipPrefix.isNotEmpty": "no està buida",
"grid.checkboxFilter.isChecked": "Comprovat",
"grid.checkboxFilter.isUnchecked": "Sense marcar",
"grid.checkboxFilter.choicechipPrefix.is": "és",
"grid.checklistFilter.isComplete": "està completa",
"grid.checklistFilter.isIncomplted": "és incompleta",
"grid.singleSelectOptionFilter.is": "És",
"grid.singleSelectOptionFilter.isNot": "No és",
"grid.singleSelectOptionFilter.isEmpty": "Està buit",
"grid.singleSelectOptionFilter.isNotEmpty": "No està buit",
"grid.multiSelectOptionFilter.contains": "Conté",
"grid.multiSelectOptionFilter.doesNotContain": "No conté",
"grid.multiSelectOptionFilter.isEmpty": "Està buit",
"grid.multiSelectOptionFilter.isNotEmpty": "No està buit",
"grid.field.hide": "Amaga",
"grid.field.insertLeft": "Insereix a l'esquerra",
"grid.field.insertRight": "Insereix a la dreta",
"grid.field.duplicate": "Duplicat",
"grid.field.delete": "Suprimeix",
"grid.field.textFieldName": "Text",
"grid.field.checkboxFieldName": "casella de selecció",
"grid.field.dateFieldName": "Data",
"grid.field.updatedAtFieldName": "Hora de l'última modificació",
"grid.field.createdAtFieldName": "Temps creat",
"grid.field.numberFieldName": "Nombres",
"grid.field.singleSelectFieldName": "Seleccioneu",
"grid.field.multiSelectFieldName": "Selecció múltiple",
"grid.field.urlFieldName": "URL",
"grid.field.checklistFieldName": "Llista de verificació",
"grid.field.numberFormat": "Format numèric",
"grid.field.dateFormat": "Format de data",
"grid.field.includeTime": "Inclou el temps",
"grid.field.dateFormatFriendly": "Mes Dia, Any",
"grid.field.dateFormatISO": "Any-Mes-Dia",
"grid.field.dateFormatLocal": "Mes/Dia/Any",
"grid.field.dateFormatUS": "Any/Mes/Dia",
"grid.field.dateFormatDayMonthYear": "Dia/Mes/Any",
"grid.field.timeFormat": "Format horari",
"grid.field.invalidTimeFormat": "Format no vàlid",
"grid.field.timeFormatTwelveHour": "12 hores",
"grid.field.timeFormatTwentyFourHour": "24 hores",
"grid.field.addSelectOption": "Afegeix una opció",
"grid.field.optionTitle": "Opcions",
"grid.field.addOption": "Afegeix opció",
"grid.field.editProperty": "Edita la propietat",
"grid.field.newProperty": "Nova propietat",
"grid.field.deleteFieldPromptMessage": "Estàs segur? Aquesta propietat se suprimirà",
"grid.sort.ascending": "Ascendent",
"grid.sort.descending": "Descens",
"grid.sort.deleteSort": "Suprimeix l'ordenació",
"grid.sort.addSort": "Afegeix ordenació",
"grid.row.duplicate": "Duplicat",
"grid.row.delete": "Suprimeix",
"grid.row.textPlaceholder": "Buit",
"grid.row.copyProperty": "S'ha copiat la propietat al porta-retalls",
"grid.row.count": "Compte",
"grid.row.newRow": "Nova fila",
"grid.row.action": "Acció",
"grid.selectOption.create": "Crear",
"grid.selectOption.purpleColor": "Porpra",
"grid.selectOption.pinkColor": "Rosa",
"grid.selectOption.lightPinkColor": "Rosa clar",
"grid.selectOption.orangeColor": "taronja",
"grid.selectOption.yellowColor": "Groc",
"grid.selectOption.limeColor": "Lima",
"grid.selectOption.greenColor": "Verd",
"grid.selectOption.aquaColor": "Aqua",
"grid.selectOption.blueColor": "Blau",
"grid.selectOption.deleteTag": "Suprimeix l'etiqueta",
"grid.selectOption.colorPanelTitle": "Colors",
"grid.selectOption.panelTitle": "Seleccioneu una opció o creeu-ne una",
"grid.selectOption.searchOption": "Cerca una opció",
"grid.checklist.panelTitle": "Afegeix un element",
"grid.menuName": "Quadrícula",
"grid.referencedGridPrefix": "Vista de",
"document.menuName": "Document",
"document.date.timeHintTextInTwelveHour": "01:00 PM",
"document.date.timeHintTextInTwentyFourHour": "13:00",
"document.slashMenu.board.selectABoardToLinkTo": "Seleccioneu un tauler per enllaçar",
"document.slashMenu.board.createANewBoard": "Crea una nova Junta",
"document.slashMenu.grid.selectAGridToLinkTo": "Seleccioneu una quadrícula per enllaçar",
"document.slashMenu.grid.createANewGrid": "Creeu una nova quadrícula",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Seleccioneu un calendari al qual voleu enllaçar",
"document.slashMenu.calendar.createANewCalendar": "Crea un calendari nou",
"document.selectionMenu.outline": "Esquema",
"document.plugins.referencedBoard": "Junta de referència",
"document.plugins.referencedGrid": "Quadrícula de referència",
"document.plugins.referencedCalendar": "Calendari de referència",
"document.plugins.autoGeneratorMenuItemName": "OpenAI Writer",
"document.plugins.autoGeneratorTitleName": "OpenAI: Demana a AI que escrigui qualsevol cosa...",
"document.plugins.autoGeneratorLearnMore": "Aprèn més",
"document.plugins.autoGeneratorGenerate": "Generar",
"document.plugins.autoGeneratorHintText": "Pregunta a OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "No es pot obtenir la clau OpenAI",
"document.plugins.autoGeneratorRewrite": "Reescriure",
"document.plugins.smartEdit": "Assistents d'IA",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Corregir l'ortografia",
"document.plugins.warning": "⚠️ Les respostes de la IA poden ser inexactes o enganyoses.",
"document.plugins.smartEditSummarize": "Resumir",
"document.plugins.smartEditImproveWriting": "Millorar l'escriptura",
"document.plugins.smartEditMakeLonger": "Fer més llarg",
"document.plugins.smartEditCouldNotFetchResult": "No s'ha pogut obtenir el resultat d'OpenAI",
"document.plugins.smartEditCouldNotFetchKey": "No s'ha pogut obtenir la clau OpenAI",
"document.plugins.smartEditDisabled": "Connecteu OpenAI a Configuració",
"document.plugins.discardResponse": "Voleu descartar les respostes d'IA?",
"document.plugins.createInlineMathEquation": "Crea una equació",
"document.plugins.toggleList": "Commuta la llista",
"document.plugins.cover.changeCover": "Canvi de coberta",
"document.plugins.cover.colors": "Colors",
"document.plugins.cover.images": "Imatges",
"document.plugins.cover.clearAll": "Esborra-ho tot",
"document.plugins.cover.abstract": "Resum",
"document.plugins.cover.addCover": "Afegeix coberta",
"document.plugins.cover.addLocalImage": "Afegeix una imatge local",
"document.plugins.cover.invalidImageUrl": "URL de la imatge no vàlid",
"document.plugins.cover.failedToAddImageToGallery": "No s'ha pogut afegir la imatge a la galeria",
"document.plugins.cover.enterImageUrl": "Introduïu l'URL de la imatge",
"document.plugins.cover.add": "Afegeix",
"document.plugins.cover.back": "esquena",
"document.plugins.cover.saveToGallery": "Desa a la galeria",
"document.plugins.cover.removeIcon": "Elimina la icona",
"document.plugins.cover.pasteImageUrl": "Enganxa l'URL de la imatge",
"document.plugins.cover.or": "O",
"document.plugins.cover.pickFromFiles": "Trieu entre fitxers",
"document.plugins.cover.couldNotFetchImage": "No s'ha pogut recuperar la imatge",
"document.plugins.cover.imageSavingFailed": "No s'ha pogut desar la imatge",
"document.plugins.cover.addIcon": "Afegeix una icona",
"document.plugins.cover.coverRemoveAlert": "S'eliminarà de la coberta després de suprimir-lo.",
"document.plugins.cover.alertDialogConfirmation": "N'estàs segur, vols continuar?",
"document.plugins.mathEquation.addMathEquation": "Afegeix una equació matemàtica",
"document.plugins.mathEquation.editMathEquation": "Edita l'equació matemàtica",
"document.plugins.optionAction.click": "Feu clic",
"document.plugins.optionAction.toOpenMenu": " per obrir el menú",
"document.plugins.optionAction.delete": "Suprimeix",
"document.plugins.optionAction.duplicate": "Duplicat",
"document.plugins.optionAction.turnInto": "Converteix-te en",
"document.plugins.optionAction.moveUp": "Mou-te",
"document.plugins.optionAction.moveDown": "Moure cap avall",
"document.plugins.optionAction.color": "Color",
"document.plugins.optionAction.align": "Alinear",
"document.plugins.optionAction.left": "Esquerra",
"document.plugins.optionAction.center": "Centre",
"document.plugins.optionAction.right": "Dret",
"document.plugins.optionAction.defaultColor": "Per defecte",
"document.plugins.image.copiedToPasteBoard": "L'enllaç de la imatge s'ha copiat al porta-retalls",
"document.plugins.outline.addHeadingToCreateOutline": "Afegiu títols per crear una taula de continguts.",
"document.textBlock.placeholder": "Escriviu '/' per a les ordres",
"document.title.placeholder": "Sense títol",
"document.imageBlock.placeholder": "Feu clic per afegir imatge",
"document.imageBlock.upload.label": "Carrega",
"document.imageBlock.upload.placeholder": "Feu clic per pujar la imatge",
"document.imageBlock.url.label": "URL de la imatge",
"document.imageBlock.url.placeholder": "Introduïu l'URL de la imatge",
"document.imageBlock.support": "El límit de mida de la imatge és de 5 MB. Formats admesos: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Imatge no vàlida",
"document.imageBlock.error.invalidImageSize": "La mida de la imatge ha de ser inferior a 5 MB",
"document.imageBlock.error.invalidImageFormat": "El format d'imatge no és compatible. Formats admesos: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "URL de la imatge no vàlid",
"document.codeBlock.language.label": "Llenguatge",
"document.codeBlock.language.placeholder": "Escolliu l'idioma",
"document.inlineLink.placeholder": "Enganxeu o escriviu un enllaç",
"document.inlineLink.url.label": "URL de l'enllaç",
"document.inlineLink.url.placeholder": "Introduïu l'URL de l'enllaç",
"document.inlineLink.title.label": "Títol de l'enllaç",
"document.inlineLink.title.placeholder": "Introduïu el títol de l'enllaç",
"board.column.create_new_card": "Nou",
"board.menuName": "Pissarra",
"board.referencedBoardPrefix": "Vista de",
"calendar.menuName": "Calendari",
"calendar.defaultNewCalendarTitle": "Sense títol",
"calendar.navigation.today": "Avui",
"calendar.navigation.jumpToday": "Salta a Avui",
"calendar.navigation.previousMonth": "Mes anterior",
"calendar.navigation.nextMonth": "El mes que ve",
"calendar.settings.showWeekNumbers": "Mostra els números de la setmana",
"calendar.settings.showWeekends": "Mostra els caps de setmana",
"calendar.settings.firstDayOfWeek": "Comença la setmana",
"calendar.settings.layoutDateField": "Disseny del calendari per",
"calendar.settings.noDateTitle": "Sense data",
"calendar.settings.noDateHint": "Els esdeveniments no programats es mostraran aquí",
"calendar.settings.clickToAdd": "Feu clic per afegir al calendari",
"calendar.settings.name": "Disseny del calendari",
"calendar.referencedCalendarPrefix": "Vista de",
"errorDialog.title": "Error d'AppFlowy",
"errorDialog.howToFixFallback": "Lamentem les molèsties! Envieu un problema a la nostra pàgina de GitHub que descrigui el vostre error.",
"errorDialog.github": "Veure a GitHub",
"search.label": "Cerca",
"search.placeholder.actions": "Cerca accions...",
"message.copy.success": "Copiat!",
"message.copy.fail": "No es pot copiar",
"blockActions": {
"addBelowTooltip": "Feu clic per afegir a continuació",
"addAboveCmd": "Alt+clic",
"addAboveMacCmd": "Opció+clic",
"addAboveTooltip": "afegir a dalt"
},
"importPanel": {
"textAndMarkdown": "Text i rebaixa",
"documentFromV010": "Document de la v0.1.0",
"databaseFromV010": "Base de dades de la v0.1.0",
"csv": "CSV",
"database": "Base de dades"
},
"notifications": {
"export": {
"markdown": "Nota exportada a Markdown",
"path": "Documents/fluides"
}
},
"grid": {
"deleteView": "Esteu segur que voleu suprimir aquesta vista?",
"createView": "Nou",
"settings": {
"filter": "Filtre",
"sort": "Ordena",
"sortBy": "Ordenar per",
"properties": "Propietats",
"reorderPropertiesTooltip": "Arrossegueu per reordenar les propietats",
"group": "Grup",
"addFilter": "Afegeix un filtre",
"deleteFilter": "Suprimeix el filtre",
"filterBy": "Filtra per...",
"typeAValue": "Escriu un valor...",
"layout": "Disseny",
"databaseLayout": "Disseny"
},
"textFilter": {
"contains": "Conté",
"doesNotContain": "No conté",
"endsWith": "Acaba amb",
"startWith": "Comença amb",
"is": "És",
"isNot": "No és",
"isEmpty": "Està buit",
"isNotEmpty": "No està buit",
"choicechipPrefix": {
"isNot": "No",
"startWith": "Comença amb",
"endWith": "Acaba amb",
"isEmpty": "està buit",
"isNotEmpty": "no està buida"
}
},
"checkboxFilter": {
"isChecked": "Comprovat",
"isUnchecked": "Sense marcar",
"choicechipPrefix": {
"is": "és"
}
},
"checklistFilter": {
"isComplete": "està completa",
"isIncomplted": "és incompleta"
},
"singleSelectOptionFilter": {
"is": "És",
"isNot": "No és",
"isEmpty": "Està buit",
"isNotEmpty": "No està buit"
},
"multiSelectOptionFilter": {
"contains": "Conté",
"doesNotContain": "No conté",
"isEmpty": "Està buit",
"isNotEmpty": "No està buit"
},
"field": {
"hide": "Amaga",
"insertLeft": "Insereix a l'esquerra",
"insertRight": "Insereix a la dreta",
"duplicate": "Duplicat",
"delete": "Suprimeix",
"textFieldName": "Text",
"checkboxFieldName": "casella de selecció",
"dateFieldName": "Data",
"updatedAtFieldName": "Hora de l'última modificació",
"createdAtFieldName": "Temps creat",
"numberFieldName": "Nombres",
"singleSelectFieldName": "Seleccioneu",
"multiSelectFieldName": "Selecció múltiple",
"urlFieldName": "URL",
"checklistFieldName": "Llista de verificació",
"numberFormat": "Format numèric",
"dateFormat": "Format de data",
"includeTime": "Inclou el temps",
"dateFormatFriendly": "Mes Dia, Any",
"dateFormatISO": "Any-Mes-Dia",
"dateFormatLocal": "Mes/Dia/Any",
"dateFormatUS": "Any/Mes/Dia",
"dateFormatDayMonthYear": "Dia/Mes/Any",
"timeFormat": "Format horari",
"invalidTimeFormat": "Format no vàlid",
"timeFormatTwelveHour": "12 hores",
"timeFormatTwentyFourHour": "24 hores",
"addSelectOption": "Afegeix una opció",
"optionTitle": "Opcions",
"addOption": "Afegeix opció",
"editProperty": "Edita la propietat",
"newProperty": "Nova propietat",
"deleteFieldPromptMessage": "Estàs segur? Aquesta propietat se suprimirà"
},
"sort": {
"ascending": "Ascendent",
"descending": "Descens",
"deleteSort": "Suprimeix l'ordenació",
"addSort": "Afegeix ordenació"
},
"row": {
"duplicate": "Duplicat",
"delete": "Suprimeix",
"textPlaceholder": "Buit",
"copyProperty": "S'ha copiat la propietat al porta-retalls",
"count": "Compte",
"newRow": "Nova fila",
"action": "Acció"
},
"selectOption": {
"create": "Crear",
"purpleColor": "Porpra",
"pinkColor": "Rosa",
"lightPinkColor": "Rosa clar",
"orangeColor": "taronja",
"yellowColor": "Groc",
"limeColor": "Lima",
"greenColor": "Verd",
"aquaColor": "Aqua",
"blueColor": "Blau",
"deleteTag": "Suprimeix l'etiqueta",
"colorPanelTitle": "Colors",
"panelTitle": "Seleccioneu una opció o creeu-ne una",
"searchOption": "Cerca una opció"
},
"checklist": {
"panelTitle": "Afegeix un element"
},
"menuName": "Quadrícula",
"referencedGridPrefix": "Vista de"
},
"document": {
"menuName": "Document",
"date": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Seleccioneu un tauler per enllaçar",
"createANewBoard": "Crea una nova Junta"
},
"grid": {
"selectAGridToLinkTo": "Seleccioneu una quadrícula per enllaçar",
"createANewGrid": "Creeu una nova quadrícula"
},
"calendar": {
"selectACalendarToLinkTo": "Seleccioneu un calendari al qual voleu enllaçar",
"createANewCalendar": "Crea un calendari nou"
}
},
"selectionMenu": {
"outline": "Esquema"
},
"plugins": {
"referencedBoard": "Junta de referència",
"referencedGrid": "Quadrícula de referència",
"referencedCalendar": "Calendari de referència",
"autoGeneratorMenuItemName": "OpenAI Writer",
"autoGeneratorTitleName": "OpenAI: Demana a AI que escrigui qualsevol cosa...",
"autoGeneratorLearnMore": "Aprèn més",
"autoGeneratorGenerate": "Generar",
"autoGeneratorHintText": "Pregunta a OpenAI...",
"autoGeneratorCantGetOpenAIKey": "No es pot obtenir la clau OpenAI",
"autoGeneratorRewrite": "Reescriure",
"smartEdit": "Assistents d'IA",
"openAI": "OpenAI",
"smartEditFixSpelling": "Corregir l'ortografia",
"warning": "⚠️ Les respostes de la IA poden ser inexactes o enganyoses.",
"smartEditSummarize": "Resumir",
"smartEditImproveWriting": "Millorar l'escriptura",
"smartEditMakeLonger": "Fer més llarg",
"smartEditCouldNotFetchResult": "No s'ha pogut obtenir el resultat d'OpenAI",
"smartEditCouldNotFetchKey": "No s'ha pogut obtenir la clau OpenAI",
"smartEditDisabled": "Connecteu OpenAI a Configuració",
"discardResponse": "Voleu descartar les respostes d'IA?",
"createInlineMathEquation": "Crea una equació",
"toggleList": "Commuta la llista",
"cover": {
"changeCover": "Canvi de coberta",
"colors": "Colors",
"images": "Imatges",
"clearAll": "Esborra-ho tot",
"abstract": "Resum",
"addCover": "Afegeix coberta",
"addLocalImage": "Afegeix una imatge local",
"invalidImageUrl": "URL de la imatge no vàlid",
"failedToAddImageToGallery": "No s'ha pogut afegir la imatge a la galeria",
"enterImageUrl": "Introduïu l'URL de la imatge",
"add": "Afegeix",
"back": "esquena",
"saveToGallery": "Desa a la galeria",
"removeIcon": "Elimina la icona",
"pasteImageUrl": "Enganxa l'URL de la imatge",
"or": "O",
"pickFromFiles": "Trieu entre fitxers",
"couldNotFetchImage": "No s'ha pogut recuperar la imatge",
"imageSavingFailed": "No s'ha pogut desar la imatge",
"addIcon": "Afegeix una icona",
"coverRemoveAlert": "S'eliminarà de la coberta després de suprimir-lo.",
"alertDialogConfirmation": "N'estàs segur, vols continuar?"
},
"mathEquation": {
"addMathEquation": "Afegeix una equació matemàtica",
"editMathEquation": "Edita l'equació matemàtica"
},
"optionAction": {
"click": "Feu clic",
"toOpenMenu": " per obrir el menú",
"delete": "Suprimeix",
"duplicate": "Duplicat",
"turnInto": "Converteix-te en",
"moveUp": "Mou-te",
"moveDown": "Moure cap avall",
"color": "Color",
"align": "Alinear",
"left": "Esquerra",
"center": "Centre",
"right": "Dret",
"defaultColor": "Per defecte"
},
"image": {
"copiedToPasteBoard": "L'enllaç de la imatge s'ha copiat al porta-retalls"
},
"outline": {
"addHeadingToCreateOutline": "Afegiu títols per crear una taula de continguts."
}
},
"textBlock": {
"placeholder": "Escriviu '/' per a les ordres"
},
"title": {
"placeholder": "Sense títol"
},
"imageBlock": {
"placeholder": "Feu clic per afegir imatge",
"upload": {
"label": "Carrega",
"placeholder": "Feu clic per pujar la imatge"
},
"url": {
"label": "URL de la imatge",
"placeholder": "Introduïu l'URL de la imatge"
},
"support": "El límit de mida de la imatge és de 5 MB. Formats admesos: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Imatge no vàlida",
"invalidImageSize": "La mida de la imatge ha de ser inferior a 5 MB",
"invalidImageFormat": "El format d'imatge no és compatible. Formats admesos: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "URL de la imatge no vàlid"
}
},
"codeBlock": {
"language": {
"label": "Llenguatge",
"placeholder": "Escolliu l'idioma"
}
},
"inlineLink": {
"placeholder": "Enganxeu o escriviu un enllaç",
"url": {
"label": "URL de l'enllaç",
"placeholder": "Introduïu l'URL de l'enllaç"
},
"title": {
"label": "Títol de l'enllaç",
"placeholder": "Introduïu el títol de l'enllaç"
}
}
},
"board": {
"column": {
"create_new_card": "Nou"
},
"menuName": "Pissarra",
"referencedBoardPrefix": "Vista de"
},
"calendar": {
"menuName": "Calendari",
"defaultNewCalendarTitle": "Sense títol",
"navigation": {
"today": "Avui",
"jumpToday": "Salta a Avui",
"previousMonth": "Mes anterior",
"nextMonth": "El mes que ve"
},
"settings": {
"showWeekNumbers": "Mostra els números de la setmana",
"showWeekends": "Mostra els caps de setmana",
"firstDayOfWeek": "Comença la setmana",
"layoutDateField": "Disseny del calendari per",
"noDateTitle": "Sense data",
"noDateHint": "Els esdeveniments no programats es mostraran aquí",
"clickToAdd": "Feu clic per afegir al calendari",
"name": "Disseny del calendari"
},
"referencedCalendarPrefix": "Vista de"
},
"errorDialog": {
"title": "Error d'AppFlowy",
"howToFixFallback": "Lamentem les molèsties! Envieu un problema a la nostra pàgina de GitHub que descrigui el vostre error.",
"github": "Veure a GitHub"
},
"search": {
"label": "Cerca",
"placeholder": {
"actions": "Cerca accions..."
}
},
"message": {
"copy": {
"success": "Copiat!",
"fail": "No es pot copiar"
}
},
"unSupportBlock": "La versió actual no admet aquest bloc.",
"views.deleteContentTitle": "Esteu segur que voleu suprimir {pageType}?",
"views.deleteContentCaption": "si suprimiu aquest {pageType}, podeu restaurar-lo des de la paperera."
"views": {
"deleteContentTitle": "Esteu segur que voleu suprimir {pageType}?",
"deleteContentCaption": "si suprimiu aquest {pageType}, podeu restaurar-lo des de la paperera."
}
}
+449 -376
View File
@@ -27,7 +27,8 @@
"passwordHint": "Passwort",
"dontHaveAnAccount": "Du besitzt noch kein Konto?",
"repeatPasswordEmptyError": "Passwortwiederholung darf nicht leer sein",
"unmatchedPasswordError": "Passwörter stimmen nicht überein"
"unmatchedPasswordError": "Passwörter stimmen nicht überein",
"loginAsGuestButtonText": "Loslegen"
},
"workspace": {
"create": "Arbeitsbereich erstellen",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Umbenennen",
"delete": "Löschen",
"duplicate": "Duplizieren"
"duplicate": "Duplizieren",
"openNewTab": "In einem neuen Tab öffnen"
},
"blankPageTitle": "Leere Seite",
"newPageText": "Neue Seite",
@@ -55,6 +57,14 @@
"fileName": "Dateiname",
"lastModified": "Letzte Änderung",
"created": "Erstellt"
},
"confirmDeleteAll": {
"title": "Sind Sie sicher, dass alle Seiten im Papierkorb gelöscht werden?",
"caption": "Diese Aktion kann nicht rückgängig gemacht werden."
},
"confirmRestoreAll": {
"title": "Sind Sie sicher, dass alle Seiten im Papierkorb wiederhergestellt werden?",
"caption": "Diese Aktion kann nicht rückgängig gemacht werden."
}
},
"deletePagePrompt": {
@@ -71,7 +81,9 @@
"success": "Debug-Informationen in die Zwischenablage kopiert!",
"fail": "Debug-Informationen können nicht in die Zwischenablage kopiert werden"
},
"shortcuts": "Abkürzungen"
"shortcuts": "Abkürzungen",
"markdown": "Abschlag",
"feedback": "Rückmeldung"
},
"menuAppHeader": {
"addPageTooltip": "Schnell eine Seite innerhalb hinzufügen",
@@ -92,12 +104,20 @@
"quote": "Zitat",
"header": "Überschrift",
"highlight": "Hervorhebung",
"color": "Farbe"
"color": "Farbe",
"addLink": "Link hinzufügen",
"link": "Verknüpfung"
},
"tooltip": {
"lightMode": "In den hellen Modus wechseln",
"darkMode": "In den dunklen Modus wechseln",
"openAsPage": "Als Seite öffnen"
"openAsPage": "Als Seite öffnen",
"addNewRow": "Fügen Sie eine neue Zeile hinzu",
"openMenu": "Klicken Sie hier, um das Menü zu öffnen",
"dragRow": "Lange drücken, um die Zeile neu anzuordnen",
"viewDataBase": "Datenbank ansehen",
"referencePage": "Auf diesen {Name} wird verwiesen",
"addBlockBelow": "Fügen Sie unten einen Block hinzu"
},
"contactsPage": {
"title": "Kontakte",
@@ -111,7 +131,21 @@
"signIn": "Anmelden",
"signOut": "Abmelden",
"complete": "Fertig",
"save": "Speichern"
"save": "Speichern",
"Done": "Erledigt",
"generate": "Generieren",
"esc": "ESC",
"keep": "Halten",
"tryAgain": "Versuchen Sie es erneut",
"discard": "Verwerfen",
"replace": "Ersetzen",
"insertBelow": "Unten einfügen",
"upload": "Hochladen",
"edit": "Bearbeiten",
"delete": "Löschen",
"duplicate": "Duplikat",
"done": "Erledigt",
"putback": "Zurück geben"
},
"label": {
"welcome": "Willkommen!",
@@ -138,11 +172,37 @@
"menu": {
"appearance": "Aussehen",
"language": "Sprache",
"open": "Einstellungen öffnen"
"open": "Einstellungen öffnen",
"user": "Benutzer",
"files": "Dateien",
"supabaseSetting": "Supabase-Einstellung"
},
"appearance": {
"lightLabel": "Heller Modus",
"darkLabel": "Dunkler Modus"
"darkLabel": "Dunkler Modus",
"fontFamily": {
"label": "Schriftfamilie",
"search": "Suchen"
},
"themeMode": {
"label": "Themenmodus",
"light": "Lichtmodus",
"dark": "Dunkler Modus",
"system": "An das System anpassen"
},
"themeUpload": {
"button": "Hochladen",
"description": "Laden Sie Ihr eigenes AppFlowy-Theme über die Schaltfläche unten hoch.",
"failure": "Das hochgeladene Theme hatte ein ungültiges Format.",
"loading": "Bitte warten Sie, während wir Ihr Theme validieren und hochladen ...",
"uploadSuccess": "Ihr Theme wurde erfolgreich hochgeladen",
"deletionFailure": "Das Thema konnte nicht gelöscht werden. Versuchen Sie, es manuell zu löschen.",
"filePickerDialogTitle": "Wählen Sie eine .flowy_plugin-Datei",
"urlUploadFailure": "URL konnte nicht geöffnet werden: {}"
},
"theme": "Thema",
"builtInsLabel": "Integrierte Themes",
"pluginsLabel": "Plugins"
},
"shortcuts": {
"shortcutsLabel": "Verknüpfungen",
@@ -150,6 +210,48 @@
"updateShortcutStep": "Drücken Sie die gewünschte Tastenkombination und drücken Sie ENTER",
"shortcutIsAlreadyUsed": "Diese Verknüpfung wird bereits verwendet für: {conflict}",
"resetToDefault": "Zurücksetzen"
},
"files": {
"copy": "Kopieren",
"defaultLocation": "Lesen Sie Dateien und Datenspeicherort",
"exportData": "Exportieren Sie Ihre Daten",
"doubleTapToCopy": "Tippen Sie zweimal, um den Pfad zu kopieren",
"restoreLocation": "Stellen Sie den AppFlowy-Standardpfad wieder her",
"customizeLocation": "Öffnen Sie einen anderen Ordner",
"restartApp": "Bitte starten Sie die App neu, damit die Änderungen wirksam werden.",
"exportDatabase": "Datenbank exportieren",
"selectFiles": "Wählen Sie die Dateien aus, die exportiert werden sollen",
"selectAll": "Wählen Sie Alle",
"deselectAll": "Alle abwählen",
"createNewFolder": "Einen neuen Ordner erstellen",
"createNewFolderDesc": "Teilen Sie uns mit, wo Sie Ihre Daten speichern möchten",
"defineWhereYourDataIsStored": "Legen Sie fest, wo Ihre Daten gespeichert werden",
"open": "Offen",
"openFolder": "Öffnen Sie einen vorhandenen Ordner",
"openFolderDesc": "Lesen Sie es und schreiben Sie es in Ihren vorhandenen AppFlowy-Ordner",
"folderHintText": "Ordnernamen",
"location": "Erstellen eines neuen Ordners",
"locationDesc": "Wählen Sie einen Namen für Ihren AppFlowy-Datenordner",
"browser": "Durchsuche",
"create": "Erstellen",
"set": "Satz",
"folderPath": "Pfad zum Speichern Ihres Ordners",
"locationCannotBeEmpty": "Der Pfad darf nicht leer sein",
"pathCopiedSnackbar": "Dateispeicherpfad in Zwischenablage kopiert!",
"changeLocationTooltips": "Ändern Sie das Datenverzeichnis",
"change": "Ändern",
"openLocationTooltips": "Öffnen Sie ein anderes Datenverzeichnis",
"openCurrentDataFolder": "Aktuelles Datenverzeichnis öffnen",
"recoverLocationTooltips": "Zurücksetzen auf das Standarddatenverzeichnis von AppFlowy",
"exportFileSuccess": "Datei erfolgreich exportieren!",
"exportFileFail": "Datei exportieren fehlgeschlagen!",
"export": "Export"
},
"user": {
"name": "Name",
"icon": "Symbol",
"selectAnIcon": "Wählen Sie ein Symbol aus",
"pleaseInputYourOpenAIKey": "Bitte geben Sie Ihren OpenAI-Schlüssel ein"
}
},
"sideBar": {
@@ -161,375 +263,346 @@
"medium": "mittel",
"large": "groß",
"fontSize": "Schriftgröße",
"import": "Importieren"
"import": "Importieren",
"moreOptions": "Mehr Optionen"
},
"youCanAlso": "Du kannst auch",
"and": "Und",
"blockActions.addBelowTooltip": "Klicken Sie unten, um etwas hinzuzufügen",
"blockActions.addAboveCmd": "Alt+Klick",
"blockActions.addAboveMacCmd": "Wahl+Klick",
"blockActions.addAboveTooltip": "oben hinzufügen",
"signIn.loginAsGuestButtonText": "Loslegen",
"moreAction.moreOptions": "Mehr Optionen",
"importPanel.textAndMarkdown": "Text & Markdown",
"importPanel.documentFromV010": "Dokument von v0.1.0",
"importPanel.databaseFromV010": "Datenbank ab v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Datenbank",
"disclosureAction.openNewTab": "In einem neuen Tab öffnen",
"trash.confirmDeleteAll.title": "Sind Sie sicher, dass alle Seiten im Papierkorb gelöscht werden?",
"trash.confirmDeleteAll.caption": "Diese Aktion kann nicht rückgängig gemacht werden.",
"trash.confirmRestoreAll.title": "Sind Sie sicher, dass alle Seiten im Papierkorb wiederhergestellt werden?",
"trash.confirmRestoreAll.caption": "Diese Aktion kann nicht rückgängig gemacht werden.",
"questionBubble.markdown": "Abschlag",
"questionBubble.feedback": "Rückmeldung",
"toolbar.addLink": "Link hinzufügen",
"toolbar.link": "Verknüpfung",
"tooltip.addNewRow": "Fügen Sie eine neue Zeile hinzu",
"tooltip.openMenu": "Klicken Sie hier, um das Menü zu öffnen",
"tooltip.dragRow": "Lange drücken, um die Zeile neu anzuordnen",
"tooltip.viewDataBase": "Datenbank ansehen",
"tooltip.referencePage": "Auf diesen {Name} wird verwiesen",
"tooltip.addBlockBelow": "Fügen Sie unten einen Block hinzu",
"notifications.export.markdown": "Notiz nach Markdown exportiert",
"notifications.export.path": "Dokumente/fließend",
"button.Done": "Erledigt",
"button.generate": "Generieren",
"button.esc": "ESC",
"button.keep": "Halten",
"button.tryAgain": "Versuchen Sie es erneut",
"button.discard": "Verwerfen",
"button.replace": "Ersetzen",
"button.insertBelow": "Unten einfügen",
"button.upload": "Hochladen",
"button.edit": "Bearbeiten",
"button.delete": "Löschen",
"button.duplicate": "Duplikat",
"button.done": "Erledigt",
"button.putback": "Zurück geben",
"settings.menu.user": "Benutzer",
"settings.menu.files": "Dateien",
"settings.menu.supabaseSetting": "Supabase-Einstellung",
"settings.appearance.fontFamily.label": "Schriftfamilie",
"settings.appearance.fontFamily.search": "Suchen",
"settings.appearance.themeMode.label": "Themenmodus",
"settings.appearance.themeMode.light": "Lichtmodus",
"settings.appearance.themeMode.dark": "Dunkler Modus",
"settings.appearance.themeMode.system": "An das System anpassen",
"settings.appearance.themeUpload.button": "Hochladen",
"settings.appearance.themeUpload.description": "Laden Sie Ihr eigenes AppFlowy-Theme über die Schaltfläche unten hoch.",
"settings.appearance.themeUpload.failure": "Das hochgeladene Theme hatte ein ungültiges Format.",
"settings.appearance.themeUpload.loading": "Bitte warten Sie, während wir Ihr Theme validieren und hochladen ...",
"settings.appearance.themeUpload.uploadSuccess": "Ihr Theme wurde erfolgreich hochgeladen",
"settings.appearance.themeUpload.deletionFailure": "Das Thema konnte nicht gelöscht werden. Versuchen Sie, es manuell zu löschen.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Wählen Sie eine .flowy_plugin-Datei",
"settings.appearance.themeUpload.urlUploadFailure": "URL konnte nicht geöffnet werden: {}",
"settings.appearance.theme": "Thema",
"settings.appearance.builtInsLabel": "Integrierte Themes",
"settings.appearance.pluginsLabel": "Plugins",
"settings.files.copy": "Kopieren",
"settings.files.defaultLocation": "Lesen Sie Dateien und Datenspeicherort",
"settings.files.exportData": "Exportieren Sie Ihre Daten",
"settings.files.doubleTapToCopy": "Tippen Sie zweimal, um den Pfad zu kopieren",
"settings.files.restoreLocation": "Stellen Sie den AppFlowy-Standardpfad wieder her",
"settings.files.customizeLocation": "Öffnen Sie einen anderen Ordner",
"settings.files.restartApp": "Bitte starten Sie die App neu, damit die Änderungen wirksam werden.",
"settings.files.exportDatabase": "Datenbank exportieren",
"settings.files.selectFiles": "Wählen Sie die Dateien aus, die exportiert werden sollen",
"settings.files.selectAll": "Wählen Sie Alle",
"settings.files.deselectAll": "Alle abwählen",
"settings.files.createNewFolder": "Einen neuen Ordner erstellen",
"settings.files.createNewFolderDesc": "Teilen Sie uns mit, wo Sie Ihre Daten speichern möchten",
"settings.files.defineWhereYourDataIsStored": "Legen Sie fest, wo Ihre Daten gespeichert werden",
"settings.files.open": "Offen",
"settings.files.openFolder": "Öffnen Sie einen vorhandenen Ordner",
"settings.files.openFolderDesc": "Lesen Sie es und schreiben Sie es in Ihren vorhandenen AppFlowy-Ordner",
"settings.files.folderHintText": "Ordnernamen",
"settings.files.location": "Erstellen eines neuen Ordners",
"settings.files.locationDesc": "Wählen Sie einen Namen für Ihren AppFlowy-Datenordner",
"settings.files.browser": "Durchsuche",
"settings.files.create": "Erstellen",
"settings.files.set": "Satz",
"settings.files.folderPath": "Pfad zum Speichern Ihres Ordners",
"settings.files.locationCannotBeEmpty": "Der Pfad darf nicht leer sein",
"settings.files.pathCopiedSnackbar": "Dateispeicherpfad in Zwischenablage kopiert!",
"settings.files.changeLocationTooltips": "Ändern Sie das Datenverzeichnis",
"settings.files.change": "Ändern",
"settings.files.openLocationTooltips": "Öffnen Sie ein anderes Datenverzeichnis",
"settings.files.openCurrentDataFolder": "Aktuelles Datenverzeichnis öffnen",
"settings.files.recoverLocationTooltips": "Zurücksetzen auf das Standarddatenverzeichnis von AppFlowy",
"settings.files.exportFileSuccess": "Datei erfolgreich exportieren!",
"settings.files.exportFileFail": "Datei exportieren fehlgeschlagen!",
"settings.files.export": "Export",
"settings.user.name": "Name",
"settings.user.icon": "Symbol",
"settings.user.selectAnIcon": "Wählen Sie ein Symbol aus",
"settings.user.pleaseInputYourOpenAIKey": "Bitte geben Sie Ihren OpenAI-Schlüssel ein",
"grid.deleteView": "Möchten Sie diese Ansicht wirklich löschen?",
"grid.createView": "Neu",
"grid.settings.filter": "Filter",
"grid.settings.sort": "Sortieren",
"grid.settings.sortBy": "Sortiere nach",
"grid.settings.properties": "Eigenschaften",
"grid.settings.reorderPropertiesTooltip": "Ziehen Sie, um die Eigenschaften neu anzuordnen",
"grid.settings.group": "Gruppe",
"grid.settings.addFilter": "Filter hinzufügen",
"grid.settings.deleteFilter": "Filter löschen",
"grid.settings.filterBy": "Filtern nach...",
"grid.settings.typeAValue": "Geben Sie einen Wert ein...",
"grid.settings.layout": "Layout",
"grid.settings.databaseLayout": "Layout",
"grid.textFilter.contains": "Enthält",
"grid.textFilter.doesNotContain": "Beinhaltet nicht",
"grid.textFilter.endsWith": "Endet mit",
"grid.textFilter.startWith": "Beginnt mit",
"grid.textFilter.is": "Ist",
"grid.textFilter.isNot": "Ist nicht",
"grid.textFilter.isEmpty": "Ist leer",
"grid.textFilter.isNotEmpty": "Ist nicht leer",
"grid.textFilter.choicechipPrefix.isNot": "Nicht",
"grid.textFilter.choicechipPrefix.startWith": "Beginnt mit",
"grid.textFilter.choicechipPrefix.endWith": "Endet mit",
"grid.textFilter.choicechipPrefix.isEmpty": "ist leer",
"grid.textFilter.choicechipPrefix.isNotEmpty": "ist nicht leer",
"grid.checkboxFilter.isChecked": "Geprüft",
"grid.checkboxFilter.isUnchecked": "Ungeprüft",
"grid.checkboxFilter.choicechipPrefix.is": "Ist",
"grid.checklistFilter.isComplete": "ist komplett",
"grid.checklistFilter.isIncomplted": "ist unvollständig",
"grid.singleSelectOptionFilter.is": "Ist",
"grid.singleSelectOptionFilter.isNot": "Ist nicht",
"grid.singleSelectOptionFilter.isEmpty": "Ist leer",
"grid.singleSelectOptionFilter.isNotEmpty": "Ist nicht leer",
"grid.multiSelectOptionFilter.contains": "Enthält",
"grid.multiSelectOptionFilter.doesNotContain": "Beinhaltet nicht",
"grid.multiSelectOptionFilter.isEmpty": "Ist leer",
"grid.multiSelectOptionFilter.isNotEmpty": "Ist nicht leer",
"grid.field.hide": "Verstecken",
"grid.field.insertLeft": "Links einfügen",
"grid.field.insertRight": "Rechts einfügen",
"grid.field.duplicate": "Duplikat",
"grid.field.delete": "Löschen",
"grid.field.textFieldName": "Text",
"grid.field.checkboxFieldName": "Kontrollkästchen",
"grid.field.dateFieldName": "Datum",
"grid.field.updatedAtFieldName": "Letzte Änderungszeit",
"grid.field.createdAtFieldName": "Zeit geschaffen",
"grid.field.numberFieldName": "Zahlen",
"grid.field.singleSelectFieldName": "Wählen",
"grid.field.multiSelectFieldName": "Mehrfachauswahl",
"grid.field.urlFieldName": "URL",
"grid.field.checklistFieldName": "Checkliste",
"grid.field.numberFormat": "Zahlenformat",
"grid.field.dateFormat": "Datumsformat",
"grid.field.includeTime": "Zeit einbeziehen",
"grid.field.dateFormatFriendly": "Monat Tag Jahr",
"grid.field.dateFormatISO": "Jahr Monat Tag",
"grid.field.dateFormatLocal": "Monat Tag Jahr",
"grid.field.dateFormatUS": "Jahr Monat Tag",
"grid.field.dateFormatDayMonthYear": "Tag Monat Jahr",
"grid.field.timeFormat": "Zeitformat",
"grid.field.invalidTimeFormat": "Ungültiges Format",
"grid.field.timeFormatTwelveHour": "12 Stunden",
"grid.field.timeFormatTwentyFourHour": "24 Stunden",
"grid.field.addSelectOption": "Fügen Sie eine Option hinzu",
"grid.field.optionTitle": "Optionen",
"grid.field.addOption": "Option hinzufügen",
"grid.field.editProperty": "Eigenschaft bearbeiten",
"grid.field.newProperty": "Neue Eigenschaft",
"grid.field.deleteFieldPromptMessage": "Bist du dir sicher? Diese Eigenschaft wird gelöscht",
"grid.sort.ascending": "Aufsteigend",
"grid.sort.descending": "Absteigend",
"grid.sort.deleteSort": "Sortierung löschen",
"grid.sort.addSort": "Sortierung hinzufügen",
"grid.row.duplicate": "Duplikat",
"grid.row.delete": "Löschen",
"grid.row.textPlaceholder": "Leer",
"grid.row.copyProperty": "Eigenschaft in die Zwischenablage kopiert",
"grid.row.count": "Zählen",
"grid.row.newRow": "Neue Reihe",
"grid.row.action": "Aktion",
"grid.selectOption.create": "Erstellen",
"grid.selectOption.purpleColor": "Lila",
"grid.selectOption.pinkColor": "Rosa",
"grid.selectOption.lightPinkColor": "Hell-Pink",
"grid.selectOption.orangeColor": "Orange",
"grid.selectOption.yellowColor": "Gelb",
"grid.selectOption.limeColor": "Kalk",
"grid.selectOption.greenColor": "Grün",
"grid.selectOption.aquaColor": "Aqua",
"grid.selectOption.blueColor": "Blau",
"grid.selectOption.deleteTag": "Tag löschen",
"grid.selectOption.colorPanelTitle": "Farben",
"grid.selectOption.panelTitle": "Wählen Sie eine Option aus oder erstellen Sie eine",
"grid.selectOption.searchOption": "Suchen Sie nach einer Option",
"grid.checklist.panelTitle": "Fügen Sie einen Artikel hinzu",
"grid.menuName": "Tabelle",
"grid.referencedGridPrefix": "Sicht von",
"document.menuName": "Dokumentieren",
"document.date.timeHintTextInTwelveHour": "13:00 Uhr",
"document.date.timeHintTextInTwentyFourHour": "13:00",
"document.slashMenu.board.selectABoardToLinkTo": "Wählen Sie ein Board aus, zu dem Sie einen Link erstellen möchten",
"document.slashMenu.board.createANewBoard": "Erstellen Sie ein neues Board",
"document.slashMenu.grid.selectAGridToLinkTo": "Wählen Sie ein Tabelle zum Verknüpfen aus",
"document.slashMenu.grid.createANewGrid": "Erstellen Sie ein neues Tabelle",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Wählen Sie einen Kalender aus, mit dem Sie eine Verknüpfung erstellen möchten",
"document.slashMenu.calendar.createANewCalendar": "Erstellen Sie einen neuen Kalender",
"document.selectionMenu.outline": "Umriss",
"document.plugins.referencedBoard": "Referenziertes Board",
"document.plugins.referencedGrid": "Referenziertes Tabelle",
"document.plugins.referencedCalendar": "Referenzierter Kalender",
"document.plugins.autoGeneratorMenuItemName": "OpenAI-Autor",
"document.plugins.autoGeneratorTitleName": "OpenAI: Bitten Sie die KI, etwas zu schreiben ...",
"document.plugins.autoGeneratorLearnMore": "Erfahren Sie mehr",
"document.plugins.autoGeneratorGenerate": "Generieren",
"document.plugins.autoGeneratorHintText": "Fragen Sie OpenAI ...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Der OpenAI-Schlüssel kann nicht abgerufen werden",
"document.plugins.autoGeneratorRewrite": "Umschreiben",
"document.plugins.smartEdit": "KI-Assistenten",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Korrigiere Rechtschreibung",
"document.plugins.warning": "⚠️ KI-Antworten können ungenau oder irreführend sein.",
"document.plugins.smartEditSummarize": "Zusammenfassen",
"document.plugins.smartEditImproveWriting": "Verbessern Sie das Schreiben",
"document.plugins.smartEditMakeLonger": "Länger machen",
"document.plugins.smartEditCouldNotFetchResult": "Das Ergebnis konnte nicht von OpenAI abgerufen werden",
"document.plugins.smartEditCouldNotFetchKey": "Der OpenAI-Schlüssel konnte nicht abgerufen werden",
"document.plugins.smartEditDisabled": "Verbinden Sie OpenAI in den Einstellungen",
"document.plugins.discardResponse": "Möchten Sie die KI-Antworten verwerfen?",
"document.plugins.createInlineMathEquation": "Gleichung erstellen",
"document.plugins.toggleList": "Liste umschalten",
"document.plugins.cover.changeCover": "Deckung wechseln",
"document.plugins.cover.colors": "Farben",
"document.plugins.cover.images": "Bilder",
"document.plugins.cover.clearAll": "Alles löschen",
"document.plugins.cover.abstract": "Abstrakt",
"document.plugins.cover.addCover": "Abdeckung hinzufügen",
"document.plugins.cover.addLocalImage": "Lokales Bild hinzufügen",
"document.plugins.cover.invalidImageUrl": "Ungültige Bild-URL",
"document.plugins.cover.failedToAddImageToGallery": "Das Bild konnte nicht zur Galerie hinzugefügt werden",
"document.plugins.cover.enterImageUrl": "Geben Sie die Bild-URL ein",
"document.plugins.cover.add": "Hinzufügen",
"document.plugins.cover.back": "Zurück",
"document.plugins.cover.saveToGallery": "In der Galerie speichern",
"document.plugins.cover.removeIcon": "Symbol entfernen",
"document.plugins.cover.pasteImageUrl": "Bild-URL einfügen",
"document.plugins.cover.or": "ODER",
"document.plugins.cover.pickFromFiles": "Wählen Sie aus Dateien",
"document.plugins.cover.couldNotFetchImage": "Bild konnte nicht abgerufen werden",
"document.plugins.cover.imageSavingFailed": "Bildspeicherung fehlgeschlagen",
"document.plugins.cover.addIcon": "Symbol hinzufügen",
"document.plugins.cover.coverRemoveAlert": "Nach dem Löschen wird es aus der Abdeckung entfernt.",
"document.plugins.cover.alertDialogConfirmation": "Bist du dir sicher, dass du weitermachen willst?",
"document.plugins.mathEquation.addMathEquation": "Mathematische Gleichung hinzufügen",
"document.plugins.mathEquation.editMathEquation": "Bearbeiten Sie die mathematische Gleichung",
"document.plugins.optionAction.click": "Klicken",
"document.plugins.optionAction.toOpenMenu": " um das Menü zu öffnen",
"document.plugins.optionAction.delete": "Löschen",
"document.plugins.optionAction.duplicate": "Duplikat",
"document.plugins.optionAction.turnInto": "Einbiegen in",
"document.plugins.optionAction.moveUp": "Bewegen Sie sich nach oben",
"document.plugins.optionAction.moveDown": "Sich abwärts bewegen",
"document.plugins.optionAction.color": "Farbe",
"document.plugins.optionAction.align": "Ausrichten",
"document.plugins.optionAction.left": "Links",
"document.plugins.optionAction.center": "Center",
"document.plugins.optionAction.right": "Rechts",
"document.plugins.optionAction.defaultColor": "Standard",
"document.plugins.image.copiedToPasteBoard": "Der Bildlink wurde in die Zwischenablage kopiert",
"document.plugins.outline.addHeadingToCreateOutline": "Fügen Sie Überschriften hinzu, um ein Inhaltsverzeichnis zu erstellen.",
"document.textBlock.placeholder": "Geben Sie „/“ für Befehle ein",
"document.title.placeholder": "Ohne Titel",
"document.imageBlock.placeholder": "Klicken Sie, um ein Bild hinzuzufügen",
"document.imageBlock.upload.label": "Hochladen",
"document.imageBlock.upload.placeholder": "Klicken Sie, um das Bild hochzuladen",
"document.imageBlock.url.label": "Bild URL",
"document.imageBlock.url.placeholder": "Geben Sie die Bild-URL ein",
"document.imageBlock.support": "Die Bildgrößenbeschränkung beträgt 5 MB. Unterstützte Formate: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Ungültiges Bild",
"document.imageBlock.error.invalidImageSize": "Die Bildgröße muss weniger als 5 MB betragen",
"document.imageBlock.error.invalidImageFormat": "Das Bildformat wird nicht unterstützt. Unterstützte Formate: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "Ungültige Bild-URL",
"document.codeBlock.language.label": "Sprache",
"document.codeBlock.language.placeholder": "Sprache auswählen",
"document.inlineLink.placeholder": "Fügen Sie einen Link ein oder geben Sie ihn ein",
"document.inlineLink.url.label": "URL verknüpfen",
"document.inlineLink.url.placeholder": "Geben Sie die Link-URL ein",
"document.inlineLink.title.label": "Linktitel",
"document.inlineLink.title.placeholder": "Geben Sie den Linktitel ein",
"board.column.create_new_card": "Neu",
"board.menuName": "Board",
"board.referencedBoardPrefix": "Sicht von",
"calendar.menuName": "Kalender",
"calendar.defaultNewCalendarTitle": "Ohne Titel",
"calendar.navigation.today": "Heute",
"calendar.navigation.jumpToday": "Springe zu Heute",
"calendar.navigation.previousMonth": "Vorheriger Monat",
"calendar.navigation.nextMonth": "Nächsten Monat",
"calendar.settings.showWeekNumbers": "Wochennummern anzeigen",
"calendar.settings.showWeekends": "Wochenenden anzeigen",
"calendar.settings.firstDayOfWeek": "Beginnen Sie die Woche am",
"calendar.settings.layoutDateField": "Layoutkalender von",
"calendar.settings.noDateTitle": "Kein Datum",
"calendar.settings.noDateHint": "Außerplanmäßige Ereignisse werden hier angezeigt",
"calendar.settings.clickToAdd": "Klicken Sie, um es zum Kalender hinzuzufügen",
"calendar.settings.name": "Kalenderlayout",
"calendar.referencedCalendarPrefix": "Sicht von",
"errorDialog.title": "AppFlowy-Fehler",
"errorDialog.howToFixFallback": "Wir entschuldigen uns für die Unannehmlichkeiten! Reichen Sie auf unserer GitHub-Seite ein Problem ein, das Ihren Fehler beschreibt.",
"errorDialog.github": "Auf GitHub ansehen",
"search.label": "Suchen",
"search.placeholder.actions": "Suchaktionen...",
"message.copy.success": "Kopiert!",
"message.copy.fail": "Kopieren nicht möglich",
"blockActions": {
"addBelowTooltip": "Klicken Sie unten, um etwas hinzuzufügen",
"addAboveCmd": "Alt+Klick",
"addAboveMacCmd": "Wahl+Klick",
"addAboveTooltip": "oben hinzufügen"
},
"importPanel": {
"textAndMarkdown": "Text & Markdown",
"documentFromV010": "Dokument von v0.1.0",
"databaseFromV010": "Datenbank ab v0.1.0",
"csv": "CSV",
"database": "Datenbank"
},
"notifications": {
"export": {
"markdown": "Notiz nach Markdown exportiert",
"path": "Dokumente/fließend"
}
},
"grid": {
"deleteView": "Möchten Sie diese Ansicht wirklich löschen?",
"createView": "Neu",
"settings": {
"filter": "Filter",
"sort": "Sortieren",
"sortBy": "Sortiere nach",
"properties": "Eigenschaften",
"reorderPropertiesTooltip": "Ziehen Sie, um die Eigenschaften neu anzuordnen",
"group": "Gruppe",
"addFilter": "Filter hinzufügen",
"deleteFilter": "Filter löschen",
"filterBy": "Filtern nach...",
"typeAValue": "Geben Sie einen Wert ein...",
"layout": "Layout",
"databaseLayout": "Layout"
},
"textFilter": {
"contains": "Enthält",
"doesNotContain": "Beinhaltet nicht",
"endsWith": "Endet mit",
"startWith": "Beginnt mit",
"is": "Ist",
"isNot": "Ist nicht",
"isEmpty": "Ist leer",
"isNotEmpty": "Ist nicht leer",
"choicechipPrefix": {
"isNot": "Nicht",
"startWith": "Beginnt mit",
"endWith": "Endet mit",
"isEmpty": "ist leer",
"isNotEmpty": "ist nicht leer"
}
},
"checkboxFilter": {
"isChecked": "Geprüft",
"isUnchecked": "Ungeprüft",
"choicechipPrefix": {
"is": "Ist"
}
},
"checklistFilter": {
"isComplete": "ist komplett",
"isIncomplted": "ist unvollständig"
},
"singleSelectOptionFilter": {
"is": "Ist",
"isNot": "Ist nicht",
"isEmpty": "Ist leer",
"isNotEmpty": "Ist nicht leer"
},
"multiSelectOptionFilter": {
"contains": "Enthält",
"doesNotContain": "Beinhaltet nicht",
"isEmpty": "Ist leer",
"isNotEmpty": "Ist nicht leer"
},
"field": {
"hide": "Verstecken",
"insertLeft": "Links einfügen",
"insertRight": "Rechts einfügen",
"duplicate": "Duplikat",
"delete": "Löschen",
"textFieldName": "Text",
"checkboxFieldName": "Kontrollkästchen",
"dateFieldName": "Datum",
"updatedAtFieldName": "Letzte Änderungszeit",
"createdAtFieldName": "Zeit geschaffen",
"numberFieldName": "Zahlen",
"singleSelectFieldName": "Wählen",
"multiSelectFieldName": "Mehrfachauswahl",
"urlFieldName": "URL",
"checklistFieldName": "Checkliste",
"numberFormat": "Zahlenformat",
"dateFormat": "Datumsformat",
"includeTime": "Zeit einbeziehen",
"dateFormatFriendly": "Monat Tag Jahr",
"dateFormatISO": "Jahr Monat Tag",
"dateFormatLocal": "Monat Tag Jahr",
"dateFormatUS": "Jahr Monat Tag",
"dateFormatDayMonthYear": "Tag Monat Jahr",
"timeFormat": "Zeitformat",
"invalidTimeFormat": "Ungültiges Format",
"timeFormatTwelveHour": "12 Stunden",
"timeFormatTwentyFourHour": "24 Stunden",
"addSelectOption": "Fügen Sie eine Option hinzu",
"optionTitle": "Optionen",
"addOption": "Option hinzufügen",
"editProperty": "Eigenschaft bearbeiten",
"newProperty": "Neue Eigenschaft",
"deleteFieldPromptMessage": "Bist du dir sicher? Diese Eigenschaft wird gelöscht"
},
"sort": {
"ascending": "Aufsteigend",
"descending": "Absteigend",
"deleteSort": "Sortierung löschen",
"addSort": "Sortierung hinzufügen"
},
"row": {
"duplicate": "Duplikat",
"delete": "Löschen",
"textPlaceholder": "Leer",
"copyProperty": "Eigenschaft in die Zwischenablage kopiert",
"count": "Zählen",
"newRow": "Neue Reihe",
"action": "Aktion"
},
"selectOption": {
"create": "Erstellen",
"purpleColor": "Lila",
"pinkColor": "Rosa",
"lightPinkColor": "Hell-Pink",
"orangeColor": "Orange",
"yellowColor": "Gelb",
"limeColor": "Kalk",
"greenColor": "Grün",
"aquaColor": "Aqua",
"blueColor": "Blau",
"deleteTag": "Tag löschen",
"colorPanelTitle": "Farben",
"panelTitle": "Wählen Sie eine Option aus oder erstellen Sie eine",
"searchOption": "Suchen Sie nach einer Option"
},
"checklist": {
"panelTitle": "Fügen Sie einen Artikel hinzu"
},
"menuName": "Netz",
"referencedGridPrefix": "Sicht von"
},
"document": {
"menuName": "Dokumentieren",
"date": {
"timeHintTextInTwelveHour": "13:00 Uhr",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Wählen Sie ein Board aus, zu dem Sie einen Link erstellen möchten",
"createANewBoard": "Erstellen Sie ein neues Board"
},
"grid": {
"selectAGridToLinkTo": "Wählen Sie ein Raster zum Verknüpfen aus",
"createANewGrid": "Erstellen Sie ein neues Raster"
},
"calendar": {
"selectACalendarToLinkTo": "Wählen Sie einen Kalender aus, mit dem Sie eine Verknüpfung erstellen möchten",
"createANewCalendar": "Erstellen Sie einen neuen Kalender"
}
},
"selectionMenu": {
"outline": "Umriss"
},
"plugins": {
"referencedBoard": "Referenziertes Board",
"referencedGrid": "Referenziertes Raster",
"referencedCalendar": "Referenzierter Kalender",
"autoGeneratorMenuItemName": "OpenAI-Autor",
"autoGeneratorTitleName": "OpenAI: Bitten Sie die KI, etwas zu schreiben ...",
"autoGeneratorLearnMore": "Erfahren Sie mehr",
"autoGeneratorGenerate": "Generieren",
"autoGeneratorHintText": "Fragen Sie OpenAI ...",
"autoGeneratorCantGetOpenAIKey": "Der OpenAI-Schlüssel kann nicht abgerufen werden",
"autoGeneratorRewrite": "Umschreiben",
"smartEdit": "KI-Assistenten",
"openAI": "OpenAI",
"smartEditFixSpelling": "Korrigiere Rechtschreibung",
"warning": "⚠️ KI-Antworten können ungenau oder irreführend sein.",
"smartEditSummarize": "Zusammenfassen",
"smartEditImproveWriting": "Verbessern Sie das Schreiben",
"smartEditMakeLonger": "Länger machen",
"smartEditCouldNotFetchResult": "Das Ergebnis konnte nicht von OpenAI abgerufen werden",
"smartEditCouldNotFetchKey": "Der OpenAI-Schlüssel konnte nicht abgerufen werden",
"smartEditDisabled": "Verbinden Sie OpenAI in den Einstellungen",
"discardResponse": "Möchten Sie die KI-Antworten verwerfen?",
"createInlineMathEquation": "Gleichung erstellen",
"toggleList": "Liste umschalten",
"cover": {
"changeCover": "Deckung wechseln",
"colors": "Farben",
"images": "Bilder",
"clearAll": "Alles löschen",
"abstract": "Abstrakt",
"addCover": "Abdeckung hinzufügen",
"addLocalImage": "Lokales Bild hinzufügen",
"invalidImageUrl": "Ungültige Bild-URL",
"failedToAddImageToGallery": "Das Bild konnte nicht zur Galerie hinzugefügt werden",
"enterImageUrl": "Geben Sie die Bild-URL ein",
"add": "Hinzufügen",
"back": "Zurück",
"saveToGallery": "In der Galerie speichern",
"removeIcon": "Symbol entfernen",
"pasteImageUrl": "Bild-URL einfügen",
"or": "ODER",
"pickFromFiles": "Wählen Sie aus Dateien",
"couldNotFetchImage": "Bild konnte nicht abgerufen werden",
"imageSavingFailed": "Bildspeicherung fehlgeschlagen",
"addIcon": "Symbol hinzufügen",
"coverRemoveAlert": "Nach dem Löschen wird es aus der Abdeckung entfernt.",
"alertDialogConfirmation": "Bist du dir sicher, dass du weitermachen willst?"
},
"mathEquation": {
"addMathEquation": "Mathematische Gleichung hinzufügen",
"editMathEquation": "Bearbeiten Sie die mathematische Gleichung"
},
"optionAction": {
"click": "Klicken",
"toOpenMenu": " um das Menü zu öffnen",
"delete": "Löschen",
"duplicate": "Duplikat",
"turnInto": "Einbiegen in",
"moveUp": "Bewegen Sie sich nach oben",
"moveDown": "Sich abwärts bewegen",
"color": "Farbe",
"align": "Ausrichten",
"left": "Links",
"center": "Center",
"right": "Rechts",
"defaultColor": "Standard"
},
"image": {
"copiedToPasteBoard": "Der Bildlink wurde in die Zwischenablage kopiert"
},
"outline": {
"addHeadingToCreateOutline": "Fügen Sie Überschriften hinzu, um ein Inhaltsverzeichnis zu erstellen."
}
},
"textBlock": {
"placeholder": "Geben Sie „/“ für Befehle ein"
},
"title": {
"placeholder": "Ohne Titel"
},
"imageBlock": {
"placeholder": "Klicken Sie, um ein Bild hinzuzufügen",
"upload": {
"label": "Hochladen",
"placeholder": "Klicken Sie, um das Bild hochzuladen"
},
"url": {
"label": "Bild URL",
"placeholder": "Geben Sie die Bild-URL ein"
},
"support": "Die Bildgrößenbeschränkung beträgt 5 MB. Unterstützte Formate: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Ungültiges Bild",
"invalidImageSize": "Die Bildgröße muss weniger als 5 MB betragen",
"invalidImageFormat": "Das Bildformat wird nicht unterstützt. Unterstützte Formate: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "Ungültige Bild-URL"
}
},
"codeBlock": {
"language": {
"label": "Sprache",
"placeholder": "Sprache auswählen"
}
},
"inlineLink": {
"placeholder": "Fügen Sie einen Link ein oder geben Sie ihn ein",
"url": {
"label": "URL verknüpfen",
"placeholder": "Geben Sie die Link-URL ein"
},
"title": {
"label": "Linktitel",
"placeholder": "Geben Sie den Linktitel ein"
}
}
},
"board": {
"column": {
"create_new_card": "Neu"
},
"menuName": "Planke",
"referencedBoardPrefix": "Sicht von"
},
"calendar": {
"menuName": "Kalender",
"defaultNewCalendarTitle": "Ohne Titel",
"navigation": {
"today": "Heute",
"jumpToday": "Springe zu Heute",
"previousMonth": "Vorheriger Monat",
"nextMonth": "Nächsten Monat"
},
"settings": {
"showWeekNumbers": "Wochennummern anzeigen",
"showWeekends": "Wochenenden anzeigen",
"firstDayOfWeek": "Beginnen Sie die Woche am",
"layoutDateField": "Layoutkalender von",
"noDateTitle": "Kein Datum",
"noDateHint": "Außerplanmäßige Ereignisse werden hier angezeigt",
"clickToAdd": "Klicken Sie, um es zum Kalender hinzuzufügen",
"name": "Kalenderlayout"
},
"referencedCalendarPrefix": "Sicht von"
},
"errorDialog": {
"title": "AppFlowy-Fehler",
"howToFixFallback": "Wir entschuldigen uns für die Unannehmlichkeiten! Reichen Sie auf unserer GitHub-Seite ein Problem ein, das Ihren Fehler beschreibt.",
"github": "Auf GitHub ansehen"
},
"search": {
"label": "Suchen",
"placeholder": {
"actions": "Suchaktionen..."
}
},
"message": {
"copy": {
"success": "Kopiert!",
"fail": "Kopieren nicht möglich"
}
},
"unSupportBlock": "Die aktuelle Version unterstützt diesen Block nicht.",
"views.deleteContentTitle": "Möchten Sie den {pageType} wirklich löschen?",
"views.deleteContentCaption": "Wenn Sie diesen {pageType} löschen, können Sie ihn aus dem Papierkorb wiederherstellen.",
"disclosureAction.copyLink": "Link kopieren",
"sideBar.favorites": "Favouriten",
"sideBar.addAPage": "Neue Seite hinzufügen",
"settings.menu.syncSetting": "Einstellungen synchronisieren",
"settings.menu.historicalUserList": "Benutzerhistorie",
"grid.field.clearDate": "Datum zurücksetzen",
"document.inlineLink.openInNewTab": "In neuem Tab öffnen",
"document.inlineLink.copyLink": "Link kopieren",
"document.inlineLink.removeLink": "Link entfernen",
"colors.custom": "Benutzerdefiniert",
"colors.red": "Rot",
"colors.orange": "Orange",
"colors.yellow": "Gelb",
"colors.green": "Grün",
"colors.blue": "Blau",
"colors.purple": "Lila",
"colors.pink": "Pink",
"colors.brown": "Braun",
"colors.gray": "Grau",
"emoji.random": "Zufällig",
"emoji.selectSkinTone": "Hautfarbe auswählen",
"emoji.remove": "Emoji entfernen",
"emoji.filter": "Filter",
"emoji.categories.people": "Menschen & Körper",
"emoji.categories.animals": "Tiere & Natur",
"emoji.categories.food": "Essen & Trinken",
"emoji.categories.activities": "Aktivitäten",
"emoji.categories.places": "Reisen & Orte",
"emoji.categories.objects": "Objekte",
"emoji.categories.symbols": "Symbole",
"emoji.categories.flags": "Flaggen",
"emoji.categories.nature": "Natur",
"emoji.categories.frequentlyUsed": "Häufig verwendet",
"signUp.signUpWith": "Registrieren mit:",
"signIn.signInWith": "Anmelden mit:",
"disclosureAction.favorite": "Zu Favouriten hinzufügen",
"disclosureAction.unfavorite": "Von Favouriten entfernen",
"disclosureAction.moveTo": "Bewege zu",
"disclosureAction.addToFavorites": "Zu Favouriten hinzufügen",
"menuAppHeader.moreButtonToolTip": "Entfernen, umbenennen, usw.",
"sideBar.personal": "Persönlich",
"sideBar.clickToHidePersonal": "Zum Verstecken des persönlichen Bereichs klicken",
"sideBar.clickToHideFavorites": "Zum Verstecken der Favouriten klicken",
"settings.menu.logout": "Abmelden",
"settings.menu.logoutPrompt": "Sind Sie sicher, dass Sie sich abmelden wollen?",
"settings.menu.enableSync": "Synchronisierung aktivieren",
"settings.shortcuts.keyBinding": "Tastaturbelegung"
}
"views": {
"deleteContentTitle": "Möchten Sie den {pageType} wirklich löschen?",
"deleteContentCaption": "Wenn Sie diesen {pageType} löschen, können Sie ihn aus dem Papierkorb wiederherstellen."
}
}
+22 -1
View File
@@ -41,6 +41,7 @@
"dontHaveAnAccount": "Don't have an account?",
"repeatPasswordEmptyError": "Repeat password can't be empty",
"unmatchedPasswordError": "Repeat password is not the same as password",
"syncPromptMessage": "Syncing the data might take a while. Please don't close this page",
"signInWith": "Sign in with:"
},
"workspace": {
@@ -54,6 +55,7 @@
"buttonText": "Share",
"workInProgress": "Coming soon",
"markdown": "Markdown",
"csv": "CSV",
"copyLink": "Copy Link"
},
"moreAction": {
@@ -84,6 +86,10 @@
},
"blankPageTitle": "Blank page",
"newPageText": "New page",
"newDocumentText": "New document",
"newGridText": "New grid",
"newCalendarText": "New calendar",
"newBoardText": "New board",
"trash": {
"text": "Trash",
"restoreAll": "Restore All",
@@ -304,6 +310,7 @@
},
"user": {
"name": "Name",
"email": "Email",
"icon": "Icon",
"selectAnIcon": "Select an icon",
"pleaseInputYourOpenAIKey": "please input your OpenAI key",
@@ -474,7 +481,8 @@
}
},
"selectionMenu": {
"outline": "Outline"
"outline": "Outline",
"codeBlock": "Code Block"
},
"plugins": {
"referencedBoard": "Referenced Board",
@@ -548,6 +556,19 @@
},
"outline": {
"addHeadingToCreateOutline": "Add headings to create a table of contents."
},
"table": {
"addAfter": "Add after",
"addBefore": "Add before",
"delete": "Delete",
"clear": "Clear content",
"duplicate": "Duplicate",
"bgColor": "Background color"
},
"contextMenu": {
"copy": "Copy",
"cut": "Cut",
"paste": "Paste"
}
},
"textBlock": {
+379 -281
View File
@@ -27,7 +27,8 @@
"passwordHint": "Contraseña",
"dontHaveAnAccount": "¿No posee credenciales?",
"repeatPasswordEmptyError": "La contraseña no puede estar en blanco",
"unmatchedPasswordError": "Las contraseñas no coinciden"
"unmatchedPasswordError": "Las contraseñas no coinciden",
"loginAsGuestButtonText": "Empezar"
},
"workspace": {
"create": "Crear espacio de trabajo",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Renombrar",
"delete": "Eliminar",
"duplicate": "Duplicar"
"duplicate": "Duplicar",
"openNewTab": "Abrir en una pestaña nueva"
},
"blankPageTitle": "Página en blanco",
"newPageText": "Nueva página",
@@ -55,6 +57,14 @@
"fileName": "Nombre de archivo",
"lastModified": "Última modificación",
"created": "Creado"
},
"confirmDeleteAll": {
"title": "¿Estás seguro de eliminar todas las páginas de la Papelera?",
"caption": "Esta acción no se puede deshacer."
},
"confirmRestoreAll": {
"title": "¿Estás seguro de restaurar todas las páginas en la Papelera?",
"caption": "Esta acción no se puede deshacer."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Información de depuración",
"success": "¡Información copiada!",
"fail": "No fue posible copiar la información"
}
},
"shortcuts": "Atajos",
"markdown": "Reducción",
"feedback": "Comentario"
},
"menuAppHeader": {
"addPageTooltip": "Inserta una página",
@@ -91,11 +104,20 @@
"quote": "Cita",
"header": "Título",
"highlight": "Resaltado",
"color": "Color"
"color": "Color",
"addLink": "Añadir enlace",
"link": "Enlace"
},
"tooltip": {
"lightMode": "Cambiar a modo Claro",
"darkMode": "Cambiar a modo Oscuro"
"darkMode": "Cambiar a modo Oscuro",
"openAsPage": "Abrir como una página",
"addNewRow": "Agregar una nueva fila",
"openMenu": "Haga clic para abrir el menú",
"dragRow": "Pulsación larga para reordenar la fila",
"viewDataBase": "Ver base de datos",
"referencePage": "Se hace referencia a este {nombre}",
"addBlockBelow": "Añadir un bloque a continuación"
},
"notifications": {
"export": {
@@ -115,7 +137,21 @@
"signIn": "Ingresar",
"signOut": "Salir",
"complete": "Completar",
"save": "Guardar"
"save": "Guardar",
"Done": "Hecho",
"generate": "Generar",
"esc": "ESC",
"keep": "Mantener",
"tryAgain": "Intentar otra vez",
"discard": "Desechar",
"replace": "Reemplazar",
"insertBelow": "Insertar a continuación",
"upload": "Subir",
"edit": "Editar",
"delete": "Borrar",
"duplicate": "Duplicar",
"done": "Hecho",
"putback": "Volver"
},
"label": {
"welcome": "¡Bienvenido!",
@@ -142,7 +178,10 @@
"menu": {
"appearance": "Apariencia",
"language": "Lenguaje",
"open": "Abrir ajustes"
"open": "Abrir ajustes",
"user": "Usuario",
"files": "archivos",
"supabaseSetting": "Ajuste de base superior"
},
"appearance": {
"themeMode": {
@@ -150,14 +189,83 @@
"light": "Modo Claro",
"dark": "Modo Oscuro",
"system": "Adapt to System"
}
},
"fontFamily": {
"label": "Familia tipográfica",
"search": "Buscar"
},
"themeUpload": {
"button": "Subir",
"description": "Cargue su propio tema AppFlowy usando el botón de abajo.",
"failure": "El tema que se cargó tenía un formato no válido.",
"loading": "Espere mientras validamos y cargamos su tema...",
"uploadSuccess": "Tu tema fue subido con éxito",
"deletionFailure": "No se pudo eliminar el tema. Intenta eliminarlo manualmente.",
"filePickerDialogTitle": "Elija un archivo .flowy_plugin",
"urlUploadFailure": "No se pudo abrir la URL: {}"
},
"theme": "Tema",
"builtInsLabel": "Temas incorporados",
"pluginsLabel": "Complementos"
},
"files": {
"copy": "Copiar",
"defaultLocation": "Leer archivos y ubicación de almacenamiento de datos",
"exportData": "Exporta tus datos",
"doubleTapToCopy": "Toca dos veces para copiar la ruta",
"restoreLocation": "Restaurar a la ruta predeterminada de AppFlowy",
"customizeLocation": "Abrir otra carpeta",
"restartApp": "Reinicie la aplicación para que los cambios surtan efecto.",
"exportDatabase": "Exportar base de datos",
"selectFiles": "Seleccione los archivos que necesitan ser exportados",
"selectAll": "Seleccionar todo",
"deselectAll": "Deseleccionar todo",
"createNewFolder": "Crear una nueva carpeta",
"createNewFolderDesc": "Dinos dónde quieres almacenar tus datos",
"defineWhereYourDataIsStored": "Defina dónde se almacenan sus datos",
"open": "Abierto",
"openFolder": "Abrir una carpeta existente",
"openFolderDesc": "Léalo y escríbalo en su carpeta AppFlowy existente",
"folderHintText": "nombre de la carpeta",
"location": "Creando una nueva carpeta",
"locationDesc": "Elija un nombre para su carpeta de datos de AppFlowy",
"browser": "Navegar",
"create": "Crear",
"set": "Colocar",
"folderPath": "Ruta para almacenar su carpeta",
"locationCannotBeEmpty": "La ruta no puede estar vacía",
"pathCopiedSnackbar": "¡La ruta de almacenamiento de archivos se copió al portapapeles!",
"changeLocationTooltips": "Cambiar el directorio de datos",
"change": "Cambiar",
"openLocationTooltips": "Abrir otro directorio de datos",
"openCurrentDataFolder": "Abrir el directorio de datos actual",
"recoverLocationTooltips": "Restablecer al directorio de datos predeterminado de AppFlowy",
"exportFileSuccess": "¡Exportar archivo con éxito!",
"exportFileFail": "¡Error en la exportación del archivo!",
"export": "Exportar"
},
"user": {
"name": "Nombre",
"icon": "Icono",
"selectAnIcon": "Seleccione un icono",
"pleaseInputYourOpenAIKey": "por favor ingrese su clave OpenAI"
}
},
"grid": {
"settings": {
"filter": "Filtrar",
"sortBy": "Ordenar por",
"Properties": "Propiedades"
"Properties": "Propiedades",
"sort": "Clasificar",
"properties": "Propiedades",
"reorderPropertiesTooltip": "Arrastre para reordenar las propiedades",
"group": "Grupo",
"addFilter": "Añadir filtro",
"deleteFilter": "Eliminar filtro",
"filterBy": "Filtrado por...",
"typeAValue": "Escriba un valor...",
"layout": "Disposición",
"databaseLayout": "Disposición"
},
"field": {
"hide": "Ocultar",
@@ -186,13 +294,22 @@
"addSelectOption": "Añadir una opción",
"optionTitle": "Opciones",
"addOption": "Añadir opción",
"editProperty": "Editar propiedad"
"editProperty": "Editar propiedad",
"updatedAtFieldName": "Última hora de modificación",
"createdAtFieldName": "tiempo creado",
"checklistFieldName": "Lista de Verificación",
"dateFormatDayMonthYear": "Día mes año",
"newProperty": "Nueva propiedad",
"deleteFieldPromptMessage": "¿Está seguro? Esta propiedad será eliminada"
},
"row": {
"duplicate": "Duplicar",
"delete": "Eliminar",
"textPlaceholder": "Vacío",
"copyProperty": "Propiedad copiada al portapapeles"
"copyProperty": "Propiedad copiada al portapapeles",
"count": "Contar",
"newRow": "Nueva fila",
"action": "Acción"
},
"selectOption": {
"create": "Crear",
@@ -210,13 +327,197 @@
"panelTitle": "Selecciona una opción o crea una",
"searchOption": "Buscar una opción"
},
"menuName": "Cuadrícula"
"menuName": "Cuadrícula",
"deleteView": "¿Está seguro de que desea eliminar esta vista?",
"createView": "Nuevo",
"textFilter": {
"contains": "Contiene",
"doesNotContain": "No contiene",
"endsWith": "Termina con",
"startWith": "Comienza con",
"is": "Es",
"isNot": "No es",
"isEmpty": "Esta vacio",
"isNotEmpty": "No está vacío",
"choicechipPrefix": {
"isNot": "No",
"startWith": "Comienza con",
"endWith": "Termina con",
"isEmpty": "esta vacio",
"isNotEmpty": "no está vacío"
}
},
"checkboxFilter": {
"isChecked": "Comprobado",
"isUnchecked": "Desenfrenado",
"choicechipPrefix": {
"is": "es"
}
},
"checklistFilter": {
"isComplete": "Esta completo",
"isIncomplted": "esta incompleto"
},
"singleSelectOptionFilter": {
"is": "Es",
"isNot": "No es",
"isEmpty": "Esta vacio",
"isNotEmpty": "No está vacío"
},
"multiSelectOptionFilter": {
"contains": "Contiene",
"doesNotContain": "No contiene",
"isEmpty": "Esta vacio",
"isNotEmpty": "No está vacío"
},
"sort": {
"ascending": "ascendente",
"descending": "Descendente",
"deleteSort": "Borrar ordenar",
"addSort": "Agregar clasificación"
},
"checklist": {
"panelTitle": "Agregar un elemento"
},
"referencedGridPrefix": "Vista de"
},
"document": {
"menuName": "Documento",
"date": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Seleccione un tablero para vincular",
"createANewBoard": "Crear un nuevo tablero"
},
"grid": {
"selectAGridToLinkTo": "Seleccione una cuadrícula para vincular",
"createANewGrid": "Crear una nueva cuadrícula"
},
"calendar": {
"selectACalendarToLinkTo": "Seleccione un calendario para vincular",
"createANewCalendar": "Crear un nuevo Calendario"
}
},
"selectionMenu": {
"outline": "Describir"
},
"plugins": {
"referencedBoard": "Tablero referenciado",
"referencedGrid": "Cuadrícula referenciada",
"referencedCalendar": "Calendario referenciado",
"autoGeneratorMenuItemName": "Escritor de OpenAI",
"autoGeneratorTitleName": "OpenAI: Pídele a AI que escriba cualquier cosa...",
"autoGeneratorLearnMore": "Aprende más",
"autoGeneratorGenerate": "Generar",
"autoGeneratorHintText": "Pregúntale a OpenAI...",
"autoGeneratorCantGetOpenAIKey": "No puedo obtener la clave de OpenAI",
"autoGeneratorRewrite": "Volver a escribir",
"smartEdit": "Asistentes de IA",
"openAI": "IA abierta",
"smartEditFixSpelling": "Corregir ortografía",
"warning": "⚠️ Las respuestas de la IA pueden ser inexactas o engañosas.",
"smartEditSummarize": "Resumir",
"smartEditImproveWriting": "Mejorar la escritura",
"smartEditMakeLonger": "hacer más largo",
"smartEditCouldNotFetchResult": "No se pudo obtener el resultado de OpenAI",
"smartEditCouldNotFetchKey": "No se pudo obtener la clave de OpenAI",
"smartEditDisabled": "Conectar OpenAI en Configuración",
"discardResponse": "¿Quieres descartar las respuestas de IA?",
"createInlineMathEquation": "Crear ecuación",
"toggleList": "Alternar lista",
"cover": {
"changeCover": "Cubierta de cambio",
"colors": "Colores",
"images": "Imágenes",
"clearAll": "Limpiar todo",
"abstract": "Abstracto",
"addCover": "Agregar portada",
"addLocalImage": "Agregar imagen local",
"invalidImageUrl": "URL de imagen no válida",
"failedToAddImageToGallery": "No se pudo agregar la imagen a la galería",
"enterImageUrl": "Introduce la URL de la imagen",
"add": "Agregar",
"back": "Atrás",
"saveToGallery": "Guardar en la galería",
"removeIcon": "Eliminar icono",
"pasteImageUrl": "Pegar URL de imagen",
"or": "O",
"pickFromFiles": "Seleccionar de archivos",
"couldNotFetchImage": "No se pudo obtener la imagen",
"imageSavingFailed": "Error al guardar la imagen",
"addIcon": "Añadir icono",
"coverRemoveAlert": "Se eliminará de la portada después de que se elimine.",
"alertDialogConfirmation": "¿Estás seguro de que quieres continuar?"
},
"mathEquation": {
"addMathEquation": "Agregar ecuación matemática",
"editMathEquation": "Editar ecuación matemática"
},
"optionAction": {
"click": "Hacer clic",
"toOpenMenu": " para abrir menú",
"delete": "Borrar",
"duplicate": "Duplicar",
"turnInto": "convertir en",
"moveUp": "Ascender",
"moveDown": "Mover hacia abajo",
"color": "Color",
"align": "Alinear",
"left": "Izquierda",
"center": "Centro",
"right": "Bien",
"defaultColor": "Por defecto"
},
"image": {
"copiedToPasteBoard": "El enlace de la imagen se ha copiado en el portapapeles."
},
"outline": {
"addHeadingToCreateOutline": "Agregue encabezados para crear una tabla de contenido."
}
},
"textBlock": {
"placeholder": "Escriba '/' para comandos"
},
"title": {
"placeholder": "Intitulado"
},
"imageBlock": {
"placeholder": "Haga clic para agregar imagen",
"upload": {
"label": "Subir",
"placeholder": "Haga clic para cargar la imagen"
},
"url": {
"label": "URL de la imagen",
"placeholder": "Introduce la URL de la imagen"
},
"support": "El límite de tamaño de la imagen es de 5 MB. Formatos admitidos: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Imagen inválida",
"invalidImageSize": "El tamaño de la imagen debe ser inferior a 5 MB",
"invalidImageFormat": "El formato de imagen no es compatible. Formatos admitidos: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "URL de imagen no válida"
}
},
"codeBlock": {
"language": {
"label": "Idioma",
"placeholder": "Seleccione el idioma"
}
},
"inlineLink": {
"placeholder": "Pegar o escribir un enlace",
"url": {
"label": "URL del enlace",
"placeholder": "Introduzca la URL del enlace"
},
"title": {
"label": "Título del enlace",
"placeholder": "Introduce el título del enlace"
}
}
},
"sideBar": {
@@ -226,277 +527,74 @@
"board": {
"column": {
"create_new_card": "Nuevo"
}
},
"menuName": "Junta",
"referencedBoardPrefix": "Vista de"
},
"moreAction": {
"small": "pequeño",
"medium": "medio",
"large": "grande",
"fontSize": "Tamaño de fuente",
"import": "Importar",
"moreOptions": "Mas opciones"
},
"moreAction.small": "pequeño",
"youCanAlso": "Tú también puedes",
"and": "y",
"blockActions.addBelowTooltip": "Haga clic para agregar a continuación",
"blockActions.addAboveCmd": "Alt+clic",
"blockActions.addAboveMacCmd": "Opción+clic",
"blockActions.addAboveTooltip": "para agregar arriba",
"signIn.loginAsGuestButtonText": "Empezar",
"moreAction.medium": "medio",
"moreAction.large": "grande",
"moreAction.fontSize": "Tamaño de fuente",
"moreAction.import": "Importar",
"moreAction.moreOptions": "Mas opciones",
"importPanel.textAndMarkdown": "Texto y descuento",
"importPanel.documentFromV010": "Documento de v0.1.0",
"importPanel.databaseFromV010": "Base de datos desde v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Base de datos",
"disclosureAction.openNewTab": "Abrir en una pestaña nueva",
"trash.confirmDeleteAll.title": "¿Estás seguro de eliminar todas las páginas de la Papelera?",
"trash.confirmDeleteAll.caption": "Esta acción no se puede deshacer.",
"trash.confirmRestoreAll.title": "¿Estás seguro de restaurar todas las páginas en la Papelera?",
"trash.confirmRestoreAll.caption": "Esta acción no se puede deshacer.",
"questionBubble.shortcuts": "Atajos",
"questionBubble.markdown": "Reducción",
"questionBubble.feedback": "Comentario",
"toolbar.addLink": "Añadir enlace",
"toolbar.link": "Enlace",
"tooltip.openAsPage": "Abrir como una página",
"tooltip.addNewRow": "Agregar una nueva fila",
"tooltip.openMenu": "Haga clic para abrir el menú",
"tooltip.dragRow": "Pulsación larga para reordenar la fila",
"tooltip.viewDataBase": "Ver base de datos",
"tooltip.referencePage": "Se hace referencia a este {nombre}",
"tooltip.addBlockBelow": "Añadir un bloque a continuación",
"button.Done": "Hecho",
"button.generate": "Generar",
"button.esc": "ESC",
"button.keep": "Mantener",
"button.tryAgain": "Intentar otra vez",
"button.discard": "Desechar",
"button.replace": "Reemplazar",
"button.insertBelow": "Insertar a continuación",
"button.upload": "Subir",
"button.edit": "Editar",
"button.delete": "Borrar",
"button.duplicate": "Duplicar",
"button.done": "Hecho",
"button.putback": "Volver",
"settings.menu.user": "Usuario",
"settings.menu.files": "archivos",
"settings.menu.supabaseSetting": "Ajuste de base superior",
"settings.appearance.fontFamily.label": "Familia tipográfica",
"settings.appearance.fontFamily.search": "Buscar",
"settings.appearance.themeUpload.button": "Subir",
"settings.appearance.themeUpload.description": "Cargue su propio tema AppFlowy usando el botón de abajo.",
"settings.appearance.themeUpload.failure": "El tema que se cargó tenía un formato no válido.",
"settings.appearance.themeUpload.loading": "Espere mientras validamos y cargamos su tema...",
"settings.appearance.themeUpload.uploadSuccess": "Tu tema fue subido con éxito",
"settings.appearance.themeUpload.deletionFailure": "No se pudo eliminar el tema. Intenta eliminarlo manualmente.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Elija un archivo .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "No se pudo abrir la URL: {}",
"settings.appearance.theme": "Tema",
"settings.appearance.builtInsLabel": "Temas incorporados",
"settings.appearance.pluginsLabel": "Complementos",
"settings.files.copy": "Copiar",
"settings.files.defaultLocation": "Leer archivos y ubicación de almacenamiento de datos",
"settings.files.exportData": "Exporta tus datos",
"settings.files.doubleTapToCopy": "Toca dos veces para copiar la ruta",
"settings.files.restoreLocation": "Restaurar a la ruta predeterminada de AppFlowy",
"settings.files.customizeLocation": "Abrir otra carpeta",
"settings.files.restartApp": "Reinicie la aplicación para que los cambios surtan efecto.",
"settings.files.exportDatabase": "Exportar base de datos",
"settings.files.selectFiles": "Seleccione los archivos que necesitan ser exportados",
"settings.files.selectAll": "Seleccionar todo",
"settings.files.deselectAll": "Deseleccionar todo",
"settings.files.createNewFolder": "Crear una nueva carpeta",
"settings.files.createNewFolderDesc": "Dinos dónde quieres almacenar tus datos",
"settings.files.defineWhereYourDataIsStored": "Defina dónde se almacenan sus datos",
"settings.files.open": "Abierto",
"settings.files.openFolder": "Abrir una carpeta existente",
"settings.files.openFolderDesc": "Léalo y escríbalo en su carpeta AppFlowy existente",
"settings.files.folderHintText": "nombre de la carpeta",
"settings.files.location": "Creando una nueva carpeta",
"settings.files.locationDesc": "Elija un nombre para su carpeta de datos de AppFlowy",
"settings.files.browser": "Navegar",
"settings.files.create": "Crear",
"settings.files.set": "Colocar",
"settings.files.folderPath": "Ruta para almacenar su carpeta",
"settings.files.locationCannotBeEmpty": "La ruta no puede estar vacía",
"settings.files.pathCopiedSnackbar": "¡La ruta de almacenamiento de archivos se copió al portapapeles!",
"settings.files.changeLocationTooltips": "Cambiar el directorio de datos",
"settings.files.change": "Cambiar",
"settings.files.openLocationTooltips": "Abrir otro directorio de datos",
"settings.files.openCurrentDataFolder": "Abrir el directorio de datos actual",
"settings.files.recoverLocationTooltips": "Restablecer al directorio de datos predeterminado de AppFlowy",
"settings.files.exportFileSuccess": "¡Exportar archivo con éxito!",
"settings.files.exportFileFail": "¡Error en la exportación del archivo!",
"settings.files.export": "Exportar",
"settings.user.name": "Nombre",
"settings.user.icon": "Icono",
"settings.user.selectAnIcon": "Seleccione un icono",
"settings.user.pleaseInputYourOpenAIKey": "por favor ingrese su clave OpenAI",
"grid.deleteView": "¿Está seguro de que desea eliminar esta vista?",
"grid.createView": "Nuevo",
"grid.settings.sort": "Clasificar",
"grid.settings.properties": "Propiedades",
"grid.settings.reorderPropertiesTooltip": "Arrastre para reordenar las propiedades",
"grid.settings.group": "Grupo",
"grid.settings.addFilter": "Añadir filtro",
"grid.settings.deleteFilter": "Eliminar filtro",
"grid.settings.filterBy": "Filtrado por...",
"grid.settings.typeAValue": "Escriba un valor...",
"grid.settings.layout": "Disposición",
"grid.settings.databaseLayout": "Disposición",
"grid.textFilter.contains": "Contiene",
"grid.textFilter.doesNotContain": "No contiene",
"grid.textFilter.endsWith": "Termina con",
"grid.textFilter.startWith": "Comienza con",
"grid.textFilter.is": "Es",
"grid.textFilter.isNot": "No es",
"grid.textFilter.isEmpty": "Esta vacio",
"grid.textFilter.isNotEmpty": "No está vacío",
"grid.textFilter.choicechipPrefix.isNot": "No",
"grid.textFilter.choicechipPrefix.startWith": "Comienza con",
"grid.textFilter.choicechipPrefix.endWith": "Termina con",
"grid.textFilter.choicechipPrefix.isEmpty": "esta vacio",
"grid.textFilter.choicechipPrefix.isNotEmpty": "no está vacío",
"grid.checkboxFilter.isChecked": "Comprobado",
"grid.checkboxFilter.isUnchecked": "Desenfrenado",
"grid.checkboxFilter.choicechipPrefix.is": "es",
"grid.checklistFilter.isComplete": "Esta completo",
"grid.checklistFilter.isIncomplted": "esta incompleto",
"grid.singleSelectOptionFilter.is": "Es",
"grid.singleSelectOptionFilter.isNot": "No es",
"grid.singleSelectOptionFilter.isEmpty": "Esta vacio",
"grid.singleSelectOptionFilter.isNotEmpty": "No está vacío",
"grid.multiSelectOptionFilter.contains": "Contiene",
"grid.multiSelectOptionFilter.doesNotContain": "No contiene",
"grid.multiSelectOptionFilter.isEmpty": "Esta vacio",
"grid.multiSelectOptionFilter.isNotEmpty": "No está vacío",
"grid.field.updatedAtFieldName": "Última hora de modificación",
"grid.field.createdAtFieldName": "tiempo creado",
"grid.field.checklistFieldName": "Lista de Verificación",
"grid.field.dateFormatDayMonthYear": "Día mes año",
"grid.field.newProperty": "Nueva propiedad",
"grid.field.deleteFieldPromptMessage": "¿Está seguro? Esta propiedad será eliminada",
"grid.sort.ascending": "ascendente",
"grid.sort.descending": "Descendente",
"grid.sort.deleteSort": "Borrar ordenar",
"grid.sort.addSort": "Agregar clasificación",
"grid.row.count": "Contar",
"grid.row.newRow": "Nueva fila",
"grid.row.action": "Acción",
"grid.checklist.panelTitle": "Agregar un elemento",
"grid.referencedGridPrefix": "Vista de",
"document.slashMenu.board.selectABoardToLinkTo": "Seleccione un tablero para vincular",
"document.slashMenu.board.createANewBoard": "Crear un nuevo tablero",
"document.slashMenu.grid.selectAGridToLinkTo": "Seleccione una cuadrícula para vincular",
"document.slashMenu.grid.createANewGrid": "Crear una nueva cuadrícula",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Seleccione un calendario para vincular",
"document.slashMenu.calendar.createANewCalendar": "Crear un nuevo Calendario",
"document.selectionMenu.outline": "Describir",
"document.plugins.referencedBoard": "Tablero referenciado",
"document.plugins.referencedGrid": "Cuadrícula referenciada",
"document.plugins.referencedCalendar": "Calendario referenciado",
"document.plugins.autoGeneratorMenuItemName": "Escritor de OpenAI",
"document.plugins.autoGeneratorTitleName": "OpenAI: Pídele a AI que escriba cualquier cosa...",
"document.plugins.autoGeneratorLearnMore": "Aprende más",
"document.plugins.autoGeneratorGenerate": "Generar",
"document.plugins.autoGeneratorHintText": "Pregúntale a OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "No puedo obtener la clave de OpenAI",
"document.plugins.autoGeneratorRewrite": "Volver a escribir",
"document.plugins.smartEdit": "Asistentes de IA",
"document.plugins.openAI": "IA abierta",
"document.plugins.smartEditFixSpelling": "Corregir ortografía",
"document.plugins.warning": "⚠️ Las respuestas de la IA pueden ser inexactas o engañosas.",
"document.plugins.smartEditSummarize": "Resumir",
"document.plugins.smartEditImproveWriting": "Mejorar la escritura",
"document.plugins.smartEditMakeLonger": "hacer más largo",
"document.plugins.smartEditCouldNotFetchResult": "No se pudo obtener el resultado de OpenAI",
"document.plugins.smartEditCouldNotFetchKey": "No se pudo obtener la clave de OpenAI",
"document.plugins.smartEditDisabled": "Conectar OpenAI en Configuración",
"document.plugins.discardResponse": "¿Quieres descartar las respuestas de IA?",
"document.plugins.createInlineMathEquation": "Crear ecuación",
"document.plugins.toggleList": "Alternar lista",
"document.plugins.cover.changeCover": "Cubierta de cambio",
"document.plugins.cover.colors": "Colores",
"document.plugins.cover.images": "Imágenes",
"document.plugins.cover.clearAll": "Limpiar todo",
"document.plugins.cover.abstract": "Abstracto",
"document.plugins.cover.addCover": "Agregar portada",
"document.plugins.cover.addLocalImage": "Agregar imagen local",
"document.plugins.cover.invalidImageUrl": "URL de imagen no válida",
"document.plugins.cover.failedToAddImageToGallery": "No se pudo agregar la imagen a la galería",
"document.plugins.cover.enterImageUrl": "Introduce la URL de la imagen",
"document.plugins.cover.add": "Agregar",
"document.plugins.cover.back": "Atrás",
"document.plugins.cover.saveToGallery": "Guardar en la galería",
"document.plugins.cover.removeIcon": "Eliminar icono",
"document.plugins.cover.pasteImageUrl": "Pegar URL de imagen",
"document.plugins.cover.or": "O",
"document.plugins.cover.pickFromFiles": "Seleccionar de archivos",
"document.plugins.cover.couldNotFetchImage": "No se pudo obtener la imagen",
"document.plugins.cover.imageSavingFailed": "Error al guardar la imagen",
"document.plugins.cover.addIcon": "Añadir icono",
"document.plugins.cover.coverRemoveAlert": "Se eliminará de la portada después de que se elimine.",
"document.plugins.cover.alertDialogConfirmation": "¿Estás seguro de que quieres continuar?",
"document.plugins.mathEquation.addMathEquation": "Agregar ecuación matemática",
"document.plugins.mathEquation.editMathEquation": "Editar ecuación matemática",
"document.plugins.optionAction.click": "Hacer clic",
"document.plugins.optionAction.toOpenMenu": " para abrir menú",
"document.plugins.optionAction.delete": "Borrar",
"document.plugins.optionAction.duplicate": "Duplicar",
"document.plugins.optionAction.turnInto": "convertir en",
"document.plugins.optionAction.moveUp": "Ascender",
"document.plugins.optionAction.moveDown": "Mover hacia abajo",
"document.plugins.optionAction.color": "Color",
"document.plugins.optionAction.align": "Alinear",
"document.plugins.optionAction.left": "Izquierda",
"document.plugins.optionAction.center": "Centro",
"document.plugins.optionAction.right": "Bien",
"document.plugins.optionAction.defaultColor": "Por defecto",
"document.plugins.image.copiedToPasteBoard": "El enlace de la imagen se ha copiado en el portapapeles.",
"document.plugins.outline.addHeadingToCreateOutline": "Agregue encabezados para crear una tabla de contenido.",
"document.textBlock.placeholder": "Escriba '/' para comandos",
"document.title.placeholder": "Intitulado",
"document.imageBlock.placeholder": "Haga clic para agregar imagen",
"document.imageBlock.upload.label": "Subir",
"document.imageBlock.upload.placeholder": "Haga clic para cargar la imagen",
"document.imageBlock.url.label": "URL de la imagen",
"document.imageBlock.url.placeholder": "Introduce la URL de la imagen",
"document.imageBlock.support": "El límite de tamaño de la imagen es de 5 MB. Formatos admitidos: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Imagen inválida",
"document.imageBlock.error.invalidImageSize": "El tamaño de la imagen debe ser inferior a 5 MB",
"document.imageBlock.error.invalidImageFormat": "El formato de imagen no es compatible. Formatos admitidos: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "URL de imagen no válida",
"document.codeBlock.language.label": "Idioma",
"document.codeBlock.language.placeholder": "Seleccione el idioma",
"document.inlineLink.placeholder": "Pegar o escribir un enlace",
"document.inlineLink.url.label": "URL del enlace",
"document.inlineLink.url.placeholder": "Introduzca la URL del enlace",
"document.inlineLink.title.label": "Título del enlace",
"document.inlineLink.title.placeholder": "Introduce el título del enlace",
"board.menuName": "Junta",
"board.referencedBoardPrefix": "Vista de",
"calendar.menuName": "Calendario",
"calendar.defaultNewCalendarTitle": "Intitulado",
"calendar.navigation.today": "Hoy",
"calendar.navigation.jumpToday": "Saltar a hoy",
"calendar.navigation.previousMonth": "Mes anterior",
"calendar.navigation.nextMonth": "Próximo mes",
"calendar.settings.showWeekNumbers": "Mostrar números de semana",
"calendar.settings.showWeekends": "Mostrar fines de semana",
"calendar.settings.firstDayOfWeek": "Empieza la semana en",
"calendar.settings.layoutDateField": "Diseño de calendario por",
"calendar.settings.noDateTitle": "Sin cita",
"calendar.settings.noDateHint": "Los eventos no programados se mostrarán aquí",
"calendar.settings.clickToAdd": "Haga clic para agregar al calendario",
"calendar.settings.name": "Diseño de calendario",
"calendar.referencedCalendarPrefix": "Vista de",
"errorDialog.title": "Error de flujo de aplicación",
"errorDialog.howToFixFallback": "¡Lamentamos las molestias! Envíe un problema en nuestra página de GitHub que describa su error.",
"errorDialog.github": "Ver en GitHub",
"search.label": "Buscar",
"search.placeholder.actions": "Acciones de búsqueda...",
"message.copy.success": "¡Copiado!",
"message.copy.fail": "no se puede copiar",
"blockActions": {
"addBelowTooltip": "Haga clic para agregar a continuación",
"addAboveCmd": "Alt+clic",
"addAboveMacCmd": "Opción+clic",
"addAboveTooltip": "para agregar arriba"
},
"importPanel": {
"textAndMarkdown": "Texto y descuento",
"documentFromV010": "Documento de v0.1.0",
"databaseFromV010": "Base de datos desde v0.1.0",
"csv": "CSV",
"database": "Base de datos"
},
"calendar": {
"menuName": "Calendario",
"defaultNewCalendarTitle": "Intitulado",
"navigation": {
"today": "Hoy",
"jumpToday": "Saltar a hoy",
"previousMonth": "Mes anterior",
"nextMonth": "Próximo mes"
},
"settings": {
"showWeekNumbers": "Mostrar números de semana",
"showWeekends": "Mostrar fines de semana",
"firstDayOfWeek": "Empieza la semana en",
"layoutDateField": "Diseño de calendario por",
"noDateTitle": "Sin cita",
"noDateHint": "Los eventos no programados se mostrarán aquí",
"clickToAdd": "Haga clic para agregar al calendario",
"name": "Diseño de calendario"
},
"referencedCalendarPrefix": "Vista de"
},
"errorDialog": {
"title": "Error de flujo de aplicación",
"howToFixFallback": "¡Lamentamos las molestias! Envíe un problema en nuestra página de GitHub que describa su error.",
"github": "Ver en GitHub"
},
"search": {
"label": "Buscar",
"placeholder": {
"actions": "Acciones de búsqueda..."
}
},
"message": {
"copy": {
"success": "¡Copiado!",
"fail": "no se puede copiar"
}
},
"unSupportBlock": "La versión actual no es compatible con este bloque.",
"views.deleteContentTitle": "¿Está seguro de que desea eliminar {pageType}?",
"views.deleteContentCaption": "si elimina este {pageType}, puede restaurarlo de la papelera."
"views": {
"deleteContentTitle": "¿Está seguro de que desea eliminar {pageType}?",
"deleteContentCaption": "si elimina este {pageType}, puede restaurarlo de la papelera."
}
}
+286 -212
View File
@@ -27,7 +27,8 @@
"passwordHint": "Pasahitza",
"dontHaveAnAccount": "Ez daukazu konturik?",
"repeatPasswordEmptyError": "Pasahitz errepikapenak ezin du hutsik egon",
"unmatchedPasswordError": "Pasahitz errepikapena ez da berdina"
"unmatchedPasswordError": "Pasahitz errepikapena ez da berdina",
"loginAsGuestButtonText": "Hasi"
},
"workspace": {
"create": "Lan-eremua",
@@ -44,12 +45,15 @@
"small": "txikia",
"medium": "ertaina",
"large": "handia",
"fontSize": "Letra tamaina"
"fontSize": "Letra tamaina",
"import": "Inportatu",
"moreOptions": "Aukera gehiago"
},
"disclosureAction": {
"rename": "Izena aldatu",
"delete": "Ezabatu",
"duplicate": "Duplikatu"
"duplicate": "Duplikatu",
"openNewTab": "Ireki fitxa berri batean"
},
"blankPageTitle": "Orri zuria",
"newPageText": "Orri berria",
@@ -61,6 +65,14 @@
"fileName": "Fitxategi izena",
"lastModified": "Azken aldaketa",
"created": "Sortua"
},
"confirmDeleteAll": {
"title": "Ziur zaborrontziko orrialde guztiak ezabatuko dituzula?",
"caption": "Ekintza hau ezin da desegin."
},
"confirmRestoreAll": {
"title": "Ziur zaborrontziko orrialde guztiak leheneratuko dituzula?",
"caption": "Ekintza hau ezin da desegin."
}
},
"deletePagePrompt": {
@@ -76,7 +88,10 @@
"name": "Debug informazioa",
"success": "Debug informazioa kopiatu da!",
"fail": "Ezin izan da debug informazioa kopiatu"
}
},
"shortcuts": "Lasterbideak",
"markdown": "Markdown",
"feedback": "Iritzia"
},
"menuAppHeader": {
"addPageTooltip": "Gehitu orri bat",
@@ -97,14 +112,20 @@
"quote": "Aipamena",
"header": "Goiburua",
"highlight": "Nabarmendu",
"color": "Kolorea"
"color": "Kolorea",
"addLink": "Gehitu esteka",
"link": "Esteka"
},
"tooltip": {
"lightMode": "Modu argira aldatu",
"darkMode": "Modu ilunera aldatu",
"openAsPage": "Orri gisa ireki",
"addNewRow": "Ilara berri bat gehitu",
"openMenu": "Egin klik menua irekitzeko"
"openMenu": "Egin klik menua irekitzeko",
"dragRow": "Luze sakatu errenkada berrantolatzeko",
"viewDataBase": "Ikusi datu-basea",
"referencePage": "{izena} honi erreferentzia egiten zaio",
"addBlockBelow": "Gehitu bloke bat behean"
},
"sideBar": {
"closeSidebar": "Alboko barra itxi",
@@ -128,7 +149,21 @@
"signIn": "Saioa hasi",
"signOut": "Saioa itxi",
"complete": "Burututa",
"save": "Gorde"
"save": "Gorde",
"Done": "Eginda",
"generate": "Sortu",
"esc": "ESC",
"keep": "Gorde",
"tryAgain": "Saiatu berriro",
"discard": "Baztertu",
"replace": "Ordezkatu",
"insertBelow": "Txertatu behean",
"upload": "Kargatu",
"edit": "Editatu",
"delete": "Ezabatu",
"duplicate": "Bikoiztu",
"done": "Eginda",
"putback": "Jarri Atzera"
},
"label": {
"welcome": "Ongi etorri!",
@@ -157,7 +192,8 @@
"language": "Hizkuntza",
"user": "Erabiltzailea",
"files": "Fitxategiak",
"open": "Ezarpenak ireki"
"open": "Ezarpenak ireki",
"supabaseSetting": "Supabase ezarpena"
},
"appearance": {
"themeMode": {
@@ -166,7 +202,23 @@
"dark": "Modu iluna",
"system": "Zure sistemara moldatu"
},
"theme": "Itxura"
"theme": "Itxura",
"fontFamily": {
"label": "Letra-tipoen familia",
"search": "Bilatu"
},
"themeUpload": {
"button": "Kargatu",
"description": "Kargatu zure AppFlowy gaia beheko botoia erabiliz.",
"failure": "Kargatu zen gaiak formatu baliogabea zuen.",
"loading": "Mesedez, itxaron zure gaia balioztatzen eta kargatzen dugun bitartean...",
"uploadSuccess": "Zure gaia behar bezala kargatu da",
"deletionFailure": "Ezin izan da gaia ezabatu. Saiatu eskuz ezabatzen.",
"filePickerDialogTitle": "Aukeratu .flowy_plugin fitxategi bat",
"urlUploadFailure": "Ezin izan da ireki URLa: {}"
},
"builtInsLabel": "Eraikitako gaiak",
"pluginsLabel": "Pluginak"
},
"files": {
"defaultLocation": "Non gordetzen diren zure datuak",
@@ -187,7 +239,28 @@
"browser": "Bilatu",
"create": "Sortu",
"folderPath": "Zure karpeta gordetzeko bidea",
"locationCannotBeEmpty": "Bideak ezin du hutsa egon"
"locationCannotBeEmpty": "Bideak ezin du hutsa egon",
"copy": "Kopiatu",
"exportData": "Esportatu zure datuak",
"selectAll": "Hautatu guztiak",
"deselectAll": "Deshautatu guztiak",
"defineWhereYourDataIsStored": "Zure datuak non gordetzen diren zehaztu",
"set": "Ezarri",
"pathCopiedSnackbar": "Fitxategiak biltegiratzeko bidea arbelean kopiatu da!",
"changeLocationTooltips": "Aldatu datuen direktorioa",
"change": "Aldatu",
"openLocationTooltips": "Ireki beste datu-direktorio bat",
"openCurrentDataFolder": "Ireki uneko datuen direktorioa",
"recoverLocationTooltips": "Berrezarri AppFlowyren datu-direktorio lehenetsira",
"exportFileSuccess": "Esportatu fitxategia behar bezala!",
"exportFileFail": "Ezin izan da esportatu fitxategia!",
"export": "Esportatu"
},
"user": {
"name": "Izena",
"icon": "Ikonoa",
"selectAnIcon": "Hautatu ikono bat",
"pleaseInputYourOpenAIKey": "mesedez sartu zure OpenAI gakoa"
}
},
"grid": {
@@ -200,7 +273,11 @@
"addFilter": "Gehitu iragazkia",
"deleteFilter": "Ezabatu iragazkia",
"filterBy": "Iragazi arabera...",
"typeAValue": "Idatzi balio bat..."
"typeAValue": "Idatzi balio bat...",
"properties": "Propietateak",
"reorderPropertiesTooltip": "Arrastatu propietateak berrantolatzeko",
"layout": "Diseinua",
"databaseLayout": "Diseinua"
},
"textFilter": {
"contains": "Dauka",
@@ -223,7 +300,8 @@
"isChecked": "Egiaztatuta",
"isUnchecked": "Desmarkatua",
"choicechipPrefix": {
"da": "da"
"da": "da",
"is": "da"
}
},
"checklistFilter": {
@@ -272,7 +350,10 @@
"addOption": "Gehitu aukera",
"editProperty": "Editatu propietatea",
"newProperty": "Zutabe berria",
"deleteFieldPromptMessage": "Ziur al zaude? Propietate hau ezabatu egingo da"
"deleteFieldPromptMessage": "Ziur al zaude? Propietate hau ezabatu egingo da",
"updatedAtFieldName": "Azken aldaketaren ordua",
"createdAtFieldName": "Sortutako denbora",
"dateFormatDayMonthYear": "Eguna/Hilabetea/Urtea"
},
"sort": {
"ascending": "Gorarantz",
@@ -286,7 +367,8 @@
"textPlaceholder": "Hutsik",
"copyProperty": "Propietatea arbelean kopiatu da",
"count": "Kontatu",
"newRow": "Errenkada berria"
"newRow": "Errenkada berria",
"action": "Ekintza"
},
"selectOption": {
"create": "Sortu",
@@ -307,19 +389,160 @@
"checklist": {
"panelTitle": "Gehitu elementu bat"
},
"menuName": "Sareta"
"menuName": "Sareta",
"deleteView": "Ziur ikuspegi hau ezabatu nahi duzula?",
"createView": "Berria",
"referencedGridPrefix": "-ren ikuspegia"
},
"document": {
"menuName": "Dokumentua",
"data": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
},
"date": {
"timeHintTextInTwelveHour": "01:00etan",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Hautatu estekatzeko taula bat",
"createANewBoard": "Sortu taula berri bat"
},
"grid": {
"selectAGridToLinkTo": "Hautatu estekatzeko sare bat",
"createANewGrid": "Sortu sare berri bat"
},
"calendar": {
"selectACalendarToLinkTo": "Hautatu estekatzeko egutegia",
"createANewCalendar": "Sortu egutegi berri bat"
}
},
"selectionMenu": {
"outline": "Eskema"
},
"plugins": {
"referencedBoard": "Erreferentziazko Batzordea",
"referencedGrid": "Erreferentziazko Sarea",
"referencedCalendar": "Erreferentziazko Egutegia",
"autoGeneratorMenuItemName": "OpenAI Writer",
"autoGeneratorTitleName": "OpenAI: Eskatu AIri edozer idazteko...",
"autoGeneratorLearnMore": "Gehiago ikasi",
"autoGeneratorGenerate": "Sortu",
"autoGeneratorHintText": "Galdetu OpenAI...",
"autoGeneratorCantGetOpenAIKey": "Ezin da lortu OpenAI gakoa",
"autoGeneratorRewrite": "Berridatzi",
"smartEdit": "AI Laguntzaileak",
"openAI": "OpenAI",
"smartEditFixSpelling": "Ortografia konpondu",
"warning": "⚠️ AI erantzunak okerrak edo engainagarriak izan daitezke.",
"smartEditSummarize": "Laburtu",
"smartEditImproveWriting": "Hobetu idazkera",
"smartEditMakeLonger": "Luzatu",
"smartEditCouldNotFetchResult": "Ezin izan da emaitzarik eskuratu OpenAI-tik",
"smartEditCouldNotFetchKey": "Ezin izan da OpenAI gakoa eskuratu",
"smartEditDisabled": "Konektatu OpenAI Ezarpenetan",
"discardResponse": "AI erantzunak baztertu nahi dituzu?",
"createInlineMathEquation": "Sortu ekuazioa",
"toggleList": "Aldatu zerrenda",
"cover": {
"changeCover": "Aldatu Azala",
"colors": "Koloreak",
"images": "Irudiak",
"clearAll": "Garbitu guztiak",
"abstract": "Abstraktua",
"addCover": "Gehitu estalkia",
"addLocalImage": "Gehitu tokiko irudia",
"invalidImageUrl": "Irudiaren URL baliogabea",
"failedToAddImageToGallery": "Ezin izan da irudia galerian gehitu",
"enterImageUrl": "Sartu irudiaren URLa",
"add": "Gehitu",
"back": "Itzuli",
"saveToGallery": "Gorde galerian",
"removeIcon": "Kendu ikonoa",
"pasteImageUrl": "Itsatsi irudiaren URLa",
"or": "EDO",
"pickFromFiles": "Aukeratu fitxategietatik",
"couldNotFetchImage": "Ezin izan da irudia eskuratu",
"imageSavingFailed": "Irudiak gordetzean huts egin du",
"addIcon": "Gehitu ikonoa",
"coverRemoveAlert": "Ezabatu ondoren estalkitik kenduko da.",
"alertDialogConfirmation": "Ziur al zaude, jarraitu nahi duzula?"
},
"mathEquation": {
"addMathEquation": "Gehitu Matematika Ekuazioa",
"editMathEquation": "Editatu Matematika Ekuazioa"
},
"optionAction": {
"click": "Egin klik",
"toOpenMenu": " menua irekitzeko",
"delete": "Ezabatu",
"duplicate": "Bikoiztu",
"turnInto": "Bihurtu",
"moveUp": "Gora",
"moveDown": "Mugitu behera",
"color": "Kolore",
"align": "Lerrokatu",
"left": "Ezkerra",
"center": "Zentroa",
"right": "Eskuin",
"defaultColor": "Lehenetsia"
},
"image": {
"copiedToPasteBoard": "Irudiaren esteka arbelean kopiatu da"
},
"outline": {
"addHeadingToCreateOutline": "Gehitu goiburuak aurkibidea sortzeko."
}
},
"textBlock": {
"placeholder": "Idatzi '/' komandoetarako"
},
"title": {
"placeholder": "Izenbururik gabe"
},
"imageBlock": {
"placeholder": "Egin klik irudia gehitzeko",
"upload": {
"label": "Kargatu",
"placeholder": "Egin klik irudia igotzeko"
},
"url": {
"label": "Irudiaren URLa",
"placeholder": "Sartu irudiaren URLa"
},
"support": "Irudiaren tamainaren muga 5 MB da. Onartutako formatuak: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Irudi baliogabea",
"invalidImageSize": "Irudiaren tamaina 5 MB baino txikiagoa izan behar da",
"invalidImageFormat": "Irudi formatua ez da onartzen. Onartutako formatuak: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "Irudiaren URL baliogabea"
}
},
"codeBlock": {
"language": {
"label": "Hizkuntza",
"placeholder": "Hautatu hizkuntza"
}
},
"inlineLink": {
"placeholder": "Itsatsi edo idatzi esteka bat",
"url": {
"label": "Estekaren URLa",
"placeholder": "Sartu estekaren URLa"
},
"title": {
"label": "Estekaren izenburua",
"placeholder": "Sartu estekaren izenburua"
}
}
},
"board": {
"column": {
"create_new_card": "Berria"
}
},
"menuName": "Kontseilua",
"referencedBoardPrefix": "-ren ikuspegia"
},
"calendar": {
"menuName": "Egutegia",
@@ -328,204 +551,55 @@
"jumpToday": "Gaurko egunera salto egin",
"previousMonth": "Aurreko hilabetea",
"nextMonth": "Hurrengo hilabetea"
}
},
"defaultNewCalendarTitle": "Izenbururik gabe",
"settings": {
"showWeekNumbers": "Erakutsi asteko zenbakiak",
"showWeekends": "Asteburuetan erakutsi",
"firstDayOfWeek": "Hasi astea",
"layoutDateField": "Egutegiaren diseinua arabera",
"noDateTitle": "Datarik ez",
"noDateHint": "Programatu gabeko gertaerak hemen agertuko dira",
"clickToAdd": "Egin klik egutegian gehitzeko",
"name": "Egutegiaren diseinua"
},
"referencedCalendarPrefix": "-ren ikuspegia"
},
"youCanAlso": "Zuk ere egin dezakezu",
"and": "eta",
"blockActions.addBelowTooltip": "Egin klik behean gehitzeko",
"blockActions.addAboveCmd": "Alt+klik",
"blockActions.addAboveMacCmd": "Aukera+klik",
"blockActions.addAboveTooltip": "goian gehitzeko",
"signIn.loginAsGuestButtonText": "Hasi",
"moreAction.import": "Inportatu",
"moreAction.moreOptions": "Aukera gehiago",
"importPanel.textAndMarkdown": "Testua eta Markdown",
"importPanel.documentFromV010": "v0.1.0 dokumentua",
"importPanel.databaseFromV010": "0.1.0 bertsioko datu-basea",
"importPanel.csv": "CSV",
"importPanel.database": "Datu-basea",
"disclosureAction.openNewTab": "Ireki fitxa berri batean",
"trash.confirmDeleteAll.title": "Ziur zaborrontziko orrialde guztiak ezabatuko dituzula?",
"trash.confirmDeleteAll.caption": "Ekintza hau ezin da desegin.",
"trash.confirmRestoreAll.title": "Ziur zaborrontziko orrialde guztiak leheneratuko dituzula?",
"trash.confirmRestoreAll.caption": "Ekintza hau ezin da desegin.",
"questionBubble.shortcuts": "Lasterbideak",
"questionBubble.markdown": "Markdown",
"questionBubble.feedback": "Iritzia",
"toolbar.addLink": "Gehitu esteka",
"toolbar.link": "Esteka",
"tooltip.dragRow": "Luze sakatu errenkada berrantolatzeko",
"tooltip.viewDataBase": "Ikusi datu-basea",
"tooltip.referencePage": "{izena} honi erreferentzia egiten zaio",
"tooltip.addBlockBelow": "Gehitu bloke bat behean",
"button.Done": "Eginda",
"button.generate": "Sortu",
"button.esc": "ESC",
"button.keep": "Gorde",
"button.tryAgain": "Saiatu berriro",
"button.discard": "Baztertu",
"button.replace": "Ordezkatu",
"button.insertBelow": "Txertatu behean",
"button.upload": "Kargatu",
"button.edit": "Editatu",
"button.delete": "Ezabatu",
"button.duplicate": "Bikoiztu",
"button.done": "Eginda",
"button.putback": "Jarri Atzera",
"settings.menu.supabaseSetting": "Supabase ezarpena",
"settings.appearance.fontFamily.label": "Letra-tipoen familia",
"settings.appearance.fontFamily.search": "Bilatu",
"settings.appearance.themeUpload.button": "Kargatu",
"settings.appearance.themeUpload.description": "Kargatu zure AppFlowy gaia beheko botoia erabiliz.",
"settings.appearance.themeUpload.failure": "Kargatu zen gaiak formatu baliogabea zuen.",
"settings.appearance.themeUpload.loading": "Mesedez, itxaron zure gaia balioztatzen eta kargatzen dugun bitartean...",
"settings.appearance.themeUpload.uploadSuccess": "Zure gaia behar bezala kargatu da",
"settings.appearance.themeUpload.deletionFailure": "Ezin izan da gaia ezabatu. Saiatu eskuz ezabatzen.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Aukeratu .flowy_plugin fitxategi bat",
"settings.appearance.themeUpload.urlUploadFailure": "Ezin izan da ireki URLa: {}",
"settings.appearance.builtInsLabel": "Eraikitako gaiak",
"settings.appearance.pluginsLabel": "Pluginak",
"settings.files.copy": "Kopiatu",
"settings.files.exportData": "Esportatu zure datuak",
"settings.files.selectAll": "Hautatu guztiak",
"settings.files.deselectAll": "Deshautatu guztiak",
"settings.files.defineWhereYourDataIsStored": "Zure datuak non gordetzen diren zehaztu",
"settings.files.set": "Ezarri",
"settings.files.pathCopiedSnackbar": "Fitxategiak biltegiratzeko bidea arbelean kopiatu da!",
"settings.files.changeLocationTooltips": "Aldatu datuen direktorioa",
"settings.files.change": "Aldatu",
"settings.files.openLocationTooltips": "Ireki beste datu-direktorio bat",
"settings.files.openCurrentDataFolder": "Ireki uneko datuen direktorioa",
"settings.files.recoverLocationTooltips": "Berrezarri AppFlowyren datu-direktorio lehenetsira",
"settings.files.exportFileSuccess": "Esportatu fitxategia behar bezala!",
"settings.files.exportFileFail": "Ezin izan da esportatu fitxategia!",
"settings.files.export": "Esportatu",
"settings.user.name": "Izena",
"settings.user.icon": "Ikonoa",
"settings.user.selectAnIcon": "Hautatu ikono bat",
"settings.user.pleaseInputYourOpenAIKey": "mesedez sartu zure OpenAI gakoa",
"grid.deleteView": "Ziur ikuspegi hau ezabatu nahi duzula?",
"grid.createView": "Berria",
"grid.settings.properties": "Propietateak",
"grid.settings.reorderPropertiesTooltip": "Arrastatu propietateak berrantolatzeko",
"grid.settings.layout": "Diseinua",
"grid.settings.databaseLayout": "Diseinua",
"grid.checkboxFilter.choicechipPrefix.is": "da",
"grid.field.updatedAtFieldName": "Azken aldaketaren ordua",
"grid.field.createdAtFieldName": "Sortutako denbora",
"grid.field.dateFormatDayMonthYear": "Eguna/Hilabetea/Urtea",
"grid.row.action": "Ekintza",
"grid.referencedGridPrefix": "-ren ikuspegia",
"document.date.timeHintTextInTwelveHour": "01:00etan",
"document.date.timeHintTextInTwentyFourHour": "13:00",
"document.slashMenu.board.selectABoardToLinkTo": "Hautatu estekatzeko taula bat",
"document.slashMenu.board.createANewBoard": "Sortu taula berri bat",
"document.slashMenu.grid.selectAGridToLinkTo": "Hautatu estekatzeko sare bat",
"document.slashMenu.grid.createANewGrid": "Sortu sare berri bat",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Hautatu estekatzeko egutegia",
"document.slashMenu.calendar.createANewCalendar": "Sortu egutegi berri bat",
"document.selectionMenu.outline": "Eskema",
"document.plugins.referencedBoard": "Erreferentziazko Batzordea",
"document.plugins.referencedGrid": "Erreferentziazko Sarea",
"document.plugins.referencedCalendar": "Erreferentziazko Egutegia",
"document.plugins.autoGeneratorMenuItemName": "OpenAI Writer",
"document.plugins.autoGeneratorTitleName": "OpenAI: Eskatu AIri edozer idazteko...",
"document.plugins.autoGeneratorLearnMore": "Gehiago ikasi",
"document.plugins.autoGeneratorGenerate": "Sortu",
"document.plugins.autoGeneratorHintText": "Galdetu OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Ezin da lortu OpenAI gakoa",
"document.plugins.autoGeneratorRewrite": "Berridatzi",
"document.plugins.smartEdit": "AI Laguntzaileak",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Ortografia konpondu",
"document.plugins.warning": "⚠️ AI erantzunak okerrak edo engainagarriak izan daitezke.",
"document.plugins.smartEditSummarize": "Laburtu",
"document.plugins.smartEditImproveWriting": "Hobetu idazkera",
"document.plugins.smartEditMakeLonger": "Luzatu",
"document.plugins.smartEditCouldNotFetchResult": "Ezin izan da emaitzarik eskuratu OpenAI-tik",
"document.plugins.smartEditCouldNotFetchKey": "Ezin izan da OpenAI gakoa eskuratu",
"document.plugins.smartEditDisabled": "Konektatu OpenAI Ezarpenetan",
"document.plugins.discardResponse": "AI erantzunak baztertu nahi dituzu?",
"document.plugins.createInlineMathEquation": "Sortu ekuazioa",
"document.plugins.toggleList": "Aldatu zerrenda",
"document.plugins.cover.changeCover": "Aldatu Azala",
"document.plugins.cover.colors": "Koloreak",
"document.plugins.cover.images": "Irudiak",
"document.plugins.cover.clearAll": "Garbitu guztiak",
"document.plugins.cover.abstract": "Abstraktua",
"document.plugins.cover.addCover": "Gehitu estalkia",
"document.plugins.cover.addLocalImage": "Gehitu tokiko irudia",
"document.plugins.cover.invalidImageUrl": "Irudiaren URL baliogabea",
"document.plugins.cover.failedToAddImageToGallery": "Ezin izan da irudia galerian gehitu",
"document.plugins.cover.enterImageUrl": "Sartu irudiaren URLa",
"document.plugins.cover.add": "Gehitu",
"document.plugins.cover.back": "Itzuli",
"document.plugins.cover.saveToGallery": "Gorde galerian",
"document.plugins.cover.removeIcon": "Kendu ikonoa",
"document.plugins.cover.pasteImageUrl": "Itsatsi irudiaren URLa",
"document.plugins.cover.or": "EDO",
"document.plugins.cover.pickFromFiles": "Aukeratu fitxategietatik",
"document.plugins.cover.couldNotFetchImage": "Ezin izan da irudia eskuratu",
"document.plugins.cover.imageSavingFailed": "Irudiak gordetzean huts egin du",
"document.plugins.cover.addIcon": "Gehitu ikonoa",
"document.plugins.cover.coverRemoveAlert": "Ezabatu ondoren estalkitik kenduko da.",
"document.plugins.cover.alertDialogConfirmation": "Ziur al zaude, jarraitu nahi duzula?",
"document.plugins.mathEquation.addMathEquation": "Gehitu Matematika Ekuazioa",
"document.plugins.mathEquation.editMathEquation": "Editatu Matematika Ekuazioa",
"document.plugins.optionAction.click": "Egin klik",
"document.plugins.optionAction.toOpenMenu": " menua irekitzeko",
"document.plugins.optionAction.delete": "Ezabatu",
"document.plugins.optionAction.duplicate": "Bikoiztu",
"document.plugins.optionAction.turnInto": "Bihurtu",
"document.plugins.optionAction.moveUp": "Gora",
"document.plugins.optionAction.moveDown": "Mugitu behera",
"document.plugins.optionAction.color": "Kolore",
"document.plugins.optionAction.align": "Lerrokatu",
"document.plugins.optionAction.left": "Ezkerra",
"document.plugins.optionAction.center": "Zentroa",
"document.plugins.optionAction.right": "Eskuin",
"document.plugins.optionAction.defaultColor": "Lehenetsia",
"document.plugins.image.copiedToPasteBoard": "Irudiaren esteka arbelean kopiatu da",
"document.plugins.outline.addHeadingToCreateOutline": "Gehitu goiburuak aurkibidea sortzeko.",
"document.textBlock.placeholder": "Idatzi '/' komandoetarako",
"document.title.placeholder": "Izenbururik gabe",
"document.imageBlock.placeholder": "Egin klik irudia gehitzeko",
"document.imageBlock.upload.label": "Kargatu",
"document.imageBlock.upload.placeholder": "Egin klik irudia igotzeko",
"document.imageBlock.url.label": "Irudiaren URLa",
"document.imageBlock.url.placeholder": "Sartu irudiaren URLa",
"document.imageBlock.support": "Irudiaren tamainaren muga 5 MB da. Onartutako formatuak: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Irudi baliogabea",
"document.imageBlock.error.invalidImageSize": "Irudiaren tamaina 5 MB baino txikiagoa izan behar da",
"document.imageBlock.error.invalidImageFormat": "Irudi formatua ez da onartzen. Onartutako formatuak: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "Irudiaren URL baliogabea",
"document.codeBlock.language.label": "Hizkuntza",
"document.codeBlock.language.placeholder": "Hautatu hizkuntza",
"document.inlineLink.placeholder": "Itsatsi edo idatzi esteka bat",
"document.inlineLink.url.label": "Estekaren URLa",
"document.inlineLink.url.placeholder": "Sartu estekaren URLa",
"document.inlineLink.title.label": "Estekaren izenburua",
"document.inlineLink.title.placeholder": "Sartu estekaren izenburua",
"board.menuName": "Kontseilua",
"board.referencedBoardPrefix": "-ren ikuspegia",
"calendar.defaultNewCalendarTitle": "Izenbururik gabe",
"calendar.settings.showWeekNumbers": "Erakutsi asteko zenbakiak",
"calendar.settings.showWeekends": "Asteburuetan erakutsi",
"calendar.settings.firstDayOfWeek": "Hasi astea",
"calendar.settings.layoutDateField": "Egutegiaren diseinua arabera",
"calendar.settings.noDateTitle": "Datarik ez",
"calendar.settings.noDateHint": "Programatu gabeko gertaerak hemen agertuko dira",
"calendar.settings.clickToAdd": "Egin klik egutegian gehitzeko",
"calendar.settings.name": "Egutegiaren diseinua",
"calendar.referencedCalendarPrefix": "-ren ikuspegia",
"errorDialog.title": "AppFlowy errorea",
"errorDialog.howToFixFallback": "Sentitzen dugu eragozpenak! Bidali zure errorea deskribatzen duen arazo bat gure GitHub orrian.",
"errorDialog.github": "Ikusi GitHub-en",
"search.label": "Bilatu",
"search.placeholder.actions": "Bilatu ekintzak...",
"message.copy.success": "Kopiatu!",
"message.copy.fail": "Ezin da kopiatu",
"blockActions": {
"addBelowTooltip": "Egin klik behean gehitzeko",
"addAboveCmd": "Alt+klik",
"addAboveMacCmd": "Aukera+klik",
"addAboveTooltip": "goian gehitzeko"
},
"importPanel": {
"textAndMarkdown": "Testua eta Markdown",
"documentFromV010": "v0.1.0 dokumentua",
"databaseFromV010": "0.1.0 bertsioko datu-basea",
"csv": "CSV",
"database": "Datu-basea"
},
"errorDialog": {
"title": "AppFlowy errorea",
"howToFixFallback": "Sentitzen dugu eragozpenak! Bidali zure errorea deskribatzen duen arazo bat gure GitHub orrian.",
"github": "Ikusi GitHub-en"
},
"search": {
"label": "Bilatu",
"placeholder": {
"actions": "Bilatu ekintzak..."
}
},
"message": {
"copy": {
"success": "Kopiatu!",
"fail": "Ezin da kopiatu"
}
},
"unSupportBlock": "Uneko bertsioak ez du bloke hau onartzen.",
"views.deleteContentTitle": "Ziur {pageType} ezabatu nahi duzula?",
"views.deleteContentCaption": "{pageType} hau ezabatzen baduzu, zaborrontzitik leheneratu dezakezu."
"views": {
"deleteContentTitle": "Ziur {pageType} ezabatu nahi duzula?",
"deleteContentCaption": "{pageType} hau ezabatzen baduzu, zaborrontzitik leheneratu dezakezu."
}
}
+451 -331
View File
@@ -27,7 +27,8 @@
"passwordHint": "Mot de passe",
"dontHaveAnAccount": "Vous n'avez pas de compte?",
"repeatPasswordEmptyError": "Mot de passe ne doit pas être vide",
"unmatchedPasswordError": "Les deux mots de passe ne sont pas identiques"
"unmatchedPasswordError": "Les deux mots de passe ne sont pas identiques",
"loginAsGuestButtonText": "Commencer"
},
"workspace": {
"create": "Créer un espace de travail",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Renommer",
"delete": "Supprimer",
"duplicate": "Dupliquer"
"duplicate": "Dupliquer",
"openNewTab": "Ouvrir dans un nouvel onglet"
},
"blankPageTitle": "Page vierge",
"newPageText": "Nouvelle page",
@@ -55,6 +57,14 @@
"fileName": "Nom de fichier",
"lastModified": "Dernière modification",
"created": "Créé"
},
"confirmDeleteAll": {
"title": "Voulez-vous vraiment supprimer toutes les pages de la corbeille ?",
"caption": "Cette action ne peut pas être annulée."
},
"confirmRestoreAll": {
"title": "Êtes-vous sûr de vouloir restaurer toutes les pages dans la corbeille ?",
"caption": "Cette action ne peut pas être annulée."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Infos du système",
"success": "Info copié!",
"fail": "Impossible de copier l'info"
}
},
"shortcuts": "Raccourcis",
"markdown": "Réduction",
"feedback": "Retour"
},
"menuAppHeader": {
"addPageTooltip": "Ajouter une page",
@@ -90,11 +103,21 @@
"inlineCode": "Code en ligne",
"quote": "Citation",
"header": "En-tête",
"highlight": "Surligner"
"highlight": "Surligner",
"color": "Couleur",
"addLink": "Ajouter un lien",
"link": "Lien"
},
"tooltip": {
"lightMode": "Passer en mode clair",
"darkMode": "Passer en mode sombre"
"darkMode": "Passer en mode sombre",
"openAsPage": "Ouvrir en tant que page",
"addNewRow": "Ajouter une nouvelle ligne",
"openMenu": "Cliquez pour ouvrir le menu",
"dragRow": "Appuyez longuement pour réorganiser la ligne",
"viewDataBase": "Voir la base de données",
"referencePage": "Ce {nom} est référencé",
"addBlockBelow": "Ajouter un bloc ci-dessous"
},
"contactsPage": {
"title": "Contacts",
@@ -108,7 +131,21 @@
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"complete": "Achevé",
"save": "Sauvegarder"
"save": "Sauvegarder",
"Done": "Fait",
"generate": "Générer",
"esc": "ESC",
"keep": "Donjon",
"tryAgain": "Essayer à nouveau",
"discard": "Jeter",
"replace": "Remplacer",
"insertBelow": "Insérer ci-dessous",
"upload": "Télécharger",
"edit": "Modifier",
"delete": "Supprimer",
"duplicate": "Dupliquer",
"done": "Fait",
"putback": "Remettre"
},
"label": {
"welcome": "Bienvenue!",
@@ -135,7 +172,10 @@
"menu": {
"appearance": "Apparence",
"language": "Langue",
"open": "Ouvrir les paramètres"
"open": "Ouvrir les paramètres",
"user": "Utilisateur",
"files": "Des dossiers",
"supabaseSetting": "Paramètre Supbase"
},
"appearance": {
"themeMode": {
@@ -143,337 +183,417 @@
"light": "Mode clair",
"dark": "Mode sombre",
"system": "Adapt to System"
}
},
"fontFamily": {
"label": "Famille de polices",
"search": "Recherche"
},
"themeUpload": {
"button": "Télécharger",
"description": "Téléchargez votre propre thème AppFlowy en utilisant le bouton ci-dessous.",
"failure": "Le thème qui a été téléchargé avait un format non valide.",
"loading": "Veuillez patienter pendant que nous validons et téléchargeons votre thème...",
"uploadSuccess": "Votre thème a été téléchargé avec succès",
"deletionFailure": "Échec de la suppression du thème. Essayez de le supprimer manuellement.",
"filePickerDialogTitle": "Choisissez un fichier .flowy_plugin",
"urlUploadFailure": "Échec de l'ouverture de l'URL : {}"
},
"theme": "Thème",
"builtInsLabel": "Thèmes intégrés",
"pluginsLabel": "Plugins"
},
"files": {
"copy": "Copie",
"defaultLocation": "Lire les fichiers et l'emplacement de stockage des données",
"exportData": "Exportez vos données",
"doubleTapToCopy": "Appuyez deux fois pour copier le chemin",
"restoreLocation": "Restaurer le chemin par défaut d'AppFlowy",
"customizeLocation": "Ouvrir un autre dossier",
"restartApp": "Veuillez redémarrer l'application pour que les modifications prennent effet.",
"exportDatabase": "Exporter la base de données",
"selectFiles": "Sélectionnez les fichiers qui doivent être exportés",
"selectAll": "Tout sélectionner",
"deselectAll": "Tout déselectionner",
"createNewFolder": "Créer un nouveau dossier",
"createNewFolderDesc": "Dites-nous où vous souhaitez stocker vos données",
"defineWhereYourDataIsStored": "Définissez où vos données sont stockées",
"open": "Ouvrir",
"openFolder": "Ouvrir un dossier existant",
"openFolderDesc": "Lisez-le et écrivez-le dans votre dossier AppFlowy existant",
"folderHintText": "nom de dossier",
"location": "Création d'un nouveau dossier",
"locationDesc": "Choisissez un nom pour votre dossier de données AppFlowy",
"browser": "Parcourir",
"create": "Créer",
"set": "Ensemble",
"folderPath": "Chemin pour stocker votre dossier",
"locationCannotBeEmpty": "Le chemin ne peut pas être vide",
"pathCopiedSnackbar": "Chemin de stockage des fichiers copié dans le presse-papier !",
"changeLocationTooltips": "Changer le répertoire de données",
"change": "Changement",
"openLocationTooltips": "Ouvrir un autre répertoire de données",
"openCurrentDataFolder": "Ouvrir le répertoire de données actuel",
"recoverLocationTooltips": "Réinitialiser au répertoire de données par défaut d'AppFlowy",
"exportFileSuccess": "Exporter le fichier avec succès !",
"exportFileFail": "Échec de l'exportation du fichier !",
"export": "Exporter"
},
"user": {
"name": "Nom",
"icon": "Icône",
"selectAnIcon": "Sélectionnez une icône",
"pleaseInputYourOpenAIKey": "veuillez entrer votre clé OpenAI"
}
},
"sideBar": {
"openSidebar": "Open sidebar",
"closeSidebar": "Close sidebar"
},
"moreAction.small": "petit",
"moreAction": {
"small": "petit",
"medium": "moyen",
"large": "grand",
"fontSize": "Taille de police",
"import": "Importer",
"moreOptions": "Plus d'options"
},
"youCanAlso": "Vous pouvez aussi",
"and": "et",
"blockActions.addBelowTooltip": "Cliquez pour ajouter ci-dessous",
"blockActions.addAboveCmd": "Alt+clic",
"blockActions.addAboveMacCmd": "Option+clic",
"blockActions.addAboveTooltip": "à ajouter au dessus",
"signIn.loginAsGuestButtonText": "Commencer",
"moreAction.medium": "moyen",
"moreAction.large": "grand",
"moreAction.fontSize": "Taille de police",
"moreAction.import": "Importer",
"moreAction.moreOptions": "Plus d'options",
"importPanel.textAndMarkdown": "Texte et Markdown",
"importPanel.documentFromV010": "Document de la v0.1.0",
"importPanel.databaseFromV010": "Base de données à partir de la v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Base de données",
"disclosureAction.openNewTab": "Ouvrir dans un nouvel onglet",
"trash.confirmDeleteAll.title": "Voulez-vous vraiment supprimer toutes les pages de la corbeille ?",
"trash.confirmDeleteAll.caption": "Cette action ne peut pas être annulée.",
"trash.confirmRestoreAll.title": "Êtes-vous sûr de vouloir restaurer toutes les pages dans la corbeille ?",
"trash.confirmRestoreAll.caption": "Cette action ne peut pas être annulée.",
"questionBubble.shortcuts": "Raccourcis",
"questionBubble.markdown": "Réduction",
"questionBubble.feedback": "Retour",
"toolbar.color": "Couleur",
"toolbar.addLink": "Ajouter un lien",
"toolbar.link": "Lien",
"tooltip.openAsPage": "Ouvrir en tant que page",
"tooltip.addNewRow": "Ajouter une nouvelle ligne",
"tooltip.openMenu": "Cliquez pour ouvrir le menu",
"tooltip.dragRow": "Appuyez longuement pour réorganiser la ligne",
"tooltip.viewDataBase": "Voir la base de données",
"tooltip.referencePage": "Ce {nom} est référencé",
"tooltip.addBlockBelow": "Ajouter un bloc ci-dessous",
"notifications.export.markdown": "Note exportée vers Markdown",
"notifications.export.path": "Documents/fluide",
"button.Done": "Fait",
"button.generate": "Générer",
"button.esc": "ESC",
"button.keep": "Donjon",
"button.tryAgain": "Essayer à nouveau",
"button.discard": "Jeter",
"button.replace": "Remplacer",
"button.insertBelow": "Insérer ci-dessous",
"button.upload": "Télécharger",
"button.edit": "Modifier",
"button.delete": "Supprimer",
"button.duplicate": "Dupliquer",
"button.done": "Fait",
"button.putback": "Remettre",
"settings.menu.user": "Utilisateur",
"settings.menu.files": "Des dossiers",
"settings.menu.supabaseSetting": "Paramètre Supbase",
"settings.appearance.fontFamily.label": "Famille de polices",
"settings.appearance.fontFamily.search": "Recherche",
"settings.appearance.themeUpload.button": "Télécharger",
"settings.appearance.themeUpload.description": "Téléchargez votre propre thème AppFlowy en utilisant le bouton ci-dessous.",
"settings.appearance.themeUpload.failure": "Le thème qui a été téléchargé avait un format non valide.",
"settings.appearance.themeUpload.loading": "Veuillez patienter pendant que nous validons et téléchargeons votre thème...",
"settings.appearance.themeUpload.uploadSuccess": "Votre thème a été téléchargé avec succès",
"settings.appearance.themeUpload.deletionFailure": "Échec de la suppression du thème. Essayez de le supprimer manuellement.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Choisissez un fichier .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "Échec de l'ouverture de l'URL : {}",
"settings.appearance.theme": "Thème",
"settings.appearance.builtInsLabel": "Thèmes intégrés",
"settings.appearance.pluginsLabel": "Plugins",
"settings.files.copy": "Copie",
"settings.files.defaultLocation": "Lire les fichiers et l'emplacement de stockage des données",
"settings.files.exportData": "Exportez vos données",
"settings.files.doubleTapToCopy": "Appuyez deux fois pour copier le chemin",
"settings.files.restoreLocation": "Restaurer le chemin par défaut d'AppFlowy",
"settings.files.customizeLocation": "Ouvrir un autre dossier",
"settings.files.restartApp": "Veuillez redémarrer l'application pour que les modifications prennent effet.",
"settings.files.exportDatabase": "Exporter la base de données",
"settings.files.selectFiles": "Sélectionnez les fichiers qui doivent être exportés",
"settings.files.selectAll": "Tout sélectionner",
"settings.files.deselectAll": "Tout déselectionner",
"settings.files.createNewFolder": "Créer un nouveau dossier",
"settings.files.createNewFolderDesc": "Dites-nous où vous souhaitez stocker vos données",
"settings.files.defineWhereYourDataIsStored": "Définissez où vos données sont stockées",
"settings.files.open": "Ouvrir",
"settings.files.openFolder": "Ouvrir un dossier existant",
"settings.files.openFolderDesc": "Lisez-le et écrivez-le dans votre dossier AppFlowy existant",
"settings.files.folderHintText": "nom de dossier",
"settings.files.location": "Création d'un nouveau dossier",
"settings.files.locationDesc": "Choisissez un nom pour votre dossier de données AppFlowy",
"settings.files.browser": "Parcourir",
"settings.files.create": "Créer",
"settings.files.set": "Ensemble",
"settings.files.folderPath": "Chemin pour stocker votre dossier",
"settings.files.locationCannotBeEmpty": "Le chemin ne peut pas être vide",
"settings.files.pathCopiedSnackbar": "Chemin de stockage des fichiers copié dans le presse-papier !",
"settings.files.changeLocationTooltips": "Changer le répertoire de données",
"settings.files.change": "Changement",
"settings.files.openLocationTooltips": "Ouvrir un autre répertoire de données",
"settings.files.openCurrentDataFolder": "Ouvrir le répertoire de données actuel",
"settings.files.recoverLocationTooltips": "Réinitialiser au répertoire de données par défaut d'AppFlowy",
"settings.files.exportFileSuccess": "Exporter le fichier avec succès !",
"settings.files.exportFileFail": "Échec de l'exportation du fichier !",
"settings.files.export": "Exporter",
"settings.user.name": "Nom",
"settings.user.icon": "Icône",
"settings.user.selectAnIcon": "Sélectionnez une icône",
"settings.user.pleaseInputYourOpenAIKey": "veuillez entrer votre clé OpenAI",
"grid.deleteView": "Voulez-vous vraiment supprimer cette vue ?",
"grid.createView": "Nouveau",
"grid.settings.filter": "Filtre",
"grid.settings.sort": "Trier",
"grid.settings.sortBy": "Trier par",
"grid.settings.properties": "Propriétés",
"grid.settings.reorderPropertiesTooltip": "Faites glisser pour réorganiser les propriétés",
"grid.settings.group": "Groupe",
"grid.settings.addFilter": "Ajouter un filtre",
"grid.settings.deleteFilter": "Supprimer le filtre",
"grid.settings.filterBy": "Filtrer par...",
"grid.settings.typeAValue": "Tapez une valeur...",
"grid.settings.layout": "Mise en page",
"grid.settings.databaseLayout": "Mise en page",
"grid.textFilter.contains": "Contient",
"grid.textFilter.doesNotContain": "Ne contient pas",
"grid.textFilter.endsWith": "Se termine par",
"grid.textFilter.startWith": "Commence avec",
"grid.textFilter.is": "Est",
"grid.textFilter.isNot": "N'est pas",
"grid.textFilter.isEmpty": "Est vide",
"grid.textFilter.isNotEmpty": "N'est pas vide",
"grid.textFilter.choicechipPrefix.isNot": "Pas",
"grid.textFilter.choicechipPrefix.startWith": "Commence avec",
"grid.textFilter.choicechipPrefix.endWith": "Se termine par",
"grid.textFilter.choicechipPrefix.isEmpty": "est vide",
"grid.textFilter.choicechipPrefix.isNotEmpty": "n'est pas vide",
"grid.checkboxFilter.isChecked": "Vérifié",
"grid.checkboxFilter.isUnchecked": "Décoché",
"grid.checkboxFilter.choicechipPrefix.is": "est",
"grid.checklistFilter.isComplete": "est complet",
"grid.checklistFilter.isIncomplted": "est incomplet",
"grid.singleSelectOptionFilter.is": "Est",
"grid.singleSelectOptionFilter.isNot": "N'est pas",
"grid.singleSelectOptionFilter.isEmpty": "Est vide",
"grid.singleSelectOptionFilter.isNotEmpty": "N'est pas vide",
"grid.multiSelectOptionFilter.contains": "Contient",
"grid.multiSelectOptionFilter.doesNotContain": "Ne contient pas",
"grid.multiSelectOptionFilter.isEmpty": "Est vide",
"grid.multiSelectOptionFilter.isNotEmpty": "N'est pas vide",
"grid.field.hide": "Cacher",
"grid.field.insertLeft": "Insérer à gauche",
"grid.field.insertRight": "Insérer à droite",
"grid.field.duplicate": "Dupliquer",
"grid.field.delete": "Supprimer",
"grid.field.textFieldName": "Texte",
"grid.field.checkboxFieldName": "Case à cocher",
"grid.field.dateFieldName": "Date",
"grid.field.updatedAtFieldName": "Heure de la dernière modification",
"grid.field.createdAtFieldName": "Temps créé",
"grid.field.numberFieldName": "Nombres",
"grid.field.singleSelectFieldName": "Sélectionner",
"grid.field.multiSelectFieldName": "Sélection multiple",
"grid.field.urlFieldName": "URL",
"grid.field.checklistFieldName": "Liste de contrôle",
"grid.field.numberFormat": "Format de nombre",
"grid.field.dateFormat": "Format de date",
"grid.field.includeTime": "Inclure le temps",
"grid.field.dateFormatFriendly": "Année mois jour",
"grid.field.dateFormatISO": "Année mois jour",
"grid.field.dateFormatLocal": "Année mois jour",
"grid.field.dateFormatUS": "Année mois jour",
"grid.field.dateFormatDayMonthYear": "Jour mois année",
"grid.field.timeFormat": "Format de l'heure",
"grid.field.invalidTimeFormat": "Format invalide",
"grid.field.timeFormatTwelveHour": "12 heures",
"grid.field.timeFormatTwentyFourHour": "24 heures",
"grid.field.addSelectOption": "Ajouter une option",
"grid.field.optionTitle": "Choix",
"grid.field.addOption": "Ajouter une option",
"grid.field.editProperty": "Modifier la propriété",
"grid.field.newProperty": "Nouvelle propriété",
"grid.field.deleteFieldPromptMessage": "Es-tu sûr? Cette propriété sera supprimée",
"grid.sort.ascending": "Ascendant",
"grid.sort.descending": "Descendant",
"grid.sort.deleteSort": "Supprimer le tri",
"grid.sort.addSort": "Ajouter un tri",
"grid.row.duplicate": "Dupliquer",
"grid.row.delete": "Supprimer",
"grid.row.textPlaceholder": "Vide",
"grid.row.copyProperty": "Propriété copiée dans le presse-papiers",
"grid.row.count": "Compter",
"grid.row.newRow": "Nouvelle ligne",
"grid.row.action": "Action",
"grid.selectOption.create": "Créer",
"grid.selectOption.purpleColor": "Violet",
"grid.selectOption.pinkColor": "Rose",
"grid.selectOption.lightPinkColor": "Rose clair",
"grid.selectOption.orangeColor": "Orange",
"grid.selectOption.yellowColor": "Jaune",
"grid.selectOption.limeColor": "Chaux",
"grid.selectOption.greenColor": "Vert",
"grid.selectOption.aquaColor": "Aqua",
"grid.selectOption.blueColor": "Bleu",
"grid.selectOption.deleteTag": "Supprimer la balise",
"grid.selectOption.colorPanelTitle": "Couleurs",
"grid.selectOption.panelTitle": "Sélectionnez une option ou créez-en une",
"grid.selectOption.searchOption": "Rechercher une option",
"grid.checklist.panelTitle": "Ajouter un article",
"grid.menuName": "Grille",
"grid.referencedGridPrefix": "Vue",
"document.menuName": "Document",
"document.date.timeHintTextInTwelveHour": "13h00",
"document.date.timeHintTextInTwentyFourHour": "13:00",
"document.slashMenu.board.selectABoardToLinkTo": "Sélectionnez un tableau à lier",
"document.slashMenu.board.createANewBoard": "Créer un nouveau tableau",
"document.slashMenu.grid.selectAGridToLinkTo": "Sélectionnez une grille à lier",
"document.slashMenu.grid.createANewGrid": "Créer une nouvelle Grille",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Sélectionnez un calendrier à lier",
"document.slashMenu.calendar.createANewCalendar": "Créer un nouveau calendrier",
"document.selectionMenu.outline": "Contour",
"document.plugins.referencedBoard": "Conseil référencé",
"document.plugins.referencedGrid": "Grille référencée",
"document.plugins.referencedCalendar": "Calendrier référencé",
"document.plugins.autoGeneratorMenuItemName": "Rédacteur OpenAI",
"document.plugins.autoGeneratorTitleName": "OpenAI : Demandez à l'IA d'écrire n'importe quoi...",
"document.plugins.autoGeneratorLearnMore": "Apprendre encore plus",
"document.plugins.autoGeneratorGenerate": "Générer",
"document.plugins.autoGeneratorHintText": "Demandez à OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Impossible d'obtenir la clé OpenAI",
"document.plugins.autoGeneratorRewrite": "Récrire",
"document.plugins.smartEdit": "Assistants IA",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Corriger l'orthographe",
"document.plugins.warning": "⚠️ Les réponses de l'IA peuvent être inexactes ou trompeuses.",
"document.plugins.smartEditSummarize": "Résumer",
"document.plugins.smartEditImproveWriting": "Améliorer l'écriture",
"document.plugins.smartEditMakeLonger": "Rallonger",
"document.plugins.smartEditCouldNotFetchResult": "Impossible de récupérer le résultat d'OpenAI",
"document.plugins.smartEditCouldNotFetchKey": "Impossible de récupérer la clé OpenAI",
"document.plugins.smartEditDisabled": "Connectez OpenAI dans les paramètres",
"document.plugins.discardResponse": "Voulez-vous supprimer les réponses de l'IA ?",
"document.plugins.createInlineMathEquation": "Créer une équation",
"document.plugins.toggleList": "Basculer la liste",
"document.plugins.cover.changeCover": "Changer de couverture",
"document.plugins.cover.colors": "Couleurs",
"document.plugins.cover.images": "Images",
"document.plugins.cover.clearAll": "Tout effacer",
"document.plugins.cover.abstract": "Abstrait",
"document.plugins.cover.addCover": "Ajouter une couverture",
"document.plugins.cover.addLocalImage": "Ajouter une image locale",
"document.plugins.cover.invalidImageUrl": "URL d'image non valide",
"document.plugins.cover.failedToAddImageToGallery": "Impossible d'ajouter l'image à la galerie",
"document.plugins.cover.enterImageUrl": "Entrez l'URL de l'image",
"document.plugins.cover.add": "Ajouter",
"document.plugins.cover.back": "Dos",
"document.plugins.cover.saveToGallery": "Sauvegarder dans la gallerie",
"document.plugins.cover.removeIcon": "Supprimer l'icône",
"document.plugins.cover.pasteImageUrl": "Coller l'URL de l'image",
"document.plugins.cover.or": "OU",
"document.plugins.cover.pickFromFiles": "Choisissez parmi les fichiers",
"document.plugins.cover.couldNotFetchImage": "Impossible de récupérer l'image",
"document.plugins.cover.imageSavingFailed": "Échec de l'enregistrement de l'image",
"document.plugins.cover.addIcon": "Ajouter une icône",
"document.plugins.cover.coverRemoveAlert": "Il sera retiré de la couverture après sa suppression.",
"document.plugins.cover.alertDialogConfirmation": "Es-tu sur de vouloir continuer?",
"document.plugins.mathEquation.addMathEquation": "Ajouter une équation mathématique",
"document.plugins.mathEquation.editMathEquation": "Modifier l'équation mathématique",
"document.plugins.optionAction.click": "Cliquez sur",
"document.plugins.optionAction.toOpenMenu": " pour ouvrir le menu",
"document.plugins.optionAction.delete": "Supprimer",
"document.plugins.optionAction.duplicate": "Dupliquer",
"document.plugins.optionAction.turnInto": "Changer en",
"document.plugins.optionAction.moveUp": "Déplacer vers le haut",
"document.plugins.optionAction.moveDown": "Descendre",
"document.plugins.optionAction.color": "Couleur",
"document.plugins.optionAction.align": "Aligner",
"document.plugins.optionAction.left": "Gauche",
"document.plugins.optionAction.center": "Centre",
"document.plugins.optionAction.right": "Droite",
"document.plugins.optionAction.defaultColor": "Défaut",
"document.plugins.image.copiedToPasteBoard": "Le lien de l'image a été copié dans le presse-papiers",
"document.plugins.outline.addHeadingToCreateOutline": "Ajoutez des titres pour créer une table des matières.",
"document.textBlock.placeholder": "Tapez '/' pour les commandes",
"document.title.placeholder": "Sans titre",
"document.imageBlock.placeholder": "Cliquez pour ajouter une image",
"document.imageBlock.upload.label": "Télécharger",
"document.imageBlock.upload.placeholder": "Cliquez pour télécharger l'image",
"document.imageBlock.url.label": "URL de l'image",
"document.imageBlock.url.placeholder": "Entrez l'URL de l'image",
"document.imageBlock.support": "La limite de taille d'image est de 5 Mo. Formats pris en charge : JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Image invalide",
"document.imageBlock.error.invalidImageSize": "La taille de l'image doit être inférieure à 5 Mo",
"document.imageBlock.error.invalidImageFormat": "Le format d'image n'est pas pris en charge. Formats pris en charge : JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "URL d'image non valide",
"document.codeBlock.language.label": "Langue",
"document.codeBlock.language.placeholder": "Choisir la langue",
"document.inlineLink.placeholder": "Coller ou saisir un lien",
"document.inlineLink.url.label": "URL du lien",
"document.inlineLink.url.placeholder": "Entrez l'URL du lien",
"document.inlineLink.title.label": "Titre du lien",
"document.inlineLink.title.placeholder": "Entrez le titre du lien",
"board.column.create_new_card": "Nouveau",
"board.menuName": "Conseil",
"board.referencedBoardPrefix": "Vue",
"calendar.menuName": "Calendrier",
"calendar.defaultNewCalendarTitle": "Sans titre",
"calendar.navigation.today": "Aujourd'hui",
"calendar.navigation.jumpToday": "Aller à Aujourd'hui",
"calendar.navigation.previousMonth": "Le mois précédent",
"calendar.navigation.nextMonth": "Le mois prochain",
"calendar.settings.showWeekNumbers": "Afficher les numéros de semaine",
"calendar.settings.showWeekends": "Afficher les week-ends",
"calendar.settings.firstDayOfWeek": "Commencer la semaine le",
"calendar.settings.layoutDateField": "Calendrier de mise en page par",
"calendar.settings.noDateTitle": "Pas de date",
"calendar.settings.noDateHint": "Les événements non planifiés s'afficheront ici",
"calendar.settings.clickToAdd": "Cliquez pour ajouter au calendrier",
"calendar.settings.name": "Disposition du calendrier",
"calendar.referencedCalendarPrefix": "Vue",
"errorDialog.title": "Erreur AppFlowy",
"errorDialog.howToFixFallback": "Nous sommes désolés pour le désagrément ! Soumettez un problème sur notre page GitHub qui décrit votre erreur.",
"errorDialog.github": "Afficher sur GitHub",
"search.label": "Recherche",
"search.placeholder.actions": "Actions de recherche...",
"message.copy.success": "Copié !",
"message.copy.fail": "Impossible de copier",
"blockActions": {
"addBelowTooltip": "Cliquez pour ajouter ci-dessous",
"addAboveCmd": "Alt+clic",
"addAboveMacCmd": "Option+clic",
"addAboveTooltip": "à ajouter au dessus"
},
"importPanel": {
"textAndMarkdown": "Texte et Markdown",
"documentFromV010": "Document de la v0.1.0",
"databaseFromV010": "Base de données à partir de la v0.1.0",
"csv": "CSV",
"database": "Base de données"
},
"notifications": {
"export": {
"markdown": "Note exportée vers Markdown",
"path": "Documents/fluide"
}
},
"grid": {
"deleteView": "Voulez-vous vraiment supprimer cette vue ?",
"createView": "Nouveau",
"settings": {
"filter": "Filtre",
"sort": "Trier",
"sortBy": "Trier par",
"properties": "Propriétés",
"reorderPropertiesTooltip": "Faites glisser pour réorganiser les propriétés",
"group": "Groupe",
"addFilter": "Ajouter un filtre",
"deleteFilter": "Supprimer le filtre",
"filterBy": "Filtrer par...",
"typeAValue": "Tapez une valeur...",
"layout": "Mise en page",
"databaseLayout": "Mise en page"
},
"textFilter": {
"contains": "Contient",
"doesNotContain": "Ne contient pas",
"endsWith": "Se termine par",
"startWith": "Commence avec",
"is": "Est",
"isNot": "N'est pas",
"isEmpty": "Est vide",
"isNotEmpty": "N'est pas vide",
"choicechipPrefix": {
"isNot": "Pas",
"startWith": "Commence avec",
"endWith": "Se termine par",
"isEmpty": "est vide",
"isNotEmpty": "n'est pas vide"
}
},
"checkboxFilter": {
"isChecked": "Vérifié",
"isUnchecked": "Décoché",
"choicechipPrefix": {
"is": "est"
}
},
"checklistFilter": {
"isComplete": "est complet",
"isIncomplted": "est incomplet"
},
"singleSelectOptionFilter": {
"is": "Est",
"isNot": "N'est pas",
"isEmpty": "Est vide",
"isNotEmpty": "N'est pas vide"
},
"multiSelectOptionFilter": {
"contains": "Contient",
"doesNotContain": "Ne contient pas",
"isEmpty": "Est vide",
"isNotEmpty": "N'est pas vide"
},
"field": {
"hide": "Cacher",
"insertLeft": "Insérer à gauche",
"insertRight": "Insérer à droite",
"duplicate": "Dupliquer",
"delete": "Supprimer",
"textFieldName": "Texte",
"checkboxFieldName": "Case à cocher",
"dateFieldName": "Date",
"updatedAtFieldName": "Heure de la dernière modification",
"createdAtFieldName": "Temps créé",
"numberFieldName": "Nombres",
"singleSelectFieldName": "Sélectionner",
"multiSelectFieldName": "Sélection multiple",
"urlFieldName": "URL",
"checklistFieldName": "Liste de contrôle",
"numberFormat": "Format de nombre",
"dateFormat": "Format de date",
"includeTime": "Inclure le temps",
"dateFormatFriendly": "Année mois jour",
"dateFormatISO": "Année mois jour",
"dateFormatLocal": "Année mois jour",
"dateFormatUS": "Année mois jour",
"dateFormatDayMonthYear": "Jour mois année",
"timeFormat": "Format de l'heure",
"invalidTimeFormat": "Format invalide",
"timeFormatTwelveHour": "12 heures",
"timeFormatTwentyFourHour": "24 heures",
"addSelectOption": "Ajouter une option",
"optionTitle": "Choix",
"addOption": "Ajouter une option",
"editProperty": "Modifier la propriété",
"newProperty": "Nouvelle propriété",
"deleteFieldPromptMessage": "Es-tu sûr? Cette propriété sera supprimée"
},
"sort": {
"ascending": "Ascendant",
"descending": "Descendant",
"deleteSort": "Supprimer le tri",
"addSort": "Ajouter un tri"
},
"row": {
"duplicate": "Dupliquer",
"delete": "Supprimer",
"textPlaceholder": "Vide",
"copyProperty": "Propriété copiée dans le presse-papiers",
"count": "Compter",
"newRow": "Nouvelle ligne",
"action": "Action"
},
"selectOption": {
"create": "Créer",
"purpleColor": "Violet",
"pinkColor": "Rose",
"lightPinkColor": "Rose clair",
"orangeColor": "Orange",
"yellowColor": "Jaune",
"limeColor": "Chaux",
"greenColor": "Vert",
"aquaColor": "Aqua",
"blueColor": "Bleu",
"deleteTag": "Supprimer la balise",
"colorPanelTitle": "Couleurs",
"panelTitle": "Sélectionnez une option ou créez-en une",
"searchOption": "Rechercher une option"
},
"checklist": {
"panelTitle": "Ajouter un article"
},
"menuName": "Grille",
"referencedGridPrefix": "Vue"
},
"document": {
"menuName": "Document",
"date": {
"timeHintTextInTwelveHour": "13h00",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Sélectionnez un tableau à lier",
"createANewBoard": "Créer un nouveau tableau"
},
"grid": {
"selectAGridToLinkTo": "Sélectionnez une grille à lier",
"createANewGrid": "Créer une nouvelle Grille"
},
"calendar": {
"selectACalendarToLinkTo": "Sélectionnez un calendrier à lier",
"createANewCalendar": "Créer un nouveau calendrier"
}
},
"selectionMenu": {
"outline": "Contour"
},
"plugins": {
"referencedBoard": "Conseil référencé",
"referencedGrid": "Grille référencée",
"referencedCalendar": "Calendrier référencé",
"autoGeneratorMenuItemName": "Rédacteur OpenAI",
"autoGeneratorTitleName": "OpenAI : Demandez à l'IA d'écrire n'importe quoi...",
"autoGeneratorLearnMore": "Apprendre encore plus",
"autoGeneratorGenerate": "Générer",
"autoGeneratorHintText": "Demandez à OpenAI...",
"autoGeneratorCantGetOpenAIKey": "Impossible d'obtenir la clé OpenAI",
"autoGeneratorRewrite": "Récrire",
"smartEdit": "Assistants IA",
"openAI": "OpenAI",
"smartEditFixSpelling": "Corriger l'orthographe",
"warning": "⚠️ Les réponses de l'IA peuvent être inexactes ou trompeuses.",
"smartEditSummarize": "Résumer",
"smartEditImproveWriting": "Améliorer l'écriture",
"smartEditMakeLonger": "Rallonger",
"smartEditCouldNotFetchResult": "Impossible de récupérer le résultat d'OpenAI",
"smartEditCouldNotFetchKey": "Impossible de récupérer la clé OpenAI",
"smartEditDisabled": "Connectez OpenAI dans les paramètres",
"discardResponse": "Voulez-vous supprimer les réponses de l'IA ?",
"createInlineMathEquation": "Créer une équation",
"toggleList": "Basculer la liste",
"cover": {
"changeCover": "Changer de couverture",
"colors": "Couleurs",
"images": "Images",
"clearAll": "Tout effacer",
"abstract": "Abstrait",
"addCover": "Ajouter une couverture",
"addLocalImage": "Ajouter une image locale",
"invalidImageUrl": "URL d'image non valide",
"failedToAddImageToGallery": "Impossible d'ajouter l'image à la galerie",
"enterImageUrl": "Entrez l'URL de l'image",
"add": "Ajouter",
"back": "Dos",
"saveToGallery": "Sauvegarder dans la gallerie",
"removeIcon": "Supprimer l'icône",
"pasteImageUrl": "Coller l'URL de l'image",
"or": "OU",
"pickFromFiles": "Choisissez parmi les fichiers",
"couldNotFetchImage": "Impossible de récupérer l'image",
"imageSavingFailed": "Échec de l'enregistrement de l'image",
"addIcon": "Ajouter une icône",
"coverRemoveAlert": "Il sera retiré de la couverture après sa suppression.",
"alertDialogConfirmation": "Es-tu sur de vouloir continuer?"
},
"mathEquation": {
"addMathEquation": "Ajouter une équation mathématique",
"editMathEquation": "Modifier l'équation mathématique"
},
"optionAction": {
"click": "Cliquez sur",
"toOpenMenu": " pour ouvrir le menu",
"delete": "Supprimer",
"duplicate": "Dupliquer",
"turnInto": "Changer en",
"moveUp": "Déplacer vers le haut",
"moveDown": "Descendre",
"color": "Couleur",
"align": "Aligner",
"left": "Gauche",
"center": "Centre",
"right": "Droite",
"defaultColor": "Défaut"
},
"image": {
"copiedToPasteBoard": "Le lien de l'image a été copié dans le presse-papiers"
},
"outline": {
"addHeadingToCreateOutline": "Ajoutez des titres pour créer une table des matières."
}
},
"textBlock": {
"placeholder": "Tapez '/' pour les commandes"
},
"title": {
"placeholder": "Sans titre"
},
"imageBlock": {
"placeholder": "Cliquez pour ajouter une image",
"upload": {
"label": "Télécharger",
"placeholder": "Cliquez pour télécharger l'image"
},
"url": {
"label": "URL de l'image",
"placeholder": "Entrez l'URL de l'image"
},
"support": "La limite de taille d'image est de 5 Mo. Formats pris en charge : JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Image invalide",
"invalidImageSize": "La taille de l'image doit être inférieure à 5 Mo",
"invalidImageFormat": "Le format d'image n'est pas pris en charge. Formats pris en charge : JPEG, PNG, GIF, SVG",
"invalidImageUrl": "URL d'image non valide"
}
},
"codeBlock": {
"language": {
"label": "Langue",
"placeholder": "Choisir la langue"
}
},
"inlineLink": {
"placeholder": "Coller ou saisir un lien",
"url": {
"label": "URL du lien",
"placeholder": "Entrez l'URL du lien"
},
"title": {
"label": "Titre du lien",
"placeholder": "Entrez le titre du lien"
}
}
},
"board": {
"column": {
"create_new_card": "Nouveau"
},
"menuName": "Conseil",
"referencedBoardPrefix": "Vue"
},
"calendar": {
"menuName": "Calendrier",
"defaultNewCalendarTitle": "Sans titre",
"navigation": {
"today": "Aujourd'hui",
"jumpToday": "Aller à Aujourd'hui",
"previousMonth": "Le mois précédent",
"nextMonth": "Le mois prochain"
},
"settings": {
"showWeekNumbers": "Afficher les numéros de semaine",
"showWeekends": "Afficher les week-ends",
"firstDayOfWeek": "Commencer la semaine le",
"layoutDateField": "Calendrier de mise en page par",
"noDateTitle": "Pas de date",
"noDateHint": "Les événements non planifiés s'afficheront ici",
"clickToAdd": "Cliquez pour ajouter au calendrier",
"name": "Disposition du calendrier"
},
"referencedCalendarPrefix": "Vue"
},
"errorDialog": {
"title": "Erreur AppFlowy",
"howToFixFallback": "Nous sommes désolés pour le désagrément ! Soumettez un problème sur notre page GitHub qui décrit votre erreur.",
"github": "Afficher sur GitHub"
},
"search": {
"label": "Recherche",
"placeholder": {
"actions": "Actions de recherche..."
}
},
"message": {
"copy": {
"success": "Copié !",
"fail": "Impossible de copier"
}
},
"unSupportBlock": "La version actuelle ne prend pas en charge ce bloc.",
"views.deleteContentTitle": "Voulez-vous vraiment supprimer le {pageType} ?",
"views.deleteContentCaption": "si vous supprimez ce {pageType}, vous pouvez le restaurer à partir de la corbeille."
"views": {
"deleteContentTitle": "Voulez-vous vraiment supprimer le {pageType} ?",
"deleteContentCaption": "si vous supprimez ce {pageType}, vous pouvez le restaurer à partir de la corbeille."
}
}
+371 -273
View File
@@ -27,7 +27,8 @@
"passwordHint": "Mot de passe",
"dontHaveAnAccount": "Vous n'avez pas encore créé votre compte ?",
"repeatPasswordEmptyError": "Vous n'avez pas ressaisi votre mot de passe",
"unmatchedPasswordError": "Les deux mots de passe ne sont pas identiques"
"unmatchedPasswordError": "Les deux mots de passe ne sont pas identiques",
"loginAsGuestButtonText": "Commencer"
},
"workspace": {
"create": "Créer un espace de travail",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Renommer",
"delete": "Supprimer",
"duplicate": "Dupliquer"
"duplicate": "Dupliquer",
"openNewTab": "Ouvrir dans un nouvel onglet"
},
"blankPageTitle": "Page vierge",
"newPageText": "Nouvelle page",
@@ -55,6 +57,14 @@
"fileName": "Nom de fichier",
"lastModified": "Dernière modification",
"created": "Créé"
},
"confirmDeleteAll": {
"title": "Voulez-vous vraiment supprimer toutes les pages de la corbeille ?",
"caption": "Cette action ne peut pas être annulée."
},
"confirmRestoreAll": {
"title": "Êtes-vous sûr de vouloir restaurer toutes les pages dans la corbeille ?",
"caption": "Cette action ne peut pas être annulée."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Informations de Débogage",
"success": "Informations de Débogage copiées dans le presse-papiers !",
"fail": "Impossible de copier les informations de Débogage dans le presse-papiers"
}
},
"shortcuts": "Raccourcis",
"markdown": "Réduction",
"feedback": "Retour"
},
"menuAppHeader": {
"addPageTooltip": "Ajoutez rapidement une page à l'intérieur",
@@ -90,14 +103,21 @@
"inlineCode": "Code",
"quote": "Bloc de citation",
"header": "En-tête",
"highlight": "Surligner"
"highlight": "Surligner",
"color": "Couleur",
"addLink": "Ajouter un lien",
"link": "Lien"
},
"tooltip": {
"lightMode": "Passer en mode clair",
"darkMode": "Passer en mode sombre",
"openAsPage": "Ouvrir en tant que page",
"addNewRow": "Ajouter une ligne",
"openMenu": "Cliquer pour ouvrir le menu"
"openMenu": "Cliquer pour ouvrir le menu",
"dragRow": "Appuyez longuement pour réorganiser la ligne",
"viewDataBase": "Voir la base de données",
"referencePage": "Ce {nom} est référencé",
"addBlockBelow": "Ajouter un bloc ci-dessous"
},
"sideBar": {
"closeSidebar": "Fermer le menu latéral",
@@ -121,7 +141,21 @@
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"complete": "Achevé",
"save": "Enregistrer"
"save": "Enregistrer",
"Done": "Fait",
"generate": "Générer",
"esc": "ESC",
"keep": "Donjon",
"tryAgain": "Essayer à nouveau",
"discard": "Jeter",
"replace": "Remplacer",
"insertBelow": "Insérer ci-dessous",
"upload": "Télécharger",
"edit": "Modifier",
"delete": "Supprimer",
"duplicate": "Dupliquer",
"done": "Fait",
"putback": "Remettre"
},
"label": {
"welcome": "Bienvenue !",
@@ -149,7 +183,9 @@
"appearance": "Apparence",
"language": "Langue",
"user": "Utilisateur",
"open": "Ouvrir les paramètres"
"open": "Ouvrir les paramètres",
"files": "Des dossiers",
"supabaseSetting": "Paramètre Supbase"
},
"appearance": {
"themeMode": {
@@ -157,7 +193,66 @@
"light": "Mode clair",
"dark": "Mode sombre",
"system": "Adapt to System"
}
},
"fontFamily": {
"label": "Famille de polices",
"search": "Recherche"
},
"themeUpload": {
"button": "Télécharger",
"description": "Téléchargez votre propre thème AppFlowy en utilisant le bouton ci-dessous.",
"failure": "Le thème qui a été téléchargé avait un format non valide.",
"loading": "Veuillez patienter pendant que nous validons et téléchargeons votre thème...",
"uploadSuccess": "Votre thème a été téléchargé avec succès",
"deletionFailure": "Échec de la suppression du thème. Essayez de le supprimer manuellement.",
"filePickerDialogTitle": "Choisissez un fichier .flowy_plugin",
"urlUploadFailure": "Échec de l'ouverture de l'URL : {}"
},
"theme": "Thème",
"builtInsLabel": "Thèmes intégrés",
"pluginsLabel": "Plugins"
},
"files": {
"copy": "Copie",
"defaultLocation": "Lire les fichiers et l'emplacement de stockage des données",
"exportData": "Exportez vos données",
"doubleTapToCopy": "Appuyez deux fois pour copier le chemin",
"restoreLocation": "Restaurer le chemin par défaut d'AppFlowy",
"customizeLocation": "Ouvrir un autre dossier",
"restartApp": "Veuillez redémarrer l'application pour que les modifications prennent effet.",
"exportDatabase": "Exporter la base de données",
"selectFiles": "Sélectionnez les fichiers qui doivent être exportés",
"selectAll": "Tout sélectionner",
"deselectAll": "Tout déselectionner",
"createNewFolder": "Créer un nouveau dossier",
"createNewFolderDesc": "Dites-nous où vous souhaitez stocker vos données",
"defineWhereYourDataIsStored": "Définissez où vos données sont stockées",
"open": "Ouvrir",
"openFolder": "Ouvrir un dossier existant",
"openFolderDesc": "Lisez-le et écrivez-le dans votre dossier AppFlowy existant",
"folderHintText": "nom de dossier",
"location": "Création d'un nouveau dossier",
"locationDesc": "Choisissez un nom pour votre dossier de données AppFlowy",
"browser": "Parcourir",
"create": "Créer",
"set": "Ensemble",
"folderPath": "Chemin pour stocker votre dossier",
"locationCannotBeEmpty": "Le chemin ne peut pas être vide",
"pathCopiedSnackbar": "Chemin de stockage des fichiers copié dans le presse-papier !",
"changeLocationTooltips": "Changer le répertoire de données",
"change": "Changement",
"openLocationTooltips": "Ouvrir un autre répertoire de données",
"openCurrentDataFolder": "Ouvrir le répertoire de données actuel",
"recoverLocationTooltips": "Réinitialiser au répertoire de données par défaut d'AppFlowy",
"exportFileSuccess": "Exporter le fichier avec succès !",
"exportFileFail": "Échec de l'exportation du fichier !",
"export": "Exporter"
},
"user": {
"name": "Nom",
"icon": "Icône",
"selectAnIcon": "Sélectionnez une icône",
"pleaseInputYourOpenAIKey": "veuillez entrer votre clé OpenAI"
}
},
"grid": {
@@ -165,7 +260,16 @@
"filter": "Filtrer",
"sortBy": "Filtrer par",
"Properties": "Propriétés",
"group": "Groupe"
"group": "Groupe",
"sort": "Trier",
"properties": "Propriétés",
"reorderPropertiesTooltip": "Faites glisser pour réorganiser les propriétés",
"addFilter": "Ajouter un filtre",
"deleteFilter": "Supprimer le filtre",
"filterBy": "Filtrer par...",
"typeAValue": "Tapez une valeur...",
"layout": "Mise en page",
"databaseLayout": "Mise en page"
},
"field": {
"hide": "Cacher",
@@ -196,7 +300,11 @@
"addOption": "Ajouter une option",
"editProperty": "Modifier la propriété",
"newProperty": "Nouvelle colonne",
"deleteFieldPromptMessage": "Vous voulez supprimer cette propriété ?"
"deleteFieldPromptMessage": "Vous voulez supprimer cette propriété ?",
"updatedAtFieldName": "Heure de la dernière modification",
"createdAtFieldName": "Temps créé",
"checklistFieldName": "Liste de contrôle",
"dateFormatDayMonthYear": "Jour mois année"
},
"row": {
"duplicate": "Dupliquer",
@@ -204,7 +312,8 @@
"textPlaceholder": "Vide",
"copyProperty": "Copie de la propriété dans le presse-papiers",
"count": "Nombre",
"newRow": "Nouvelle ligne"
"newRow": "Nouvelle ligne",
"action": "Action"
},
"selectOption": {
"create": "Créer",
@@ -222,281 +331,270 @@
"panelTitle": "Sélectionnez une option ou créez-en une",
"searchOption": "Rechercher une option"
},
"menuName": "Grille"
"menuName": "Grille",
"deleteView": "Voulez-vous vraiment supprimer cette vue ?",
"createView": "Nouveau",
"textFilter": {
"contains": "Contient",
"doesNotContain": "Ne contient pas",
"endsWith": "Se termine par",
"startWith": "Commence avec",
"is": "Est",
"isNot": "N'est pas",
"isEmpty": "Est vide",
"isNotEmpty": "N'est pas vide",
"choicechipPrefix": {
"isNot": "Pas",
"startWith": "Commence avec",
"endWith": "Se termine par",
"isEmpty": "est vide",
"isNotEmpty": "n'est pas vide"
}
},
"checkboxFilter": {
"isChecked": "Vérifié",
"isUnchecked": "Décoché",
"choicechipPrefix": {
"is": "est"
}
},
"checklistFilter": {
"isComplete": "est complet",
"isIncomplted": "est incomplet"
},
"singleSelectOptionFilter": {
"is": "Est",
"isNot": "N'est pas",
"isEmpty": "Est vide",
"isNotEmpty": "N'est pas vide"
},
"multiSelectOptionFilter": {
"contains": "Contient",
"doesNotContain": "Ne contient pas",
"isEmpty": "Est vide",
"isNotEmpty": "N'est pas vide"
},
"sort": {
"ascending": "Ascendant",
"descending": "Descendant",
"deleteSort": "Supprimer le tri",
"addSort": "Ajouter un tri"
},
"checklist": {
"panelTitle": "Ajouter un élément"
},
"referencedGridPrefix": "Vue"
},
"document": {
"menuName": "Document",
"date": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Sélectionnez un tableau à lier",
"createANewBoard": "Créer un nouveau tableau"
},
"grid": {
"selectAGridToLinkTo": "Sélectionnez une grille à lier",
"createANewGrid": "Créer une nouvelle Grille"
},
"calendar": {
"selectACalendarToLinkTo": "Sélectionnez un calendrier à lier",
"createANewCalendar": "Créer un nouveau calendrier"
}
},
"selectionMenu": {
"outline": "Contour"
},
"plugins": {
"referencedBoard": "Conseil référencé",
"referencedGrid": "Grille référencée",
"referencedCalendar": "Calendrier référencé",
"autoGeneratorMenuItemName": "Rédacteur OpenAI",
"autoGeneratorTitleName": "OpenAI : Demandez à l'IA d'écrire n'importe quoi...",
"autoGeneratorLearnMore": "Apprendre encore plus",
"autoGeneratorGenerate": "Générer",
"autoGeneratorHintText": "Demandez à OpenAI...",
"autoGeneratorCantGetOpenAIKey": "Impossible d'obtenir la clé OpenAI",
"autoGeneratorRewrite": "Récrire",
"smartEdit": "Assistants IA",
"openAI": "OpenAI",
"smartEditFixSpelling": "Corriger l'orthographe",
"warning": "⚠️ Les réponses de l'IA peuvent être inexactes ou trompeuses.",
"smartEditSummarize": "Résumer",
"smartEditImproveWriting": "Améliorer l'écriture",
"smartEditMakeLonger": "Rallonger",
"smartEditCouldNotFetchResult": "Impossible de récupérer le résultat d'OpenAI",
"smartEditCouldNotFetchKey": "Impossible de récupérer la clé OpenAI",
"smartEditDisabled": "Connectez OpenAI dans les paramètres",
"discardResponse": "Voulez-vous supprimer les réponses de l'IA ?",
"createInlineMathEquation": "Créer une équation",
"toggleList": "Basculer la liste",
"cover": {
"changeCover": "Changer de couverture",
"colors": "Couleurs",
"images": "Images",
"clearAll": "Tout effacer",
"abstract": "Abstrait",
"addCover": "Ajouter une couverture",
"addLocalImage": "Ajouter une image locale",
"invalidImageUrl": "URL d'image non valide",
"failedToAddImageToGallery": "Impossible d'ajouter l'image à la galerie",
"enterImageUrl": "Entrez l'URL de l'image",
"add": "Ajouter",
"back": "Dos",
"saveToGallery": "Sauvegarder dans la gallerie",
"removeIcon": "Supprimer l'icône",
"pasteImageUrl": "Coller l'URL de l'image",
"or": "OU",
"pickFromFiles": "Choisissez parmi les fichiers",
"couldNotFetchImage": "Impossible de récupérer l'image",
"imageSavingFailed": "Échec de l'enregistrement de l'image",
"addIcon": "Ajouter une icône",
"coverRemoveAlert": "Il sera retiré de la couverture après sa suppression.",
"alertDialogConfirmation": "Es-tu sur de vouloir continuer?"
},
"mathEquation": {
"addMathEquation": "Ajouter une équation mathématique",
"editMathEquation": "Modifier l'équation mathématique"
},
"optionAction": {
"click": "Cliquez sur",
"toOpenMenu": " pour ouvrir le menu",
"delete": "Supprimer",
"duplicate": "Dupliquer",
"turnInto": "Changer en",
"moveUp": "Déplacer vers le haut",
"moveDown": "Descendre",
"color": "Couleur",
"align": "Aligner",
"left": "Gauche",
"center": "Centre",
"right": "Droite",
"defaultColor": "Défaut"
},
"image": {
"copiedToPasteBoard": "Le lien de l'image a été copié dans le presse-papiers"
},
"outline": {
"addHeadingToCreateOutline": "Ajoutez des titres pour créer une table des matières."
}
},
"textBlock": {
"placeholder": "Tapez '/' pour les commandes"
},
"title": {
"placeholder": "Sans titre"
},
"imageBlock": {
"placeholder": "Cliquez pour ajouter une image",
"upload": {
"label": "Télécharger",
"placeholder": "Cliquez pour télécharger l'image"
},
"url": {
"label": "URL de l'image",
"placeholder": "Entrez l'URL de l'image"
},
"support": "La limite de taille d'image est de 5 Mo. Formats pris en charge : JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Image invalide",
"invalidImageSize": "La taille de l'image doit être inférieure à 5 Mo",
"invalidImageFormat": "Le format d'image n'est pas pris en charge. Formats pris en charge : JPEG, PNG, GIF, SVG",
"invalidImageUrl": "URL d'image non valide"
}
},
"codeBlock": {
"language": {
"label": "Langue",
"placeholder": "Choisir la langue"
}
},
"inlineLink": {
"placeholder": "Coller ou saisir un lien",
"url": {
"label": "URL du lien",
"placeholder": "Entrez l'URL du lien"
},
"title": {
"label": "Titre du lien",
"placeholder": "Entrez le titre du lien"
}
}
},
"board": {
"column": {
"create_new_card": "Nouveau"
}
},
"menuName": "Conseil",
"referencedBoardPrefix": "Vue"
},
"moreAction": {
"small": "petit",
"medium": "moyen",
"large": "grand",
"fontSize": "Taille de police",
"import": "Importer",
"moreOptions": "Plus d'options"
},
"moreAction.small": "petit",
"youCanAlso": "Vous pouvez aussi",
"and": "et",
"blockActions.addBelowTooltip": "Cliquez pour ajouter ci-dessous",
"blockActions.addAboveCmd": "Alt+clic",
"blockActions.addAboveMacCmd": "Option+clic",
"blockActions.addAboveTooltip": "à ajouter au dessus",
"signIn.loginAsGuestButtonText": "Commencer",
"moreAction.medium": "moyen",
"moreAction.large": "grand",
"moreAction.fontSize": "Taille de police",
"moreAction.import": "Importer",
"moreAction.moreOptions": "Plus d'options",
"importPanel.textAndMarkdown": "Texte et Markdown",
"importPanel.documentFromV010": "Document de la v0.1.0",
"importPanel.databaseFromV010": "Base de données à partir de la v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Base de données",
"disclosureAction.openNewTab": "Ouvrir dans un nouvel onglet",
"trash.confirmDeleteAll.title": "Voulez-vous vraiment supprimer toutes les pages de la corbeille ?",
"trash.confirmDeleteAll.caption": "Cette action ne peut pas être annulée.",
"trash.confirmRestoreAll.title": "Êtes-vous sûr de vouloir restaurer toutes les pages dans la corbeille ?",
"trash.confirmRestoreAll.caption": "Cette action ne peut pas être annulée.",
"questionBubble.shortcuts": "Raccourcis",
"questionBubble.markdown": "Réduction",
"questionBubble.feedback": "Retour",
"toolbar.color": "Couleur",
"toolbar.addLink": "Ajouter un lien",
"toolbar.link": "Lien",
"tooltip.dragRow": "Appuyez longuement pour réorganiser la ligne",
"tooltip.viewDataBase": "Voir la base de données",
"tooltip.referencePage": "Ce {nom} est référencé",
"tooltip.addBlockBelow": "Ajouter un bloc ci-dessous",
"button.Done": "Fait",
"button.generate": "Générer",
"button.esc": "ESC",
"button.keep": "Donjon",
"button.tryAgain": "Essayer à nouveau",
"button.discard": "Jeter",
"button.replace": "Remplacer",
"button.insertBelow": "Insérer ci-dessous",
"button.upload": "Télécharger",
"button.edit": "Modifier",
"button.delete": "Supprimer",
"button.duplicate": "Dupliquer",
"button.done": "Fait",
"button.putback": "Remettre",
"settings.menu.files": "Des dossiers",
"settings.menu.supabaseSetting": "Paramètre Supbase",
"settings.appearance.fontFamily.label": "Famille de polices",
"settings.appearance.fontFamily.search": "Recherche",
"settings.appearance.themeUpload.button": "Télécharger",
"settings.appearance.themeUpload.description": "Téléchargez votre propre thème AppFlowy en utilisant le bouton ci-dessous.",
"settings.appearance.themeUpload.failure": "Le thème qui a été téléchargé avait un format non valide.",
"settings.appearance.themeUpload.loading": "Veuillez patienter pendant que nous validons et téléchargeons votre thème...",
"settings.appearance.themeUpload.uploadSuccess": "Votre thème a été téléchargé avec succès",
"settings.appearance.themeUpload.deletionFailure": "Échec de la suppression du thème. Essayez de le supprimer manuellement.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Choisissez un fichier .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "Échec de l'ouverture de l'URL : {}",
"settings.appearance.theme": "Thème",
"settings.appearance.builtInsLabel": "Thèmes intégrés",
"settings.appearance.pluginsLabel": "Plugins",
"settings.files.copy": "Copie",
"settings.files.defaultLocation": "Lire les fichiers et l'emplacement de stockage des données",
"settings.files.exportData": "Exportez vos données",
"settings.files.doubleTapToCopy": "Appuyez deux fois pour copier le chemin",
"settings.files.restoreLocation": "Restaurer le chemin par défaut d'AppFlowy",
"settings.files.customizeLocation": "Ouvrir un autre dossier",
"settings.files.restartApp": "Veuillez redémarrer l'application pour que les modifications prennent effet.",
"settings.files.exportDatabase": "Exporter la base de données",
"settings.files.selectFiles": "Sélectionnez les fichiers qui doivent être exportés",
"settings.files.selectAll": "Tout sélectionner",
"settings.files.deselectAll": "Tout déselectionner",
"settings.files.createNewFolder": "Créer un nouveau dossier",
"settings.files.createNewFolderDesc": "Dites-nous où vous souhaitez stocker vos données",
"settings.files.defineWhereYourDataIsStored": "Définissez où vos données sont stockées",
"settings.files.open": "Ouvrir",
"settings.files.openFolder": "Ouvrir un dossier existant",
"settings.files.openFolderDesc": "Lisez-le et écrivez-le dans votre dossier AppFlowy existant",
"settings.files.folderHintText": "nom de dossier",
"settings.files.location": "Création d'un nouveau dossier",
"settings.files.locationDesc": "Choisissez un nom pour votre dossier de données AppFlowy",
"settings.files.browser": "Parcourir",
"settings.files.create": "Créer",
"settings.files.set": "Ensemble",
"settings.files.folderPath": "Chemin pour stocker votre dossier",
"settings.files.locationCannotBeEmpty": "Le chemin ne peut pas être vide",
"settings.files.pathCopiedSnackbar": "Chemin de stockage des fichiers copié dans le presse-papier !",
"settings.files.changeLocationTooltips": "Changer le répertoire de données",
"settings.files.change": "Changement",
"settings.files.openLocationTooltips": "Ouvrir un autre répertoire de données",
"settings.files.openCurrentDataFolder": "Ouvrir le répertoire de données actuel",
"settings.files.recoverLocationTooltips": "Réinitialiser au répertoire de données par défaut d'AppFlowy",
"settings.files.exportFileSuccess": "Exporter le fichier avec succès !",
"settings.files.exportFileFail": "Échec de l'exportation du fichier !",
"settings.files.export": "Exporter",
"settings.user.name": "Nom",
"settings.user.icon": "Icône",
"settings.user.selectAnIcon": "Sélectionnez une icône",
"settings.user.pleaseInputYourOpenAIKey": "veuillez entrer votre clé OpenAI",
"grid.deleteView": "Voulez-vous vraiment supprimer cette vue ?",
"grid.createView": "Nouveau",
"grid.settings.sort": "Trier",
"grid.settings.properties": "Propriétés",
"grid.settings.reorderPropertiesTooltip": "Faites glisser pour réorganiser les propriétés",
"grid.settings.addFilter": "Ajouter un filtre",
"grid.settings.deleteFilter": "Supprimer le filtre",
"grid.settings.filterBy": "Filtrer par...",
"grid.settings.typeAValue": "Tapez une valeur...",
"grid.settings.layout": "Mise en page",
"grid.settings.databaseLayout": "Mise en page",
"grid.textFilter.contains": "Contient",
"grid.textFilter.doesNotContain": "Ne contient pas",
"grid.textFilter.endsWith": "Se termine par",
"grid.textFilter.startWith": "Commence avec",
"grid.textFilter.is": "Est",
"grid.textFilter.isNot": "N'est pas",
"grid.textFilter.isEmpty": "Est vide",
"grid.textFilter.isNotEmpty": "N'est pas vide",
"grid.textFilter.choicechipPrefix.isNot": "Pas",
"grid.textFilter.choicechipPrefix.startWith": "Commence avec",
"grid.textFilter.choicechipPrefix.endWith": "Se termine par",
"grid.textFilter.choicechipPrefix.isEmpty": "est vide",
"grid.textFilter.choicechipPrefix.isNotEmpty": "n'est pas vide",
"grid.checkboxFilter.isChecked": "Vérifié",
"grid.checkboxFilter.isUnchecked": "Décoché",
"grid.checkboxFilter.choicechipPrefix.is": "est",
"grid.checklistFilter.isComplete": "est complet",
"grid.checklistFilter.isIncomplted": "est incomplet",
"grid.singleSelectOptionFilter.is": "Est",
"grid.singleSelectOptionFilter.isNot": "N'est pas",
"grid.singleSelectOptionFilter.isEmpty": "Est vide",
"grid.singleSelectOptionFilter.isNotEmpty": "N'est pas vide",
"grid.multiSelectOptionFilter.contains": "Contient",
"grid.multiSelectOptionFilter.doesNotContain": "Ne contient pas",
"grid.multiSelectOptionFilter.isEmpty": "Est vide",
"grid.multiSelectOptionFilter.isNotEmpty": "N'est pas vide",
"grid.field.updatedAtFieldName": "Heure de la dernière modification",
"grid.field.createdAtFieldName": "Temps créé",
"grid.field.checklistFieldName": "Liste de contrôle",
"grid.field.dateFormatDayMonthYear": "Jour mois année",
"grid.sort.ascending": "Ascendant",
"grid.sort.descending": "Descendant",
"grid.sort.deleteSort": "Supprimer le tri",
"grid.sort.addSort": "Ajouter un tri",
"grid.row.action": "Action",
"grid.checklist.panelTitle": "Ajouter un élément",
"grid.referencedGridPrefix": "Vue",
"document.slashMenu.board.selectABoardToLinkTo": "Sélectionnez un tableau à lier",
"document.slashMenu.board.createANewBoard": "Créer un nouveau tableau",
"document.slashMenu.grid.selectAGridToLinkTo": "Sélectionnez une grille à lier",
"document.slashMenu.grid.createANewGrid": "Créer une nouvelle Grille",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Sélectionnez un calendrier à lier",
"document.slashMenu.calendar.createANewCalendar": "Créer un nouveau calendrier",
"document.selectionMenu.outline": "Contour",
"document.plugins.referencedBoard": "Conseil référencé",
"document.plugins.referencedGrid": "Grille référencée",
"document.plugins.referencedCalendar": "Calendrier référencé",
"document.plugins.autoGeneratorMenuItemName": "Rédacteur OpenAI",
"document.plugins.autoGeneratorTitleName": "OpenAI : Demandez à l'IA d'écrire n'importe quoi...",
"document.plugins.autoGeneratorLearnMore": "Apprendre encore plus",
"document.plugins.autoGeneratorGenerate": "Générer",
"document.plugins.autoGeneratorHintText": "Demandez à OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Impossible d'obtenir la clé OpenAI",
"document.plugins.autoGeneratorRewrite": "Récrire",
"document.plugins.smartEdit": "Assistants IA",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Corriger l'orthographe",
"document.plugins.warning": "⚠️ Les réponses de l'IA peuvent être inexactes ou trompeuses.",
"document.plugins.smartEditSummarize": "Résumer",
"document.plugins.smartEditImproveWriting": "Améliorer l'écriture",
"document.plugins.smartEditMakeLonger": "Rallonger",
"document.plugins.smartEditCouldNotFetchResult": "Impossible de récupérer le résultat d'OpenAI",
"document.plugins.smartEditCouldNotFetchKey": "Impossible de récupérer la clé OpenAI",
"document.plugins.smartEditDisabled": "Connectez OpenAI dans les paramètres",
"document.plugins.discardResponse": "Voulez-vous supprimer les réponses de l'IA ?",
"document.plugins.createInlineMathEquation": "Créer une équation",
"document.plugins.toggleList": "Basculer la liste",
"document.plugins.cover.changeCover": "Changer de couverture",
"document.plugins.cover.colors": "Couleurs",
"document.plugins.cover.images": "Images",
"document.plugins.cover.clearAll": "Tout effacer",
"document.plugins.cover.abstract": "Abstrait",
"document.plugins.cover.addCover": "Ajouter une couverture",
"document.plugins.cover.addLocalImage": "Ajouter une image locale",
"document.plugins.cover.invalidImageUrl": "URL d'image non valide",
"document.plugins.cover.failedToAddImageToGallery": "Impossible d'ajouter l'image à la galerie",
"document.plugins.cover.enterImageUrl": "Entrez l'URL de l'image",
"document.plugins.cover.add": "Ajouter",
"document.plugins.cover.back": "Dos",
"document.plugins.cover.saveToGallery": "Sauvegarder dans la gallerie",
"document.plugins.cover.removeIcon": "Supprimer l'icône",
"document.plugins.cover.pasteImageUrl": "Coller l'URL de l'image",
"document.plugins.cover.or": "OU",
"document.plugins.cover.pickFromFiles": "Choisissez parmi les fichiers",
"document.plugins.cover.couldNotFetchImage": "Impossible de récupérer l'image",
"document.plugins.cover.imageSavingFailed": "Échec de l'enregistrement de l'image",
"document.plugins.cover.addIcon": "Ajouter une icône",
"document.plugins.cover.coverRemoveAlert": "Il sera retiré de la couverture après sa suppression.",
"document.plugins.cover.alertDialogConfirmation": "Es-tu sur de vouloir continuer?",
"document.plugins.mathEquation.addMathEquation": "Ajouter une équation mathématique",
"document.plugins.mathEquation.editMathEquation": "Modifier l'équation mathématique",
"document.plugins.optionAction.click": "Cliquez sur",
"document.plugins.optionAction.toOpenMenu": " pour ouvrir le menu",
"document.plugins.optionAction.delete": "Supprimer",
"document.plugins.optionAction.duplicate": "Dupliquer",
"document.plugins.optionAction.turnInto": "Changer en",
"document.plugins.optionAction.moveUp": "Déplacer vers le haut",
"document.plugins.optionAction.moveDown": "Descendre",
"document.plugins.optionAction.color": "Couleur",
"document.plugins.optionAction.align": "Aligner",
"document.plugins.optionAction.left": "Gauche",
"document.plugins.optionAction.center": "Centre",
"document.plugins.optionAction.right": "Droite",
"document.plugins.optionAction.defaultColor": "Défaut",
"document.plugins.image.copiedToPasteBoard": "Le lien de l'image a été copié dans le presse-papiers",
"document.plugins.outline.addHeadingToCreateOutline": "Ajoutez des titres pour créer une table des matières.",
"document.textBlock.placeholder": "Tapez '/' pour les commandes",
"document.title.placeholder": "Sans titre",
"document.imageBlock.placeholder": "Cliquez pour ajouter une image",
"document.imageBlock.upload.label": "Télécharger",
"document.imageBlock.upload.placeholder": "Cliquez pour télécharger l'image",
"document.imageBlock.url.label": "URL de l'image",
"document.imageBlock.url.placeholder": "Entrez l'URL de l'image",
"document.imageBlock.support": "La limite de taille d'image est de 5 Mo. Formats pris en charge : JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Image invalide",
"document.imageBlock.error.invalidImageSize": "La taille de l'image doit être inférieure à 5 Mo",
"document.imageBlock.error.invalidImageFormat": "Le format d'image n'est pas pris en charge. Formats pris en charge : JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "URL d'image non valide",
"document.codeBlock.language.label": "Langue",
"document.codeBlock.language.placeholder": "Choisir la langue",
"document.inlineLink.placeholder": "Coller ou saisir un lien",
"document.inlineLink.url.label": "URL du lien",
"document.inlineLink.url.placeholder": "Entrez l'URL du lien",
"document.inlineLink.title.label": "Titre du lien",
"document.inlineLink.title.placeholder": "Entrez le titre du lien",
"board.menuName": "Conseil",
"board.referencedBoardPrefix": "Vue",
"calendar.menuName": "Calendrier",
"calendar.defaultNewCalendarTitle": "Sans titre",
"calendar.navigation.today": "Aujourd'hui",
"calendar.navigation.jumpToday": "Aller à aujourd'hui",
"calendar.navigation.previousMonth": "Le mois précédent",
"calendar.navigation.nextMonth": "Le mois prochain",
"calendar.settings.showWeekNumbers": "Afficher les numéros de semaine",
"calendar.settings.showWeekends": "Afficher les week-ends",
"calendar.settings.firstDayOfWeek": "Commencer la semaine le",
"calendar.settings.layoutDateField": "Calendrier de mise en page par",
"calendar.settings.noDateTitle": "Pas de date",
"calendar.settings.noDateHint": "Les événements non planifiés s'afficheront ici",
"calendar.settings.clickToAdd": "Cliquez pour ajouter au calendrier",
"calendar.settings.name": "Disposition du calendrier",
"calendar.referencedCalendarPrefix": "Vue",
"errorDialog.title": "Erreur AppFlowy",
"errorDialog.howToFixFallback": "Nous sommes désolés pour le désagrément ! Soumettez un problème sur notre page GitHub qui décrit votre erreur.",
"errorDialog.github": "Afficher sur GitHub",
"search.label": "Recherche",
"search.placeholder.actions": "Actions de recherche...",
"message.copy.success": "Copié !",
"message.copy.fail": "Impossible de copier",
"blockActions": {
"addBelowTooltip": "Cliquez pour ajouter ci-dessous",
"addAboveCmd": "Alt+clic",
"addAboveMacCmd": "Option+clic",
"addAboveTooltip": "à ajouter au dessus"
},
"importPanel": {
"textAndMarkdown": "Texte et Markdown",
"documentFromV010": "Document de la v0.1.0",
"databaseFromV010": "Base de données à partir de la v0.1.0",
"csv": "CSV",
"database": "Base de données"
},
"calendar": {
"menuName": "Calendrier",
"defaultNewCalendarTitle": "Sans titre",
"navigation": {
"today": "Aujourd'hui",
"jumpToday": "Aller à aujourd'hui",
"previousMonth": "Le mois précédent",
"nextMonth": "Le mois prochain"
},
"settings": {
"showWeekNumbers": "Afficher les numéros de semaine",
"showWeekends": "Afficher les week-ends",
"firstDayOfWeek": "Commencer la semaine le",
"layoutDateField": "Calendrier de mise en page par",
"noDateTitle": "Pas de date",
"noDateHint": "Les événements non planifiés s'afficheront ici",
"clickToAdd": "Cliquez pour ajouter au calendrier",
"name": "Disposition du calendrier"
},
"referencedCalendarPrefix": "Vue"
},
"errorDialog": {
"title": "Erreur AppFlowy",
"howToFixFallback": "Nous sommes désolés pour le désagrément ! Soumettez un problème sur notre page GitHub qui décrit votre erreur.",
"github": "Afficher sur GitHub"
},
"search": {
"label": "Recherche",
"placeholder": {
"actions": "Actions de recherche..."
}
},
"message": {
"copy": {
"success": "Copié !",
"fail": "Impossible de copier"
}
},
"unSupportBlock": "La version actuelle ne prend pas en charge ce bloc.",
"views.deleteContentTitle": "Voulez-vous vraiment supprimer le {pageType} ?",
"views.deleteContentCaption": "si vous supprimez ce {pageType}, vous pouvez le restaurer à partir de la corbeille."
"views": {
"deleteContentTitle": "Voulez-vous vraiment supprimer le {pageType} ?",
"deleteContentCaption": "si vous supprimez ce {pageType}, vous pouvez le restaurer à partir de la corbeille."
}
}
+451 -331
View File
@@ -27,7 +27,8 @@
"passwordHint": "Jelszó",
"dontHaveAnAccount": "Még nincs fiókod?",
"repeatPasswordEmptyError": "A jelszó megerősítése nem lehet üres",
"unmatchedPasswordError": "A jelszavak nem egyeznek"
"unmatchedPasswordError": "A jelszavak nem egyeznek",
"loginAsGuestButtonText": "Fogj neki"
},
"workspace": {
"create": "Új munkaterület létrehozása",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Átnevezés",
"delete": "Törlés",
"duplicate": "Duplikálás"
"duplicate": "Duplikálás",
"openNewTab": "Nyissa meg egy új lapon"
},
"blankPageTitle": "Üres oldal",
"newPageText": "Új oldal",
@@ -55,6 +57,14 @@
"fileName": "Fájlnév",
"lastModified": "Utoljára módosítva",
"created": "Létrehozva"
},
"confirmDeleteAll": {
"title": "Biztosan törli a kukában lévő összes oldalt?",
"caption": "Ez a művelet nem visszavonható."
},
"confirmRestoreAll": {
"title": "Biztosan visszaállítja a kukában lévő összes oldalt?",
"caption": "Ez a művelet nem visszavonható."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Debug Információ",
"success": "Debug információ a vágólapra másolva",
"fail": "A Debug információ nem másolható a vágólapra"
}
},
"shortcuts": "Parancsikonok",
"markdown": "Árleszállítás",
"feedback": "Visszacsatolás"
},
"menuAppHeader": {
"addPageTooltip": "Belső oldal hozzáadása",
@@ -90,11 +103,21 @@
"inlineCode": "Inline kód",
"quote": "Idézet",
"header": "Címsor",
"highlight": "Kiemelés"
"highlight": "Kiemelés",
"color": "Szín",
"addLink": "Link hozzáadása",
"link": "Link"
},
"tooltip": {
"lightMode": "Világos mód",
"darkMode": "Éjjeli mód"
"darkMode": "Éjjeli mód",
"openAsPage": "Megnyitás oldalként",
"addNewRow": "Új sor hozzáadása",
"openMenu": "Kattintson a menü megnyitásához",
"dragRow": "Nyomja meg hosszan a sor átrendezéséhez",
"viewDataBase": "Adatbázis megtekintése",
"referencePage": "Erre a(z) {name} címre hivatkoznak",
"addBlockBelow": "Adjon hozzá egy blokkot alább"
},
"contactsPage": {
"title": "Kontaktok",
@@ -108,7 +131,21 @@
"signIn": "Bejelentkezés",
"signOut": "Kijelentkezés",
"complete": "Kész",
"save": "Mentés"
"save": "Mentés",
"Done": "Kész",
"generate": "generál",
"esc": "KILÉPÉS",
"keep": "Tart",
"tryAgain": "Próbáld újra",
"discard": "Eldobni",
"replace": "Cserélje ki",
"insertBelow": "Beszúrás alább",
"upload": "Feltöltés",
"edit": "Szerkesztés",
"delete": "Töröl",
"duplicate": "Másolat",
"done": "Kész",
"putback": "Visszatesz"
},
"label": {
"welcome": "Üdvözlünk!",
@@ -135,7 +172,10 @@
"menu": {
"appearance": "Megjelenés",
"language": "Nyelv",
"open": "Beállítások megnyitása"
"open": "Beállítások megnyitása",
"user": "Felhasználó",
"files": "Fájlok",
"supabaseSetting": "Supabase beállítás"
},
"appearance": {
"themeMode": {
@@ -143,337 +183,417 @@
"light": "Világos mód",
"dark": "Éjjeli mód",
"system": "Rendszerbeállítás követése"
}
},
"fontFamily": {
"label": "Betűtípus család",
"search": "Keresés"
},
"themeUpload": {
"button": "Feltöltés",
"description": "Töltse fel saját AppFlowy témáját az alábbi gomb segítségével.",
"failure": "A feltöltött téma formátuma érvénytelen.",
"loading": "Kérjük, várjon, amíg ellenőrizzük és feltöltjük a témát...",
"uploadSuccess": "A témát sikeresen feltöltötte",
"deletionFailure": "Nem sikerült törölni a témát. Próbálja meg manuálisan törölni.",
"filePickerDialogTitle": "Válasszon egy .flowy_plugin fájlt",
"urlUploadFailure": "Nem sikerült megnyitni az URL-t: {}"
},
"theme": "Téma",
"builtInsLabel": "Beépített témák",
"pluginsLabel": "Beépülő modulok"
},
"files": {
"copy": "Másolat",
"defaultLocation": "Fájlok és adattárolási hely olvasása",
"exportData": "Exportálja adatait",
"doubleTapToCopy": "Koppintson duplán az útvonal másolásához",
"restoreLocation": "Visszaállítás az AppFlowy alapértelmezett elérési útjára",
"customizeLocation": "Nyisson meg egy másik mappát",
"restartApp": "Kérjük, indítsa újra az alkalmazást, hogy a változtatások életbe lépjenek.",
"exportDatabase": "Adatbázis exportálása",
"selectFiles": "Válassza ki az exportálandó fájlokat",
"selectAll": "Mindet kiválaszt",
"deselectAll": "Törölje az összes kijelölését",
"createNewFolder": "Hozzon létre egy új mappát",
"createNewFolderDesc": "Mondja el, hol szeretné tárolni adatait",
"defineWhereYourDataIsStored": "Határozza meg, hol tárolják adatait",
"open": "Nyisd ki",
"openFolder": "Nyisson meg egy meglévő mappát",
"openFolderDesc": "Olvassa el és írja be a meglévő AppFlowy mappájába",
"folderHintText": "mappa neve",
"location": "Új mappa létrehozása",
"locationDesc": "Válasszon nevet az AppFlowy adatmappájának",
"browser": "Tallózás",
"create": "Teremt",
"set": "Készlet",
"folderPath": "A mappa tárolásának elérési útja",
"locationCannotBeEmpty": "Az útvonal nem lehet üres",
"pathCopiedSnackbar": "A fájl tárolási útvonala a vágólapra másolva!",
"changeLocationTooltips": "Módosítsa az adatkönyvtárat",
"change": "változás",
"openLocationTooltips": "Nyisson meg egy másik adatkönyvtárat",
"openCurrentDataFolder": "Nyissa meg az aktuális adatkönyvtárat",
"recoverLocationTooltips": "Állítsa vissza az AppFlowy alapértelmezett adatkönyvtárát",
"exportFileSuccess": "A fájl exportálása sikeres volt!",
"exportFileFail": "A fájl exportálása nem sikerült!",
"export": "Export"
},
"user": {
"name": "Név",
"icon": "Ikon",
"selectAnIcon": "Válasszon ki egy ikont",
"pleaseInputYourOpenAIKey": "kérjük, adja meg OpenAI kulcsát"
}
},
"sideBar": {
"openSidebar": "Open sidebar",
"closeSidebar": "Close sidebar"
},
"moreAction.small": "kicsi",
"moreAction": {
"small": "kicsi",
"medium": "közepes",
"large": "nagy",
"fontSize": "Betűméret",
"import": "Importálás",
"moreOptions": "Több lehetőség"
},
"youCanAlso": "Te is",
"and": "és",
"blockActions.addBelowTooltip": "Kattintson a hozzáadáshoz lent",
"blockActions.addAboveCmd": "Alt+kattintás",
"blockActions.addAboveMacCmd": "Option+kattintás",
"blockActions.addAboveTooltip": "a fentiek hozzáadásához",
"signIn.loginAsGuestButtonText": "Fogj neki",
"moreAction.medium": "közepes",
"moreAction.large": "nagy",
"moreAction.fontSize": "Betűméret",
"moreAction.import": "Importálás",
"moreAction.moreOptions": "Több lehetőség",
"importPanel.textAndMarkdown": "Szöveg & Markdown",
"importPanel.documentFromV010": "Dokumentum a 0.1.0 verzióból",
"importPanel.databaseFromV010": "Adatbázis a 0.1.0 verziótól",
"importPanel.csv": "CSV",
"importPanel.database": "Adatbázis",
"disclosureAction.openNewTab": "Nyissa meg egy új lapon",
"trash.confirmDeleteAll.title": "Biztosan törli a kukában lévő összes oldalt?",
"trash.confirmDeleteAll.caption": "Ez a művelet nem visszavonható.",
"trash.confirmRestoreAll.title": "Biztosan visszaállítja a kukában lévő összes oldalt?",
"trash.confirmRestoreAll.caption": "Ez a művelet nem visszavonható.",
"questionBubble.shortcuts": "Parancsikonok",
"questionBubble.markdown": "Árleszállítás",
"questionBubble.feedback": "Visszacsatolás",
"toolbar.color": "Szín",
"toolbar.addLink": "Link hozzáadása",
"toolbar.link": "Link",
"tooltip.openAsPage": "Megnyitás oldalként",
"tooltip.addNewRow": "Új sor hozzáadása",
"tooltip.openMenu": "Kattintson a menü megnyitásához",
"tooltip.dragRow": "Nyomja meg hosszan a sor átrendezéséhez",
"tooltip.viewDataBase": "Adatbázis megtekintése",
"tooltip.referencePage": "Erre a(z) {name} címre hivatkoznak",
"tooltip.addBlockBelow": "Adjon hozzá egy blokkot alább",
"notifications.export.markdown": "Megjegyzés exportálva a Markdownba",
"notifications.export.path": "Dokumentumok/flowy",
"button.Done": "Kész",
"button.generate": "generál",
"button.esc": "KILÉPÉS",
"button.keep": "Tart",
"button.tryAgain": "Próbáld újra",
"button.discard": "Eldobni",
"button.replace": "Cserélje ki",
"button.insertBelow": "Beszúrás alább",
"button.upload": "Feltöltés",
"button.edit": "Szerkesztés",
"button.delete": "Töröl",
"button.duplicate": "Másolat",
"button.done": "Kész",
"button.putback": "Visszatesz",
"settings.menu.user": "Felhasználó",
"settings.menu.files": "Fájlok",
"settings.menu.supabaseSetting": "Supabase beállítás",
"settings.appearance.fontFamily.label": "Betűtípus család",
"settings.appearance.fontFamily.search": "Keresés",
"settings.appearance.themeUpload.button": "Feltöltés",
"settings.appearance.themeUpload.description": "Töltse fel saját AppFlowy témáját az alábbi gomb segítségével.",
"settings.appearance.themeUpload.failure": "A feltöltött téma formátuma érvénytelen.",
"settings.appearance.themeUpload.loading": "Kérjük, várjon, amíg ellenőrizzük és feltöltjük a témát...",
"settings.appearance.themeUpload.uploadSuccess": "A témát sikeresen feltöltötte",
"settings.appearance.themeUpload.deletionFailure": "Nem sikerült törölni a témát. Próbálja meg manuálisan törölni.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Válasszon egy .flowy_plugin fájlt",
"settings.appearance.themeUpload.urlUploadFailure": "Nem sikerült megnyitni az URL-t: {}",
"settings.appearance.theme": "Téma",
"settings.appearance.builtInsLabel": "Beépített témák",
"settings.appearance.pluginsLabel": "Beépülő modulok",
"settings.files.copy": "Másolat",
"settings.files.defaultLocation": "Fájlok és adattárolási hely olvasása",
"settings.files.exportData": "Exportálja adatait",
"settings.files.doubleTapToCopy": "Koppintson duplán az útvonal másolásához",
"settings.files.restoreLocation": "Visszaállítás az AppFlowy alapértelmezett elérési útjára",
"settings.files.customizeLocation": "Nyisson meg egy másik mappát",
"settings.files.restartApp": "Kérjük, indítsa újra az alkalmazást, hogy a változtatások életbe lépjenek.",
"settings.files.exportDatabase": "Adatbázis exportálása",
"settings.files.selectFiles": "Válassza ki az exportálandó fájlokat",
"settings.files.selectAll": "Mindet kiválaszt",
"settings.files.deselectAll": "Törölje az összes kijelölését",
"settings.files.createNewFolder": "Hozzon létre egy új mappát",
"settings.files.createNewFolderDesc": "Mondja el, hol szeretné tárolni adatait",
"settings.files.defineWhereYourDataIsStored": "Határozza meg, hol tárolják adatait",
"settings.files.open": "Nyisd ki",
"settings.files.openFolder": "Nyisson meg egy meglévő mappát",
"settings.files.openFolderDesc": "Olvassa el és írja be a meglévő AppFlowy mappájába",
"settings.files.folderHintText": "mappa neve",
"settings.files.location": "Új mappa létrehozása",
"settings.files.locationDesc": "Válasszon nevet az AppFlowy adatmappájának",
"settings.files.browser": "Tallózás",
"settings.files.create": "Teremt",
"settings.files.set": "Készlet",
"settings.files.folderPath": "A mappa tárolásának elérési útja",
"settings.files.locationCannotBeEmpty": "Az útvonal nem lehet üres",
"settings.files.pathCopiedSnackbar": "A fájl tárolási útvonala a vágólapra másolva!",
"settings.files.changeLocationTooltips": "Módosítsa az adatkönyvtárat",
"settings.files.change": "változás",
"settings.files.openLocationTooltips": "Nyisson meg egy másik adatkönyvtárat",
"settings.files.openCurrentDataFolder": "Nyissa meg az aktuális adatkönyvtárat",
"settings.files.recoverLocationTooltips": "Állítsa vissza az AppFlowy alapértelmezett adatkönyvtárát",
"settings.files.exportFileSuccess": "A fájl exportálása sikeres volt!",
"settings.files.exportFileFail": "A fájl exportálása nem sikerült!",
"settings.files.export": "Export",
"settings.user.name": "Név",
"settings.user.icon": "Ikon",
"settings.user.selectAnIcon": "Válasszon ki egy ikont",
"settings.user.pleaseInputYourOpenAIKey": "kérjük, adja meg OpenAI kulcsát",
"grid.deleteView": "Biztosan törli ezt a nézetet?",
"grid.createView": "Új",
"grid.settings.filter": "Szűrő",
"grid.settings.sort": "Fajta",
"grid.settings.sortBy": "Rendezés",
"grid.settings.properties": "Tulajdonságok",
"grid.settings.reorderPropertiesTooltip": "Húzza a tulajdonságok átrendezéséhez",
"grid.settings.group": "Csoport",
"grid.settings.addFilter": "Szűrő hozzáadása",
"grid.settings.deleteFilter": "Szűrő törlése",
"grid.settings.filterBy": "Szűrés vlami alapján...",
"grid.settings.typeAValue": "Írjon be egy értéket...",
"grid.settings.layout": "Elrendezés",
"grid.settings.databaseLayout": "Elrendezés",
"grid.textFilter.contains": "Tartalmaz",
"grid.textFilter.doesNotContain": "Nem tartalmaz",
"grid.textFilter.endsWith": "Végződik",
"grid.textFilter.startWith": "Ezzel kezdődik",
"grid.textFilter.is": "Is",
"grid.textFilter.isNot": "Nem",
"grid.textFilter.isEmpty": "Üres",
"grid.textFilter.isNotEmpty": "Nem üres",
"grid.textFilter.choicechipPrefix.isNot": "Nem",
"grid.textFilter.choicechipPrefix.startWith": "Ezzel kezdődik",
"grid.textFilter.choicechipPrefix.endWith": "Végződik",
"grid.textFilter.choicechipPrefix.isEmpty": "üres",
"grid.textFilter.choicechipPrefix.isNotEmpty": "nem üres",
"grid.checkboxFilter.isChecked": "Ellenőrizve",
"grid.checkboxFilter.isUnchecked": "Nincs bejelölve",
"grid.checkboxFilter.choicechipPrefix.is": "van",
"grid.checklistFilter.isComplete": "teljes",
"grid.checklistFilter.isIncomplted": "hiányos",
"grid.singleSelectOptionFilter.is": "Is",
"grid.singleSelectOptionFilter.isNot": "Nem",
"grid.singleSelectOptionFilter.isEmpty": "Üres",
"grid.singleSelectOptionFilter.isNotEmpty": "Nem üres",
"grid.multiSelectOptionFilter.contains": "Tartalmaz",
"grid.multiSelectOptionFilter.doesNotContain": "Nem tartalmaz",
"grid.multiSelectOptionFilter.isEmpty": "Üres",
"grid.multiSelectOptionFilter.isNotEmpty": "Nem üres",
"grid.field.hide": "Elrejt",
"grid.field.insertLeft": "Beszúrás balra",
"grid.field.insertRight": "Jobb beszúrás",
"grid.field.duplicate": "Másolat",
"grid.field.delete": "Töröl",
"grid.field.textFieldName": "Szöveg",
"grid.field.checkboxFieldName": "Jelölőnégyzet",
"grid.field.dateFieldName": "Dátum",
"grid.field.updatedAtFieldName": "Utolsó módosítás időpontja",
"grid.field.createdAtFieldName": "Létrehozott idő",
"grid.field.numberFieldName": "Számok",
"grid.field.singleSelectFieldName": "Válassza ki",
"grid.field.multiSelectFieldName": "Többszörös választás",
"grid.field.urlFieldName": "URL",
"grid.field.checklistFieldName": "Ellenőrzőlista",
"grid.field.numberFormat": "Számformátum",
"grid.field.dateFormat": "Dátum formátum",
"grid.field.includeTime": "Tartalmazzon időt",
"grid.field.dateFormatFriendly": "Hónap nap év",
"grid.field.dateFormatISO": "Év hónap nap",
"grid.field.dateFormatLocal": "Hónap nap év",
"grid.field.dateFormatUS": "Év hónap nap",
"grid.field.dateFormatDayMonthYear": "Nap hónap év",
"grid.field.timeFormat": "Idő formátum",
"grid.field.invalidTimeFormat": "Érvénytelen formátum",
"grid.field.timeFormatTwelveHour": "12 óra",
"grid.field.timeFormatTwentyFourHour": "24 óra",
"grid.field.addSelectOption": "Adjon hozzá egy lehetőséget",
"grid.field.optionTitle": "Lehetőségek",
"grid.field.addOption": "Opció hozzáadása",
"grid.field.editProperty": "Tulajdonság szerkesztése",
"grid.field.newProperty": "Új ingatlan",
"grid.field.deleteFieldPromptMessage": "biztos vagy ebben? Ez a tulajdonság törlésre kerül",
"grid.sort.ascending": "Emelkedő",
"grid.sort.descending": "Csökkenő",
"grid.sort.deleteSort": "Rendezés törlése",
"grid.sort.addSort": "Rendezés hozzáadása",
"grid.row.duplicate": "Másolat",
"grid.row.delete": "Töröl",
"grid.row.textPlaceholder": "Üres",
"grid.row.copyProperty": "Tulajdonság a vágólapra másolva",
"grid.row.count": "Számol",
"grid.row.newRow": "Új sor",
"grid.row.action": "Akció",
"grid.selectOption.create": "Teremt",
"grid.selectOption.purpleColor": "Lila",
"grid.selectOption.pinkColor": "Rózsaszín",
"grid.selectOption.lightPinkColor": "Világos rózsaszín",
"grid.selectOption.orangeColor": "narancs",
"grid.selectOption.yellowColor": "Sárga",
"grid.selectOption.limeColor": "Mész",
"grid.selectOption.greenColor": "Zöld",
"grid.selectOption.aquaColor": "Aqua",
"grid.selectOption.blueColor": "Kék",
"grid.selectOption.deleteTag": "Címke törlése",
"grid.selectOption.colorPanelTitle": "Színek",
"grid.selectOption.panelTitle": "Válasszon egy lehetőséget, vagy hozzon létre egyet",
"grid.selectOption.searchOption": "Keressen egy lehetőséget",
"grid.checklist.panelTitle": "Adjon hozzá egy elemet",
"grid.menuName": "Rács",
"grid.referencedGridPrefix": "Nézet",
"document.menuName": "Dokumentum",
"document.date.timeHintTextInTwelveHour": "01:00 PM",
"document.date.timeHintTextInTwentyFourHour": "13:00",
"document.slashMenu.board.selectABoardToLinkTo": "Válassza ki azt a táblát, amelyre hivatkozni szeretne",
"document.slashMenu.board.createANewBoard": "Hozzon létre egy új táblát",
"document.slashMenu.grid.selectAGridToLinkTo": "Válassza ki a rácsot, amelyre hivatkozni szeretne",
"document.slashMenu.grid.createANewGrid": "Hozzon létre egy új rácsot",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Válasszon egy naptárt a hivatkozáshoz",
"document.slashMenu.calendar.createANewCalendar": "Hozzon létre egy új naptárat",
"document.selectionMenu.outline": "Vázlat",
"document.plugins.referencedBoard": "Hivatkozott tábla",
"document.plugins.referencedGrid": "Hivatkozott rács",
"document.plugins.referencedCalendar": "Hivatkozott naptár",
"document.plugins.autoGeneratorMenuItemName": "OpenAI Writer",
"document.plugins.autoGeneratorTitleName": "OpenAI: Kérd meg az AI-t, hogy írjon bármit...",
"document.plugins.autoGeneratorLearnMore": "Tudj meg többet",
"document.plugins.autoGeneratorGenerate": "generál",
"document.plugins.autoGeneratorHintText": "Kérdezd meg az OpenAI-t...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Nem lehet beszerezni az OpenAI kulcsot",
"document.plugins.autoGeneratorRewrite": "Újraírni",
"document.plugins.smartEdit": "AI asszisztensek",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Helyesírás javítása",
"document.plugins.warning": "⚠️ Az AI-válaszok pontatlanok vagy félrevezetőek lehetnek.",
"document.plugins.smartEditSummarize": "Összesít",
"document.plugins.smartEditImproveWriting": "Az írás javítása",
"document.plugins.smartEditMakeLonger": "Hosszabb legyen",
"document.plugins.smartEditCouldNotFetchResult": "Nem sikerült lekérni az eredményt az OpenAI-ból",
"document.plugins.smartEditCouldNotFetchKey": "Nem sikerült lekérni az OpenAI kulcsot",
"document.plugins.smartEditDisabled": "Csatlakoztassa az OpenAI-t a Beállításokban",
"document.plugins.discardResponse": "El szeretné vetni az AI-válaszokat?",
"document.plugins.createInlineMathEquation": "Hozzon létre egyenletet",
"document.plugins.toggleList": "Lista váltása",
"document.plugins.cover.changeCover": "Borítót változatni",
"document.plugins.cover.colors": "Színek",
"document.plugins.cover.images": "Képek",
"document.plugins.cover.clearAll": "Mindent kitöröl",
"document.plugins.cover.abstract": "Absztrakt",
"document.plugins.cover.addCover": "Fedő hozzáadása",
"document.plugins.cover.addLocalImage": "Helyi kép hozzáadása",
"document.plugins.cover.invalidImageUrl": "Érvénytelen kép URL-je",
"document.plugins.cover.failedToAddImageToGallery": "Nem sikerült hozzáadni a képet a galériához",
"document.plugins.cover.enterImageUrl": "Adja meg a kép URL-jét",
"document.plugins.cover.add": "Hozzáadás",
"document.plugins.cover.back": "Vissza",
"document.plugins.cover.saveToGallery": "Mentés a galériába",
"document.plugins.cover.removeIcon": "Ikon eltávolítása",
"document.plugins.cover.pasteImageUrl": "Illessze be a kép URL-jét",
"document.plugins.cover.or": "VAGY",
"document.plugins.cover.pickFromFiles": "Válasszon fájlokból",
"document.plugins.cover.couldNotFetchImage": "Nem sikerült lekérni a képet",
"document.plugins.cover.imageSavingFailed": "A kép mentése nem sikerült",
"document.plugins.cover.addIcon": "Ikon hozzáadása",
"document.plugins.cover.coverRemoveAlert": "A törlés után eltávolítjuk a borítóról.",
"document.plugins.cover.alertDialogConfirmation": "Biztos vagy benne, hogy folytatni akarod?",
"document.plugins.mathEquation.addMathEquation": "Adja hozzá a matematikai egyenletet",
"document.plugins.mathEquation.editMathEquation": "Matematikai egyenlet szerkesztése",
"document.plugins.optionAction.click": "Kattintson",
"document.plugins.optionAction.toOpenMenu": " menü megnyitásához",
"document.plugins.optionAction.delete": "Töröl",
"document.plugins.optionAction.duplicate": "Másolat",
"document.plugins.optionAction.turnInto": "Válik",
"document.plugins.optionAction.moveUp": "Lépj felfelé",
"document.plugins.optionAction.moveDown": "Mozgás lefelé",
"document.plugins.optionAction.color": "Szín",
"document.plugins.optionAction.align": "Igazítsa",
"document.plugins.optionAction.left": "Bal",
"document.plugins.optionAction.center": "Központ",
"document.plugins.optionAction.right": "Jobb",
"document.plugins.optionAction.defaultColor": "Alapértelmezett",
"document.plugins.image.copiedToPasteBoard": "A kép linkjét a vágólapra másolta",
"document.plugins.outline.addHeadingToCreateOutline": "Adjon hozzá címeket a tartalomjegyzék létrehozásához.",
"document.textBlock.placeholder": "Írja be a '/' karaktert a parancsokhoz",
"document.title.placeholder": "Névtelen",
"document.imageBlock.placeholder": "Kattintson a kép hozzáadásához",
"document.imageBlock.upload.label": "Feltöltés",
"document.imageBlock.upload.placeholder": "Kattintson a kép feltöltéséhez",
"document.imageBlock.url.label": "Kép URL-je",
"document.imageBlock.url.placeholder": "Adja meg a kép URL-jét",
"document.imageBlock.support": "A képméret korlátja 5 MB. Támogatott formátumok: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Érvénytelen kép",
"document.imageBlock.error.invalidImageSize": "A kép méretének 5 MB-nál kisebbnek kell lennie",
"document.imageBlock.error.invalidImageFormat": "A képformátum nem támogatott. Támogatott formátumok: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "Érvénytelen kép URL-je",
"document.codeBlock.language.label": "Nyelv",
"document.codeBlock.language.placeholder": "Válasszon nyelvet",
"document.inlineLink.placeholder": "Illesszen be vagy írjon be egy hivatkozást",
"document.inlineLink.url.label": "Link URL",
"document.inlineLink.url.placeholder": "Adja meg a link URL-jét",
"document.inlineLink.title.label": "Link címe",
"document.inlineLink.title.placeholder": "Adja meg a link címét",
"board.column.create_new_card": "Új",
"board.menuName": "Tábla",
"board.referencedBoardPrefix": "Nézet",
"calendar.menuName": "Naptár",
"calendar.defaultNewCalendarTitle": "Névtelen",
"calendar.navigation.today": "Ma",
"calendar.navigation.jumpToday": "Ugrás a mai napra",
"calendar.navigation.previousMonth": "Előző hónap",
"calendar.navigation.nextMonth": "Következő hónap",
"calendar.settings.showWeekNumbers": "Heti számok megjelenítése",
"calendar.settings.showWeekends": "Hétvégén mutatják be",
"calendar.settings.firstDayOfWeek": "Kezdje a hetet",
"calendar.settings.layoutDateField": "Elrendezés naptár által",
"calendar.settings.noDateTitle": "Nincs dátum",
"calendar.settings.noDateHint": "A nem tervezett események itt jelennek meg",
"calendar.settings.clickToAdd": "Kattintson a naptárhoz való hozzáadáshoz",
"calendar.settings.name": "Naptár elrendezés",
"calendar.referencedCalendarPrefix": "Nézet",
"errorDialog.title": "AppFlowy hiba",
"errorDialog.howToFixFallback": "Elnézést kérünk a kellemetlenségért! Nyújtsa be a problémát a GitHub-oldalunkon, amely leírja a hibát.",
"errorDialog.github": "Megtekintés a GitHubon",
"search.label": "Keresés",
"search.placeholder.actions": "Keresési műveletek...",
"message.copy.success": "Másolva!",
"message.copy.fail": "Nem lehet másolni",
"blockActions": {
"addBelowTooltip": "Kattintson a hozzáadáshoz lent",
"addAboveCmd": "Alt+kattintás",
"addAboveMacCmd": "Option+kattintás",
"addAboveTooltip": "a fentiek hozzáadásához"
},
"importPanel": {
"textAndMarkdown": "Szöveg & Markdown",
"documentFromV010": "Dokumentum a 0.1.0 verzióból",
"databaseFromV010": "Adatbázis a 0.1.0 verziótól",
"csv": "CSV",
"database": "Adatbázis"
},
"notifications": {
"export": {
"markdown": "Megjegyzés exportálva a Markdownba",
"path": "Dokumentumok/flowy"
}
},
"grid": {
"deleteView": "Biztosan törli ezt a nézetet?",
"createView": "Új",
"settings": {
"filter": "Szűrő",
"sort": "Fajta",
"sortBy": "Rendezés",
"properties": "Tulajdonságok",
"reorderPropertiesTooltip": "Húzza a tulajdonságok átrendezéséhez",
"group": "Csoport",
"addFilter": "Szűrő hozzáadása",
"deleteFilter": "Szűrő törlése",
"filterBy": "Szűrés vlami alapján...",
"typeAValue": "Írjon be egy értéket...",
"layout": "Elrendezés",
"databaseLayout": "Elrendezés"
},
"textFilter": {
"contains": "Tartalmaz",
"doesNotContain": "Nem tartalmaz",
"endsWith": "Végződik",
"startWith": "Ezzel kezdődik",
"is": "Is",
"isNot": "Nem",
"isEmpty": "Üres",
"isNotEmpty": "Nem üres",
"choicechipPrefix": {
"isNot": "Nem",
"startWith": "Ezzel kezdődik",
"endWith": "Végződik",
"isEmpty": "üres",
"isNotEmpty": "nem üres"
}
},
"checkboxFilter": {
"isChecked": "Ellenőrizve",
"isUnchecked": "Nincs bejelölve",
"choicechipPrefix": {
"is": "van"
}
},
"checklistFilter": {
"isComplete": "teljes",
"isIncomplted": "hiányos"
},
"singleSelectOptionFilter": {
"is": "Is",
"isNot": "Nem",
"isEmpty": "Üres",
"isNotEmpty": "Nem üres"
},
"multiSelectOptionFilter": {
"contains": "Tartalmaz",
"doesNotContain": "Nem tartalmaz",
"isEmpty": "Üres",
"isNotEmpty": "Nem üres"
},
"field": {
"hide": "Elrejt",
"insertLeft": "Beszúrás balra",
"insertRight": "Jobb beszúrás",
"duplicate": "Másolat",
"delete": "Töröl",
"textFieldName": "Szöveg",
"checkboxFieldName": "Jelölőnégyzet",
"dateFieldName": "Dátum",
"updatedAtFieldName": "Utolsó módosítás időpontja",
"createdAtFieldName": "Létrehozott idő",
"numberFieldName": "Számok",
"singleSelectFieldName": "Válassza ki",
"multiSelectFieldName": "Többszörös választás",
"urlFieldName": "URL",
"checklistFieldName": "Ellenőrzőlista",
"numberFormat": "Számformátum",
"dateFormat": "Dátum formátum",
"includeTime": "Tartalmazzon időt",
"dateFormatFriendly": "Hónap nap év",
"dateFormatISO": "Év hónap nap",
"dateFormatLocal": "Hónap nap év",
"dateFormatUS": "Év hónap nap",
"dateFormatDayMonthYear": "Nap hónap év",
"timeFormat": "Idő formátum",
"invalidTimeFormat": "Érvénytelen formátum",
"timeFormatTwelveHour": "12 óra",
"timeFormatTwentyFourHour": "24 óra",
"addSelectOption": "Adjon hozzá egy lehetőséget",
"optionTitle": "Lehetőségek",
"addOption": "Opció hozzáadása",
"editProperty": "Tulajdonság szerkesztése",
"newProperty": "Új ingatlan",
"deleteFieldPromptMessage": "biztos vagy ebben? Ez a tulajdonság törlésre kerül"
},
"sort": {
"ascending": "Emelkedő",
"descending": "Csökkenő",
"deleteSort": "Rendezés törlése",
"addSort": "Rendezés hozzáadása"
},
"row": {
"duplicate": "Másolat",
"delete": "Töröl",
"textPlaceholder": "Üres",
"copyProperty": "Tulajdonság a vágólapra másolva",
"count": "Számol",
"newRow": "Új sor",
"action": "Akció"
},
"selectOption": {
"create": "Teremt",
"purpleColor": "Lila",
"pinkColor": "Rózsaszín",
"lightPinkColor": "Világos rózsaszín",
"orangeColor": "narancs",
"yellowColor": "Sárga",
"limeColor": "Mész",
"greenColor": "Zöld",
"aquaColor": "Aqua",
"blueColor": "Kék",
"deleteTag": "Címke törlése",
"colorPanelTitle": "Színek",
"panelTitle": "Válasszon egy lehetőséget, vagy hozzon létre egyet",
"searchOption": "Keressen egy lehetőséget"
},
"checklist": {
"panelTitle": "Adjon hozzá egy elemet"
},
"menuName": "Rács",
"referencedGridPrefix": "Nézet"
},
"document": {
"menuName": "Dokumentum",
"date": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Válassza ki azt a táblát, amelyre hivatkozni szeretne",
"createANewBoard": "Hozzon létre egy új táblát"
},
"grid": {
"selectAGridToLinkTo": "Válassza ki a rácsot, amelyre hivatkozni szeretne",
"createANewGrid": "Hozzon létre egy új rácsot"
},
"calendar": {
"selectACalendarToLinkTo": "Válasszon egy naptárt a hivatkozáshoz",
"createANewCalendar": "Hozzon létre egy új naptárat"
}
},
"selectionMenu": {
"outline": "Vázlat"
},
"plugins": {
"referencedBoard": "Hivatkozott tábla",
"referencedGrid": "Hivatkozott rács",
"referencedCalendar": "Hivatkozott naptár",
"autoGeneratorMenuItemName": "OpenAI Writer",
"autoGeneratorTitleName": "OpenAI: Kérd meg az AI-t, hogy írjon bármit...",
"autoGeneratorLearnMore": "Tudj meg többet",
"autoGeneratorGenerate": "generál",
"autoGeneratorHintText": "Kérdezd meg az OpenAI-t...",
"autoGeneratorCantGetOpenAIKey": "Nem lehet beszerezni az OpenAI kulcsot",
"autoGeneratorRewrite": "Újraírni",
"smartEdit": "AI asszisztensek",
"openAI": "OpenAI",
"smartEditFixSpelling": "Helyesírás javítása",
"warning": "⚠️ Az AI-válaszok pontatlanok vagy félrevezetőek lehetnek.",
"smartEditSummarize": "Összesít",
"smartEditImproveWriting": "Az írás javítása",
"smartEditMakeLonger": "Hosszabb legyen",
"smartEditCouldNotFetchResult": "Nem sikerült lekérni az eredményt az OpenAI-ból",
"smartEditCouldNotFetchKey": "Nem sikerült lekérni az OpenAI kulcsot",
"smartEditDisabled": "Csatlakoztassa az OpenAI-t a Beállításokban",
"discardResponse": "El szeretné vetni az AI-válaszokat?",
"createInlineMathEquation": "Hozzon létre egyenletet",
"toggleList": "Lista váltása",
"cover": {
"changeCover": "Borítót változatni",
"colors": "Színek",
"images": "Képek",
"clearAll": "Mindent kitöröl",
"abstract": "Absztrakt",
"addCover": "Fedő hozzáadása",
"addLocalImage": "Helyi kép hozzáadása",
"invalidImageUrl": "Érvénytelen kép URL-je",
"failedToAddImageToGallery": "Nem sikerült hozzáadni a képet a galériához",
"enterImageUrl": "Adja meg a kép URL-jét",
"add": "Hozzáadás",
"back": "Vissza",
"saveToGallery": "Mentés a galériába",
"removeIcon": "Ikon eltávolítása",
"pasteImageUrl": "Illessze be a kép URL-jét",
"or": "VAGY",
"pickFromFiles": "Válasszon fájlokból",
"couldNotFetchImage": "Nem sikerült lekérni a képet",
"imageSavingFailed": "A kép mentése nem sikerült",
"addIcon": "Ikon hozzáadása",
"coverRemoveAlert": "A törlés után eltávolítjuk a borítóról.",
"alertDialogConfirmation": "Biztos vagy benne, hogy folytatni akarod?"
},
"mathEquation": {
"addMathEquation": "Adja hozzá a matematikai egyenletet",
"editMathEquation": "Matematikai egyenlet szerkesztése"
},
"optionAction": {
"click": "Kattintson",
"toOpenMenu": " menü megnyitásához",
"delete": "Töröl",
"duplicate": "Másolat",
"turnInto": "Válik",
"moveUp": "Lépj felfelé",
"moveDown": "Mozgás lefelé",
"color": "Szín",
"align": "Igazítsa",
"left": "Bal",
"center": "Központ",
"right": "Jobb",
"defaultColor": "Alapértelmezett"
},
"image": {
"copiedToPasteBoard": "A kép linkjét a vágólapra másolta"
},
"outline": {
"addHeadingToCreateOutline": "Adjon hozzá címeket a tartalomjegyzék létrehozásához."
}
},
"textBlock": {
"placeholder": "Írja be a '/' karaktert a parancsokhoz"
},
"title": {
"placeholder": "Névtelen"
},
"imageBlock": {
"placeholder": "Kattintson a kép hozzáadásához",
"upload": {
"label": "Feltöltés",
"placeholder": "Kattintson a kép feltöltéséhez"
},
"url": {
"label": "Kép URL-je",
"placeholder": "Adja meg a kép URL-jét"
},
"support": "A képméret korlátja 5 MB. Támogatott formátumok: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Érvénytelen kép",
"invalidImageSize": "A kép méretének 5 MB-nál kisebbnek kell lennie",
"invalidImageFormat": "A képformátum nem támogatott. Támogatott formátumok: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "Érvénytelen kép URL-je"
}
},
"codeBlock": {
"language": {
"label": "Nyelv",
"placeholder": "Válasszon nyelvet"
}
},
"inlineLink": {
"placeholder": "Illesszen be vagy írjon be egy hivatkozást",
"url": {
"label": "Link URL",
"placeholder": "Adja meg a link URL-jét"
},
"title": {
"label": "Link címe",
"placeholder": "Adja meg a link címét"
}
}
},
"board": {
"column": {
"create_new_card": "Új"
},
"menuName": "Tábla",
"referencedBoardPrefix": "Nézet"
},
"calendar": {
"menuName": "Naptár",
"defaultNewCalendarTitle": "Névtelen",
"navigation": {
"today": "Ma",
"jumpToday": "Ugrás a mai napra",
"previousMonth": "Előző hónap",
"nextMonth": "Következő hónap"
},
"settings": {
"showWeekNumbers": "Heti számok megjelenítése",
"showWeekends": "Hétvégén mutatják be",
"firstDayOfWeek": "Kezdje a hetet",
"layoutDateField": "Elrendezés naptár által",
"noDateTitle": "Nincs dátum",
"noDateHint": "A nem tervezett események itt jelennek meg",
"clickToAdd": "Kattintson a naptárhoz való hozzáadáshoz",
"name": "Naptár elrendezés"
},
"referencedCalendarPrefix": "Nézet"
},
"errorDialog": {
"title": "AppFlowy hiba",
"howToFixFallback": "Elnézést kérünk a kellemetlenségért! Nyújtsa be a problémát a GitHub-oldalunkon, amely leírja a hibát.",
"github": "Megtekintés a GitHubon"
},
"search": {
"label": "Keresés",
"placeholder": {
"actions": "Keresési műveletek..."
}
},
"message": {
"copy": {
"success": "Másolva!",
"fail": "Nem lehet másolni"
}
},
"unSupportBlock": "A jelenlegi verzió nem támogatja ezt a blokkot.",
"views.deleteContentTitle": "Biztosan törli a következőt: {pageType}?",
"views.deleteContentCaption": "ha törli ezt a {pageType} oldalt, visszaállíthatja a kukából."
"views": {
"deleteContentTitle": "Biztosan törli a következőt: {pageType}?",
"deleteContentCaption": "ha törli ezt a {pageType} oldalt, visszaállíthatja a kukából."
}
}
+383 -281
View File
@@ -27,7 +27,8 @@
"passwordHint": "Sandi",
"dontHaveAnAccount": "Belum punya akun?",
"repeatPasswordEmptyError": "Sandi ulang tidak boleh kosong",
"unmatchedPasswordError": "Sandi ulang tidak sama dengan sandi"
"unmatchedPasswordError": "Sandi ulang tidak sama dengan sandi",
"loginAsGuestButtonText": "Memulai"
},
"workspace": {
"create": "Buat workspace",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Ganti nama",
"delete": "Hapus",
"duplicate": "Duplikat"
"duplicate": "Duplikat",
"openNewTab": "Buka di tab baru"
},
"blankPageTitle": "Halaman kosong",
"newPageText": "Halaman baru",
@@ -55,6 +57,14 @@
"fileName": "Nama file",
"lastModified": "Terakhir diubah",
"created": "Dibuat"
},
"confirmDeleteAll": {
"title": "Yakin ingin menghapus semua laman di Sampah?",
"caption": "Tindakan ini tidak bisa dibatalkan."
},
"confirmRestoreAll": {
"title": "Apakah Anda yakin akan memulihkan semua laman di Sampah?",
"caption": "Tindakan ini tidak bisa dibatalkan."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Info debug",
"success": "Info debug disalin ke papan klip!",
"fail": "Tidak dapat menyalin info debug ke papan klip"
}
},
"shortcuts": "Pintasan",
"markdown": "Penurunan harga",
"feedback": "Masukan"
},
"menuAppHeader": {
"addPageTooltip": "Menambahkan halaman di dalam dengan cepat",
@@ -90,11 +103,21 @@
"inlineCode": "Kode sebaris",
"quote": "Blok kutipan",
"header": "Tajuk",
"highlight": "Sorotan"
"highlight": "Sorotan",
"color": "Warna",
"addLink": "Tambahkan Tautan",
"link": "Tautan"
},
"tooltip": {
"lightMode": "Ganti mode terang",
"darkMode": "Ganti mode gelap"
"darkMode": "Ganti mode gelap",
"openAsPage": "Buka sebagai Halaman",
"addNewRow": "Tambahkan baris baru",
"openMenu": "Klik untuk membuka menu",
"dragRow": "Tekan lama untuk menyusun ulang baris",
"viewDataBase": "Lihat basis data",
"referencePage": "{nama} ini direferensikan",
"addBlockBelow": "Tambahkan blok di bawah ini"
},
"notifications": {
"export": {
@@ -114,7 +137,21 @@
"signIn": "Masuk",
"signOut": "Keluar",
"complete": "Selesai",
"save": "Simpan"
"save": "Simpan",
"Done": "Selesai",
"generate": "Menghasilkan",
"esc": "ESC",
"keep": "Menyimpan",
"tryAgain": "Coba lagi",
"discard": "Membuang",
"replace": "Mengganti",
"insertBelow": "Sisipkan Di Bawah",
"upload": "Mengunggah",
"edit": "Sunting",
"delete": "Menghapus",
"duplicate": "Duplikat",
"done": "Selesai",
"putback": "Taruh kembali"
},
"label": {
"welcome": "Selamat datang!",
@@ -142,7 +179,9 @@
"appearance": "Tampilan",
"language": "Bahasa",
"user": "Pengguna",
"open": "Buka Pengaturan"
"open": "Buka Pengaturan",
"files": "File",
"supabaseSetting": "Pengaturan Supabase"
},
"appearance": {
"themeMode": {
@@ -150,14 +189,83 @@
"light": "Mode Terang",
"dark": "Mode Gelap",
"system": "Adapt to System"
}
},
"fontFamily": {
"label": "Keluarga Fon",
"search": "Mencari"
},
"themeUpload": {
"button": "Mengunggah",
"description": "Unggah tema AppFlowy Anda sendiri menggunakan tombol di bawah ini.",
"failure": "Tema yang diunggah memiliki format yang tidak valid.",
"loading": "Harap tunggu sementara kami memvalidasi dan mengunggah tema Anda...",
"uploadSuccess": "Tema Anda berhasil diunggah",
"deletionFailure": "Gagal menghapus tema. Cobalah untuk menghapusnya secara manual.",
"filePickerDialogTitle": "Pilih file .flowy_plugin",
"urlUploadFailure": "Gagal membuka url: {}"
},
"theme": "Tema",
"builtInsLabel": "Tema Bawaan",
"pluginsLabel": "Plugin"
},
"files": {
"copy": "Menyalin",
"defaultLocation": "Baca file dan lokasi penyimpanan data",
"exportData": "Ekspor data Anda",
"doubleTapToCopy": "Ketuk dua kali untuk menyalin jalur",
"restoreLocation": "Pulihkan ke jalur default AppFlowy",
"customizeLocation": "Buka folder lain",
"restartApp": "Harap mulai ulang aplikasi agar perubahan diterapkan.",
"exportDatabase": "Ekspor basis data",
"selectFiles": "Pilih file yang perlu diekspor",
"selectAll": "Pilih Semua",
"deselectAll": "Batalkan pilihan semua",
"createNewFolder": "Buat folder baru",
"createNewFolderDesc": "Beritahu kami di mana Anda ingin menyimpan data Anda",
"defineWhereYourDataIsStored": "Tentukan di mana data Anda disimpan",
"open": "Membuka",
"openFolder": "Buka folder yang ada",
"openFolderDesc": "Baca dan tulis ke folder AppFlowy Anda yang sudah ada",
"folderHintText": "nama folder",
"location": "Membuat folder baru",
"locationDesc": "Pilih nama untuk folder data AppFlowy Anda",
"browser": "Jelajahi",
"create": "Membuat",
"set": "Mengatur",
"folderPath": "Jalur untuk menyimpan folder Anda",
"locationCannotBeEmpty": "Jalur tidak boleh kosong",
"pathCopiedSnackbar": "Jalur penyimpanan file disalin ke clipboard!",
"changeLocationTooltips": "Ubah direktori data",
"change": "Mengubah",
"openLocationTooltips": "Buka direktori data lain",
"openCurrentDataFolder": "Buka direktori data saat ini",
"recoverLocationTooltips": "Setel ulang ke direktori data default AppFlowy",
"exportFileSuccess": "Ekspor file berhasil!",
"exportFileFail": "File ekspor gagal!",
"export": "Ekspor"
},
"user": {
"name": "Nama",
"icon": "Ikon",
"selectAnIcon": "Pilih ikon",
"pleaseInputYourOpenAIKey": "silakan masukkan kunci OpenAI Anda"
}
},
"grid": {
"settings": {
"filter": "Filter",
"sortBy": "Sortir dengan",
"Properties": "Properti"
"Properties": "Properti",
"sort": "Menyortir",
"properties": "Properti",
"reorderPropertiesTooltip": "Seret untuk mengurutkan ulang properti",
"group": "Kelompok",
"addFilter": "Tambahkan Filter",
"deleteFilter": "Hapus filter",
"filterBy": "Saring menurut...",
"typeAValue": "Ketik nilai...",
"layout": "Tata letak",
"databaseLayout": "Tata letak"
},
"field": {
"hide": "Sembunyikan",
@@ -186,13 +294,22 @@
"addSelectOption": "Tambahkan opsi",
"optionTitle": "Opsi",
"addOption": "Tambahkan opsi",
"editProperty": "Ubah properti"
"editProperty": "Ubah properti",
"updatedAtFieldName": "Waktu terakhir diubah",
"createdAtFieldName": "Waktu yang diciptakan",
"checklistFieldName": "Daftar periksa",
"dateFormatDayMonthYear": "Hari bulan tahun",
"newProperty": "Properti baru",
"deleteFieldPromptMessage": "Apa kamu yakin? Properti ini akan dihapus"
},
"row": {
"duplicate": "Duplikasi",
"delete": "Hapus",
"textPlaceholder": "Kosong",
"copyProperty": "Salin properti ke papan klip"
"copyProperty": "Salin properti ke papan klip",
"count": "Menghitung",
"newRow": "Baris baru",
"action": "Tindakan"
},
"selectOption": {
"create": "Buat",
@@ -210,289 +327,274 @@
"panelTitle": "Pilih opsi atau buat baru",
"searchOption": "Cari opsi"
},
"menuName": "Grid"
"menuName": "Grid",
"deleteView": "Yakin ingin menghapus tampilan ini?",
"createView": "Baru",
"textFilter": {
"contains": "Mengandung",
"doesNotContain": "Tidak mengandung",
"endsWith": "Berakhir dengan",
"startWith": "Dimulai dengan",
"is": "Adalah",
"isNot": "Tidak",
"isEmpty": "Kosong",
"isNotEmpty": "Tidak kosong",
"choicechipPrefix": {
"isNot": "Bukan",
"startWith": "Dimulai dengan",
"endWith": "Berakhir dengan",
"isEmpty": "kosong",
"isNotEmpty": "tidak kosong"
}
},
"checkboxFilter": {
"isChecked": "Diperiksa",
"isUnchecked": "Tidak dicentang",
"choicechipPrefix": {
"is": "adalah"
}
},
"checklistFilter": {
"isComplete": "selesai",
"isIncomplted": "tidak lengkap"
},
"singleSelectOptionFilter": {
"is": "Adalah",
"isNot": "Tidak",
"isEmpty": "Kosong",
"isNotEmpty": "Tidak kosong"
},
"multiSelectOptionFilter": {
"contains": "Mengandung",
"doesNotContain": "Tidak mengandung",
"isEmpty": "Kosong",
"isNotEmpty": "Tidak kosong"
},
"sort": {
"ascending": "Naik",
"descending": "Menurun",
"deleteSort": "Hapus urutan",
"addSort": "Tambahkan semacam"
},
"checklist": {
"panelTitle": "Tambahkan item"
},
"referencedGridPrefix": "Pemandangan dari"
},
"document": {
"menuName": "Dokter",
"date": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Pilih Papan untuk ditautkan",
"createANewBoard": "Buat Dewan baru"
},
"grid": {
"selectAGridToLinkTo": "Pilih Grid untuk ditautkan",
"createANewGrid": "Buat Kotak baru"
},
"calendar": {
"selectACalendarToLinkTo": "Pilih Kalender untuk ditautkan",
"createANewCalendar": "Buat Kalender baru"
}
},
"selectionMenu": {
"outline": "Garis besar"
},
"plugins": {
"referencedBoard": "Papan Referensi",
"referencedGrid": "Kisi yang Direferensikan",
"referencedCalendar": "Kalender Referensi",
"autoGeneratorMenuItemName": "Penulis OpenAI",
"autoGeneratorTitleName": "OpenAI: Minta AI untuk menulis apa saja...",
"autoGeneratorLearnMore": "Belajarlah lagi",
"autoGeneratorGenerate": "Menghasilkan",
"autoGeneratorHintText": "Tanya OpenAI...",
"autoGeneratorCantGetOpenAIKey": "Tidak bisa mendapatkan kunci OpenAI",
"autoGeneratorRewrite": "Menulis kembali",
"smartEdit": "Asisten AI",
"openAI": "OpenAI",
"smartEditFixSpelling": "Perbaiki ejaan",
"warning": "⚠️ Respons AI bisa jadi tidak akurat atau menyesatkan.",
"smartEditSummarize": "Meringkaskan",
"smartEditImproveWriting": "Perbaiki tulisan",
"smartEditMakeLonger": "Buat lebih lama",
"smartEditCouldNotFetchResult": "Tidak dapat mengambil hasil dari OpenAI",
"smartEditCouldNotFetchKey": "Tidak dapat mengambil kunci OpenAI",
"smartEditDisabled": "Hubungkan OpenAI di Pengaturan",
"discardResponse": "Apakah Anda ingin membuang respons AI?",
"createInlineMathEquation": "Buat persamaan",
"toggleList": "Beralih Daftar",
"cover": {
"changeCover": "Ganti Sampul",
"colors": "Warna",
"images": "Gambar-gambar",
"clearAll": "Bersihkan semua",
"abstract": "Abstrak",
"addCover": "Tambahkan Penutup",
"addLocalImage": "Tambahkan gambar lokal",
"invalidImageUrl": "URL gambar tidak valid",
"failedToAddImageToGallery": "Gagal menambahkan gambar ke galeri",
"enterImageUrl": "Masukkan URL gambar",
"add": "Menambahkan",
"back": "Kembali",
"saveToGallery": "Simpan ke galeri",
"removeIcon": "Hapus Ikon",
"pasteImageUrl": "Tempel URL gambar",
"or": "ATAU",
"pickFromFiles": "Pilih dari file",
"couldNotFetchImage": "Tidak dapat mengambil gambar",
"imageSavingFailed": "Penyimpanan Gambar Gagal",
"addIcon": "Tambahkan Ikon",
"coverRemoveAlert": "Itu akan dihapus dari sampul setelah dihapus.",
"alertDialogConfirmation": "Apakah anda yakin ingin melanjutkan?"
},
"mathEquation": {
"addMathEquation": "Tambahkan Persamaan Matematika",
"editMathEquation": "Edit Persamaan Matematika"
},
"optionAction": {
"click": "Klik",
"toOpenMenu": " untuk membuka menu",
"delete": "Menghapus",
"duplicate": "Duplikat",
"turnInto": "Berubah menjadi",
"moveUp": "Naik",
"moveDown": "Turunkan",
"color": "Warna",
"align": "Meluruskan",
"left": "Kiri",
"center": "Tengah",
"right": "Benar",
"defaultColor": "Bawaan"
},
"image": {
"copiedToPasteBoard": "Tautan gambar telah disalin ke papan klip"
},
"outline": {
"addHeadingToCreateOutline": "Tambahkan judul untuk membuat daftar isi."
}
},
"textBlock": {
"placeholder": "Ketik '/' untuk perintah"
},
"title": {
"placeholder": "Tanpa judul"
},
"imageBlock": {
"placeholder": "Klik untuk menambahkan gambar",
"upload": {
"label": "Mengunggah",
"placeholder": "Klik untuk mengunggah gambar"
},
"url": {
"label": "URL gambar",
"placeholder": "Masukkan URL gambar"
},
"support": "Batas ukuran gambar adalah 5 MB. Format yang didukung: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Gambar tidak valid",
"invalidImageSize": "Ukuran gambar harus kurang dari 5MB",
"invalidImageFormat": "Format gambar tidak didukung. Format yang didukung: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "URL gambar tidak valid"
}
},
"codeBlock": {
"language": {
"label": "Bahasa",
"placeholder": "Pilih bahasa"
}
},
"inlineLink": {
"placeholder": "Tempel atau ketik tautan",
"url": {
"label": "URL tautan",
"placeholder": "Masukkan URL tautan"
},
"title": {
"label": "Judul Tautan",
"placeholder": "Masukkan judul tautan"
}
}
},
"sideBar": {
"openSidebar": "Open sidebar",
"closeSidebar": "Close sidebar"
},
"moreAction.small": "kecil",
"moreAction": {
"small": "kecil",
"medium": "sedang",
"large": "besar",
"fontSize": "Ukuran huruf",
"import": "Impor",
"moreOptions": "Lebih banyak pilihan"
},
"youCanAlso": "Anda juga bisa",
"and": "Dan",
"blockActions.addBelowTooltip": "Klik untuk menambahkan di bawah",
"blockActions.addAboveCmd": "Alt+klik",
"blockActions.addAboveMacCmd": "Opsi+klik",
"blockActions.addAboveTooltip": "untuk menambahkan di atas",
"signIn.loginAsGuestButtonText": "Memulai",
"moreAction.medium": "sedang",
"moreAction.large": "besar",
"moreAction.fontSize": "Ukuran huruf",
"moreAction.import": "Impor",
"moreAction.moreOptions": "Lebih banyak pilihan",
"importPanel.textAndMarkdown": "Teks & Markdown",
"importPanel.documentFromV010": "Dokumen dari v0.1.0",
"importPanel.databaseFromV010": "Basis data dari v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Basis data",
"disclosureAction.openNewTab": "Buka di tab baru",
"trash.confirmDeleteAll.title": "Yakin ingin menghapus semua laman di Sampah?",
"trash.confirmDeleteAll.caption": "Tindakan ini tidak bisa dibatalkan.",
"trash.confirmRestoreAll.title": "Apakah Anda yakin akan memulihkan semua laman di Sampah?",
"trash.confirmRestoreAll.caption": "Tindakan ini tidak bisa dibatalkan.",
"questionBubble.shortcuts": "Pintasan",
"questionBubble.markdown": "Penurunan harga",
"questionBubble.feedback": "Masukan",
"toolbar.color": "Warna",
"toolbar.addLink": "Tambahkan Tautan",
"toolbar.link": "Tautan",
"tooltip.openAsPage": "Buka sebagai Halaman",
"tooltip.addNewRow": "Tambahkan baris baru",
"tooltip.openMenu": "Klik untuk membuka menu",
"tooltip.dragRow": "Tekan lama untuk menyusun ulang baris",
"tooltip.viewDataBase": "Lihat basis data",
"tooltip.referencePage": "{nama} ini direferensikan",
"tooltip.addBlockBelow": "Tambahkan blok di bawah ini",
"button.Done": "Selesai",
"button.generate": "Menghasilkan",
"button.esc": "ESC",
"button.keep": "Menyimpan",
"button.tryAgain": "Coba lagi",
"button.discard": "Membuang",
"button.replace": "Mengganti",
"button.insertBelow": "Sisipkan Di Bawah",
"button.upload": "Mengunggah",
"button.edit": "Sunting",
"button.delete": "Menghapus",
"button.duplicate": "Duplikat",
"button.done": "Selesai",
"button.putback": "Taruh kembali",
"settings.menu.files": "File",
"settings.menu.supabaseSetting": "Pengaturan Supabase",
"settings.appearance.fontFamily.label": "Keluarga Fon",
"settings.appearance.fontFamily.search": "Mencari",
"settings.appearance.themeUpload.button": "Mengunggah",
"settings.appearance.themeUpload.description": "Unggah tema AppFlowy Anda sendiri menggunakan tombol di bawah ini.",
"settings.appearance.themeUpload.failure": "Tema yang diunggah memiliki format yang tidak valid.",
"settings.appearance.themeUpload.loading": "Harap tunggu sementara kami memvalidasi dan mengunggah tema Anda...",
"settings.appearance.themeUpload.uploadSuccess": "Tema Anda berhasil diunggah",
"settings.appearance.themeUpload.deletionFailure": "Gagal menghapus tema. Cobalah untuk menghapusnya secara manual.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Pilih file .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "Gagal membuka url: {}",
"settings.appearance.theme": "Tema",
"settings.appearance.builtInsLabel": "Tema Bawaan",
"settings.appearance.pluginsLabel": "Plugin",
"settings.files.copy": "Menyalin",
"settings.files.defaultLocation": "Baca file dan lokasi penyimpanan data",
"settings.files.exportData": "Ekspor data Anda",
"settings.files.doubleTapToCopy": "Ketuk dua kali untuk menyalin jalur",
"settings.files.restoreLocation": "Pulihkan ke jalur default AppFlowy",
"settings.files.customizeLocation": "Buka folder lain",
"settings.files.restartApp": "Harap mulai ulang aplikasi agar perubahan diterapkan.",
"settings.files.exportDatabase": "Ekspor basis data",
"settings.files.selectFiles": "Pilih file yang perlu diekspor",
"settings.files.selectAll": "Pilih Semua",
"settings.files.deselectAll": "Batalkan pilihan semua",
"settings.files.createNewFolder": "Buat folder baru",
"settings.files.createNewFolderDesc": "Beritahu kami di mana Anda ingin menyimpan data Anda",
"settings.files.defineWhereYourDataIsStored": "Tentukan di mana data Anda disimpan",
"settings.files.open": "Membuka",
"settings.files.openFolder": "Buka folder yang ada",
"settings.files.openFolderDesc": "Baca dan tulis ke folder AppFlowy Anda yang sudah ada",
"settings.files.folderHintText": "nama folder",
"settings.files.location": "Membuat folder baru",
"settings.files.locationDesc": "Pilih nama untuk folder data AppFlowy Anda",
"settings.files.browser": "Jelajahi",
"settings.files.create": "Membuat",
"settings.files.set": "Mengatur",
"settings.files.folderPath": "Jalur untuk menyimpan folder Anda",
"settings.files.locationCannotBeEmpty": "Jalur tidak boleh kosong",
"settings.files.pathCopiedSnackbar": "Jalur penyimpanan file disalin ke clipboard!",
"settings.files.changeLocationTooltips": "Ubah direktori data",
"settings.files.change": "Mengubah",
"settings.files.openLocationTooltips": "Buka direktori data lain",
"settings.files.openCurrentDataFolder": "Buka direktori data saat ini",
"settings.files.recoverLocationTooltips": "Setel ulang ke direktori data default AppFlowy",
"settings.files.exportFileSuccess": "Ekspor file berhasil!",
"settings.files.exportFileFail": "File ekspor gagal!",
"settings.files.export": "Ekspor",
"settings.user.name": "Nama",
"settings.user.icon": "Ikon",
"settings.user.selectAnIcon": "Pilih ikon",
"settings.user.pleaseInputYourOpenAIKey": "silakan masukkan kunci OpenAI Anda",
"grid.deleteView": "Yakin ingin menghapus tampilan ini?",
"grid.createView": "Baru",
"grid.settings.sort": "Menyortir",
"grid.settings.properties": "Properti",
"grid.settings.reorderPropertiesTooltip": "Seret untuk mengurutkan ulang properti",
"grid.settings.group": "Kelompok",
"grid.settings.addFilter": "Tambahkan Filter",
"grid.settings.deleteFilter": "Hapus filter",
"grid.settings.filterBy": "Saring menurut...",
"grid.settings.typeAValue": "Ketik nilai...",
"grid.settings.layout": "Tata letak",
"grid.settings.databaseLayout": "Tata letak",
"grid.textFilter.contains": "Mengandung",
"grid.textFilter.doesNotContain": "Tidak mengandung",
"grid.textFilter.endsWith": "Berakhir dengan",
"grid.textFilter.startWith": "Dimulai dengan",
"grid.textFilter.is": "Adalah",
"grid.textFilter.isNot": "Tidak",
"grid.textFilter.isEmpty": "Kosong",
"grid.textFilter.isNotEmpty": "Tidak kosong",
"grid.textFilter.choicechipPrefix.isNot": "Bukan",
"grid.textFilter.choicechipPrefix.startWith": "Dimulai dengan",
"grid.textFilter.choicechipPrefix.endWith": "Berakhir dengan",
"grid.textFilter.choicechipPrefix.isEmpty": "kosong",
"grid.textFilter.choicechipPrefix.isNotEmpty": "tidak kosong",
"grid.checkboxFilter.isChecked": "Diperiksa",
"grid.checkboxFilter.isUnchecked": "Tidak dicentang",
"grid.checkboxFilter.choicechipPrefix.is": "adalah",
"grid.checklistFilter.isComplete": "selesai",
"grid.checklistFilter.isIncomplted": "tidak lengkap",
"grid.singleSelectOptionFilter.is": "Adalah",
"grid.singleSelectOptionFilter.isNot": "Tidak",
"grid.singleSelectOptionFilter.isEmpty": "Kosong",
"grid.singleSelectOptionFilter.isNotEmpty": "Tidak kosong",
"grid.multiSelectOptionFilter.contains": "Mengandung",
"grid.multiSelectOptionFilter.doesNotContain": "Tidak mengandung",
"grid.multiSelectOptionFilter.isEmpty": "Kosong",
"grid.multiSelectOptionFilter.isNotEmpty": "Tidak kosong",
"grid.field.updatedAtFieldName": "Waktu terakhir diubah",
"grid.field.createdAtFieldName": "Waktu yang diciptakan",
"grid.field.checklistFieldName": "Daftar periksa",
"grid.field.dateFormatDayMonthYear": "Hari bulan tahun",
"grid.field.newProperty": "Properti baru",
"grid.field.deleteFieldPromptMessage": "Apa kamu yakin? Properti ini akan dihapus",
"grid.sort.ascending": "Naik",
"grid.sort.descending": "Menurun",
"grid.sort.deleteSort": "Hapus urutan",
"grid.sort.addSort": "Tambahkan semacam",
"grid.row.count": "Menghitung",
"grid.row.newRow": "Baris baru",
"grid.row.action": "Tindakan",
"grid.checklist.panelTitle": "Tambahkan item",
"grid.referencedGridPrefix": "Pemandangan dari",
"document.slashMenu.board.selectABoardToLinkTo": "Pilih Papan untuk ditautkan",
"document.slashMenu.board.createANewBoard": "Buat Dewan baru",
"document.slashMenu.grid.selectAGridToLinkTo": "Pilih Grid untuk ditautkan",
"document.slashMenu.grid.createANewGrid": "Buat Kotak baru",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Pilih Kalender untuk ditautkan",
"document.slashMenu.calendar.createANewCalendar": "Buat Kalender baru",
"document.selectionMenu.outline": "Garis besar",
"document.plugins.referencedBoard": "Papan Referensi",
"document.plugins.referencedGrid": "Kisi yang Direferensikan",
"document.plugins.referencedCalendar": "Kalender Referensi",
"document.plugins.autoGeneratorMenuItemName": "Penulis OpenAI",
"document.plugins.autoGeneratorTitleName": "OpenAI: Minta AI untuk menulis apa saja...",
"document.plugins.autoGeneratorLearnMore": "Belajarlah lagi",
"document.plugins.autoGeneratorGenerate": "Menghasilkan",
"document.plugins.autoGeneratorHintText": "Tanya OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Tidak bisa mendapatkan kunci OpenAI",
"document.plugins.autoGeneratorRewrite": "Menulis kembali",
"document.plugins.smartEdit": "Asisten AI",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Perbaiki ejaan",
"document.plugins.warning": "⚠️ Respons AI bisa jadi tidak akurat atau menyesatkan.",
"document.plugins.smartEditSummarize": "Meringkaskan",
"document.plugins.smartEditImproveWriting": "Perbaiki tulisan",
"document.plugins.smartEditMakeLonger": "Buat lebih lama",
"document.plugins.smartEditCouldNotFetchResult": "Tidak dapat mengambil hasil dari OpenAI",
"document.plugins.smartEditCouldNotFetchKey": "Tidak dapat mengambil kunci OpenAI",
"document.plugins.smartEditDisabled": "Hubungkan OpenAI di Pengaturan",
"document.plugins.discardResponse": "Apakah Anda ingin membuang respons AI?",
"document.plugins.createInlineMathEquation": "Buat persamaan",
"document.plugins.toggleList": "Beralih Daftar",
"document.plugins.cover.changeCover": "Ganti Sampul",
"document.plugins.cover.colors": "Warna",
"document.plugins.cover.images": "Gambar-gambar",
"document.plugins.cover.clearAll": "Bersihkan semua",
"document.plugins.cover.abstract": "Abstrak",
"document.plugins.cover.addCover": "Tambahkan Penutup",
"document.plugins.cover.addLocalImage": "Tambahkan gambar lokal",
"document.plugins.cover.invalidImageUrl": "URL gambar tidak valid",
"document.plugins.cover.failedToAddImageToGallery": "Gagal menambahkan gambar ke galeri",
"document.plugins.cover.enterImageUrl": "Masukkan URL gambar",
"document.plugins.cover.add": "Menambahkan",
"document.plugins.cover.back": "Kembali",
"document.plugins.cover.saveToGallery": "Simpan ke galeri",
"document.plugins.cover.removeIcon": "Hapus Ikon",
"document.plugins.cover.pasteImageUrl": "Tempel URL gambar",
"document.plugins.cover.or": "ATAU",
"document.plugins.cover.pickFromFiles": "Pilih dari file",
"document.plugins.cover.couldNotFetchImage": "Tidak dapat mengambil gambar",
"document.plugins.cover.imageSavingFailed": "Penyimpanan Gambar Gagal",
"document.plugins.cover.addIcon": "Tambahkan Ikon",
"document.plugins.cover.coverRemoveAlert": "Itu akan dihapus dari sampul setelah dihapus.",
"document.plugins.cover.alertDialogConfirmation": "Apakah anda yakin ingin melanjutkan?",
"document.plugins.mathEquation.addMathEquation": "Tambahkan Persamaan Matematika",
"document.plugins.mathEquation.editMathEquation": "Edit Persamaan Matematika",
"document.plugins.optionAction.click": "Klik",
"document.plugins.optionAction.toOpenMenu": " untuk membuka menu",
"document.plugins.optionAction.delete": "Menghapus",
"document.plugins.optionAction.duplicate": "Duplikat",
"document.plugins.optionAction.turnInto": "Berubah menjadi",
"document.plugins.optionAction.moveUp": "Naik",
"document.plugins.optionAction.moveDown": "Turunkan",
"document.plugins.optionAction.color": "Warna",
"document.plugins.optionAction.align": "Meluruskan",
"document.plugins.optionAction.left": "Kiri",
"document.plugins.optionAction.center": "Tengah",
"document.plugins.optionAction.right": "Benar",
"document.plugins.optionAction.defaultColor": "Bawaan",
"document.plugins.image.copiedToPasteBoard": "Tautan gambar telah disalin ke papan klip",
"document.plugins.outline.addHeadingToCreateOutline": "Tambahkan judul untuk membuat daftar isi.",
"document.textBlock.placeholder": "Ketik '/' untuk perintah",
"document.title.placeholder": "Tanpa judul",
"document.imageBlock.placeholder": "Klik untuk menambahkan gambar",
"document.imageBlock.upload.label": "Mengunggah",
"document.imageBlock.upload.placeholder": "Klik untuk mengunggah gambar",
"document.imageBlock.url.label": "URL gambar",
"document.imageBlock.url.placeholder": "Masukkan URL gambar",
"document.imageBlock.support": "Batas ukuran gambar adalah 5 MB. Format yang didukung: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Gambar tidak valid",
"document.imageBlock.error.invalidImageSize": "Ukuran gambar harus kurang dari 5MB",
"document.imageBlock.error.invalidImageFormat": "Format gambar tidak didukung. Format yang didukung: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "URL gambar tidak valid",
"document.codeBlock.language.label": "Bahasa",
"document.codeBlock.language.placeholder": "Pilih bahasa",
"document.inlineLink.placeholder": "Tempel atau ketik tautan",
"document.inlineLink.url.label": "URL tautan",
"document.inlineLink.url.placeholder": "Masukkan URL tautan",
"document.inlineLink.title.label": "Judul Tautan",
"document.inlineLink.title.placeholder": "Masukkan judul tautan",
"board.column.create_new_card": "Baru",
"board.menuName": "Papan",
"board.referencedBoardPrefix": "Pemandangan dari",
"calendar.menuName": "Kalender",
"calendar.defaultNewCalendarTitle": "Tanpa judul",
"calendar.navigation.today": "Hari ini",
"calendar.navigation.jumpToday": "Lompat ke Hari Ini",
"calendar.navigation.previousMonth": "Bulan sebelumnya",
"calendar.navigation.nextMonth": "Bulan depan",
"calendar.settings.showWeekNumbers": "Tampilkan nomor minggu",
"calendar.settings.showWeekends": "Tampilkan akhir pekan",
"calendar.settings.firstDayOfWeek": "Mulai minggu",
"calendar.settings.layoutDateField": "Tata letak kalender oleh",
"calendar.settings.noDateTitle": "Tidak ada tanggal",
"calendar.settings.noDateHint": "Acara yang tidak dijadwalkan akan muncul di sini",
"calendar.settings.clickToAdd": "Klik untuk menambahkan ke kalender",
"calendar.settings.name": "Tata letak kalender",
"calendar.referencedCalendarPrefix": "Pemandangan dari",
"errorDialog.title": "Kesalahan AppFlowy",
"errorDialog.howToFixFallback": "Kami mohon maaf atas ketidaknyamanan ini! Kirimkan masalah di halaman GitHub kami yang menjelaskan kesalahan Anda.",
"errorDialog.github": "Lihat di GitHub",
"search.label": "Mencari",
"search.placeholder.actions": "Tindakan penelusuran...",
"message.copy.success": "Disalin!",
"message.copy.fail": "Tidak dapat menyalin",
"blockActions": {
"addBelowTooltip": "Klik untuk menambahkan di bawah",
"addAboveCmd": "Alt+klik",
"addAboveMacCmd": "Opsi+klik",
"addAboveTooltip": "untuk menambahkan di atas"
},
"importPanel": {
"textAndMarkdown": "Teks & Markdown",
"documentFromV010": "Dokumen dari v0.1.0",
"databaseFromV010": "Basis data dari v0.1.0",
"csv": "CSV",
"database": "Basis data"
},
"board": {
"column": {
"create_new_card": "Baru"
},
"menuName": "Papan",
"referencedBoardPrefix": "Pemandangan dari"
},
"calendar": {
"menuName": "Kalender",
"defaultNewCalendarTitle": "Tanpa judul",
"navigation": {
"today": "Hari ini",
"jumpToday": "Lompat ke Hari Ini",
"previousMonth": "Bulan sebelumnya",
"nextMonth": "Bulan depan"
},
"settings": {
"showWeekNumbers": "Tampilkan nomor minggu",
"showWeekends": "Tampilkan akhir pekan",
"firstDayOfWeek": "Mulai minggu",
"layoutDateField": "Tata letak kalender oleh",
"noDateTitle": "Tidak ada tanggal",
"noDateHint": "Acara yang tidak dijadwalkan akan muncul di sini",
"clickToAdd": "Klik untuk menambahkan ke kalender",
"name": "Tata letak kalender"
},
"referencedCalendarPrefix": "Pemandangan dari"
},
"errorDialog": {
"title": "Kesalahan AppFlowy",
"howToFixFallback": "Kami mohon maaf atas ketidaknyamanan ini! Kirimkan masalah di halaman GitHub kami yang menjelaskan kesalahan Anda.",
"github": "Lihat di GitHub"
},
"search": {
"label": "Mencari",
"placeholder": {
"actions": "Tindakan penelusuran..."
}
},
"message": {
"copy": {
"success": "Disalin!",
"fail": "Tidak dapat menyalin"
}
},
"unSupportBlock": "Versi saat ini tidak mendukung Blok ini.",
"views.deleteContentTitle": "Anda yakin ingin menghapus {pageType}?",
"views.deleteContentCaption": "jika Anda menghapus {pageType} ini, Anda dapat memulihkannya dari sampah."
"views": {
"deleteContentTitle": "Anda yakin ingin menghapus {pageType}?",
"deleteContentCaption": "jika Anda menghapus {pageType} ini, Anda dapat memulihkannya dari sampah."
}
}
+447 -331
View File
@@ -27,7 +27,8 @@
"passwordHint": "Password",
"dontHaveAnAccount": "Non hai un account?",
"repeatPasswordEmptyError": "La password ripetuta non può essere vuota",
"unmatchedPasswordError": "La password ripetuta non è uguale alla password"
"unmatchedPasswordError": "La password ripetuta non è uguale alla password",
"loginAsGuestButtonText": "Iniziare"
},
"workspace": {
"create": "Crea spazio di lavoro",
@@ -43,7 +44,8 @@
"disclosureAction": {
"rename": "Rinomina",
"delete": "Cancella",
"duplicate": "Duplica"
"duplicate": "Duplica",
"openNewTab": "Apri in una nuova scheda"
},
"blankPageTitle": "Pagina vuota",
"newPageText": "Nuova pagina",
@@ -55,6 +57,14 @@
"fileName": "Nome file",
"lastModified": "Ultima Modifica",
"created": "Creato"
},
"confirmDeleteAll": {
"title": "Sei sicuro di eliminare tutte le pagine nel Cestino?",
"caption": "Questa azione non può essere annullata."
},
"confirmRestoreAll": {
"title": "Sei sicuro di ripristinare tutte le pagine nel Cestino?",
"caption": "Questa azione non può essere annullata."
}
},
"deletePagePrompt": {
@@ -70,7 +80,10 @@
"name": "Informazioni di debug",
"success": "Informazioni di debug copiate negli appunti!",
"fail": "Impossibile copiare le informazioni di debug negli appunti"
}
},
"shortcuts": "Scorciatoie",
"markdown": "Ribasso",
"feedback": "Feedback"
},
"menuAppHeader": {
"addPageTooltip": "Aggiungi velocemente una pagina all'interno",
@@ -90,11 +103,21 @@
"inlineCode": "Codice in linea",
"quote": "Cita Blocco",
"header": "intestazione",
"highlight": "Evidenziare"
"highlight": "Evidenziare",
"color": "Colore",
"addLink": "Aggiungi collegamento",
"link": "Collegamento"
},
"tooltip": {
"lightMode": "Passa alla modalità Chiara",
"darkMode": "Passa alla modalità Scura"
"darkMode": "Passa alla modalità Scura",
"openAsPage": "Apri come pagina",
"addNewRow": "Aggiungi una nuova riga",
"openMenu": "Fare clic per aprire il menu",
"dragRow": "Premere a lungo per riordinare la riga",
"viewDataBase": "Visualizza banca dati",
"referencePage": "Questo {nome} è referenziato",
"addBlockBelow": "Aggiungi un blocco qui sotto"
},
"contactsPage": {
"title": "Contatti",
@@ -108,7 +131,21 @@
"signIn": "Accedi",
"signOut": "Esci",
"complete": "Completa",
"save": "Salva"
"save": "Salva",
"Done": "Fatto",
"generate": "creare",
"esc": "ESC",
"keep": "Mantenere",
"tryAgain": "Riprova",
"discard": "Scartare",
"replace": "Sostituire",
"insertBelow": "Inserisci sotto",
"upload": "Caricamento",
"edit": "Modificare",
"delete": "Eliminare",
"duplicate": "Duplicare",
"done": "Fatto",
"putback": "Rimettere a posto"
},
"label": {
"welcome": "Benvenuto!",
@@ -135,7 +172,10 @@
"menu": {
"appearance": "Aspetto",
"language": "Lingua",
"open": "aprire le impostazioni"
"open": "aprire le impostazioni",
"user": "Utente",
"files": "File",
"supabaseSetting": "Impostazione Supabase"
},
"appearance": {
"themeMode": {
@@ -143,341 +183,417 @@
"light": "Modalità Chiara",
"dark": "Modalità Scura",
"system": "Adapt to System"
}
},
"fontFamily": {
"label": "Famiglia di font",
"search": "Ricerca"
},
"themeUpload": {
"button": "Caricamento",
"description": "Carica il tuo tema AppFlowy utilizzando il pulsante in basso.",
"failure": "Il tema che è stato caricato aveva un formato non valido.",
"loading": "Attendi mentre convalidiamo e carichiamo il tuo tema...",
"uploadSuccess": "Il tuo tema è stato caricato correttamente",
"deletionFailure": "Impossibile eliminare il tema. Prova a eliminarlo manualmente.",
"filePickerDialogTitle": "Scegli un file .flowy_plugin",
"urlUploadFailure": "Impossibile aprire l'URL: {}"
},
"theme": "Tema",
"builtInsLabel": "Temi incorporati",
"pluginsLabel": "Plugin"
},
"files": {
"copy": "copia",
"defaultLocation": "Leggi i file e la posizione di archiviazione dei dati",
"exportData": "Esporta i tuoi dati",
"doubleTapToCopy": "Tocca due volte per copiare il percorso",
"restoreLocation": "Ripristina nel percorso predefinito di AppFlowy",
"customizeLocation": "Apri un'altra cartella",
"restartApp": "Riavvia l'app per rendere effettive le modifiche.",
"exportDatabase": "Esporta banca dati",
"selectFiles": "Seleziona i file che devono essere esportati",
"selectAll": "Seleziona tutto",
"deselectAll": "Deselezionare tutto",
"createNewFolder": "Crea una nuova cartella",
"createNewFolderDesc": "Dicci dove vuoi salvare i tuoi dati",
"defineWhereYourDataIsStored": "Definisci dove sono archiviati i tuoi dati",
"open": "Aprire",
"openFolder": "Apri una cartella esistente",
"openFolderDesc": "Leggilo e scrivilo nella tua cartella AppFlowy esistente",
"folderHintText": "nome della cartella",
"location": "Creazione di una nuova cartella",
"locationDesc": "Scegli un nome per la cartella dei dati di AppFlowy",
"browser": "Navigare",
"create": "Creare",
"set": "Impostato",
"folderPath": "Percorso per memorizzare la tua cartella",
"locationCannotBeEmpty": "Il percorso non può essere vuoto",
"pathCopiedSnackbar": "Percorso di archiviazione file copiato negli appunti!",
"changeLocationTooltips": "Modificare la directory dei dati",
"change": "Modifica",
"openLocationTooltips": "Apri un'altra directory di dati",
"openCurrentDataFolder": "Apre la directory dei dati corrente",
"recoverLocationTooltips": "Ripristina la directory dei dati predefinita di AppFlowy",
"exportFileSuccess": "Esporta file con successo!",
"exportFileFail": "File di esportazione non riuscito!",
"export": "Esportare"
},
"user": {
"name": "Nome",
"icon": "Icona",
"selectAnIcon": "Seleziona un'icona",
"pleaseInputYourOpenAIKey": "inserisci la tua chiave OpenAI"
}
},
"grid": {
"menuName": "Griglia"
"menuName": "Griglia",
"deleteView": "Sei sicuro di voler eliminare questa vista?",
"createView": "Nuovo",
"settings": {
"filter": "Filtro",
"sort": "Ordinare",
"sortBy": "Ordina per",
"properties": "Proprietà",
"reorderPropertiesTooltip": "Trascina per riordinare le proprietà",
"group": "Gruppo",
"addFilter": "Aggiungi filtro",
"deleteFilter": "Elimina filtro",
"filterBy": "Filtra per...",
"typeAValue": "Digita un valore...",
"layout": "Disposizione",
"databaseLayout": "Disposizione"
},
"textFilter": {
"contains": "Contiene",
"doesNotContain": "Non contiene",
"endsWith": "Finisce con",
"startWith": "Inizia con",
"is": "È",
"isNot": "Non è",
"isEmpty": "È vuoto",
"isNotEmpty": "Non è vuoto",
"choicechipPrefix": {
"isNot": "Non",
"startWith": "Inizia con",
"endWith": "Finisce con",
"isEmpty": "è vuoto",
"isNotEmpty": "non è vuoto"
}
},
"checkboxFilter": {
"isChecked": "Controllato",
"isUnchecked": "Deselezionato",
"choicechipPrefix": {
"is": "È"
}
},
"checklistFilter": {
"isComplete": "è completo",
"isIncomplted": "è incompleto"
},
"singleSelectOptionFilter": {
"is": "È",
"isNot": "Non è",
"isEmpty": "È vuoto",
"isNotEmpty": "Non è vuoto"
},
"multiSelectOptionFilter": {
"contains": "Contiene",
"doesNotContain": "Non contiene",
"isEmpty": "È vuoto",
"isNotEmpty": "Non è vuoto"
},
"field": {
"hide": "Nascondere",
"insertLeft": "Inserisci a sinistra",
"insertRight": "Inserisci a destra",
"duplicate": "Duplicare",
"delete": "Eliminare",
"textFieldName": "Testo",
"checkboxFieldName": "Casella di controllo",
"dateFieldName": "Data",
"updatedAtFieldName": "Ora dell'ultima modifica",
"createdAtFieldName": "Tempo creato",
"numberFieldName": "Numeri",
"singleSelectFieldName": "Selezionare",
"multiSelectFieldName": "Selezione multipla",
"urlFieldName": "URL",
"checklistFieldName": "Lista di controllo",
"numberFormat": "Formato numerico",
"dateFormat": "Formato data",
"includeTime": "Includi il tempo",
"dateFormatFriendly": "Mese giorno anno",
"dateFormatISO": "Anno mese giorno",
"dateFormatLocal": "Mese giorno anno",
"dateFormatUS": "Anno mese giorno",
"dateFormatDayMonthYear": "Giorno mese Anno",
"timeFormat": "Formato orario",
"invalidTimeFormat": "Formato non valido",
"timeFormatTwelveHour": "12 ore",
"timeFormatTwentyFourHour": "24 ore",
"addSelectOption": "Aggiungi un'opzione",
"optionTitle": "Opzioni",
"addOption": "Aggiungi opzione",
"editProperty": "Modifica proprietà",
"newProperty": "Nuova proprietà",
"deleteFieldPromptMessage": "Sei sicuro? Questa proprietà verrà eliminata"
},
"sort": {
"ascending": "Ascendente",
"descending": "Discendente",
"deleteSort": "Elimina ordinamento",
"addSort": "Aggiungi ordinamento"
},
"row": {
"duplicate": "Duplicare",
"delete": "Eliminare",
"textPlaceholder": "Vuoto",
"copyProperty": "Proprietà copiata negli appunti",
"count": "Contare",
"newRow": "Nuova fila",
"action": "Azione"
},
"selectOption": {
"create": "Creare",
"purpleColor": "Viola",
"pinkColor": "Rosa",
"lightPinkColor": "Rosa chiaro",
"orangeColor": "Arancia",
"yellowColor": "Giallo",
"limeColor": "Lime",
"greenColor": "Verde",
"aquaColor": "Acqua",
"blueColor": "Blu",
"deleteTag": "Elimina etichetta",
"colorPanelTitle": "Colori",
"panelTitle": "Seleziona un'opzione o creane una",
"searchOption": "Cerca un'opzione"
},
"checklist": {
"panelTitle": "Aggiungi un elemento"
},
"referencedGridPrefix": "Vista di"
},
"document": {
"menuName": "Documento"
"menuName": "Documento",
"date": {
"timeHintTextInTwelveHour": "13:00",
"timeHintTextInTwentyFourHour": "13:00"
},
"slashMenu": {
"board": {
"selectABoardToLinkTo": "Seleziona una bacheca a cui collegarti",
"createANewBoard": "Crea una nuova bacheca"
},
"grid": {
"selectAGridToLinkTo": "Seleziona una griglia a cui collegarti",
"createANewGrid": "Crea una nuova griglia"
},
"calendar": {
"selectACalendarToLinkTo": "Seleziona un calendario a cui collegarti",
"createANewCalendar": "Crea un nuovo calendario"
}
},
"selectionMenu": {
"outline": "Contorno"
},
"plugins": {
"referencedBoard": "Consiglio referenziato",
"referencedGrid": "Griglia di riferimento",
"referencedCalendar": "Calendario referenziato",
"autoGeneratorMenuItemName": "Scrittore OpenAI",
"autoGeneratorTitleName": "OpenAI: chiedi all'AI di scrivere qualsiasi cosa...",
"autoGeneratorLearnMore": "Saperne di più",
"autoGeneratorGenerate": "creare",
"autoGeneratorHintText": "Chiedi a OpenAI...",
"autoGeneratorCantGetOpenAIKey": "Impossibile ottenere la chiave OpenAI",
"autoGeneratorRewrite": "Riscrivere",
"smartEdit": "Assistenti AI",
"openAI": "OpenAI",
"smartEditFixSpelling": "Correggi l'ortografia",
"warning": "⚠️ Le risposte AI possono essere imprecise o fuorvianti.",
"smartEditSummarize": "Riassumere",
"smartEditImproveWriting": "Migliora la scrittura",
"smartEditMakeLonger": "Rendi più lungo",
"smartEditCouldNotFetchResult": "Impossibile recuperare il risultato da OpenAI",
"smartEditCouldNotFetchKey": "Impossibile recuperare la chiave OpenAI",
"smartEditDisabled": "Connetti OpenAI in Impostazioni",
"discardResponse": "Vuoi scartare le risposte AI?",
"createInlineMathEquation": "Crea un'equazione",
"toggleList": "Elenco alternato",
"cover": {
"changeCover": "Cambiamento di copertura",
"colors": "Colori",
"images": "immagini",
"clearAll": "Cancella tutto",
"abstract": "Astratto",
"addCover": "Aggiungi copertina",
"addLocalImage": "Aggiungi immagine locale",
"invalidImageUrl": "URL dell'immagine non valido",
"failedToAddImageToGallery": "Impossibile aggiungere l'immagine alla galleria",
"enterImageUrl": "Inserisci l'URL dell'immagine",
"add": "Aggiungere",
"back": "Indietro",
"saveToGallery": "Salva nella galleria",
"removeIcon": "Rimuovi icona",
"pasteImageUrl": "Incolla l'URL dell'immagine",
"or": "O",
"pickFromFiles": "Scegli dai file",
"couldNotFetchImage": "Impossibile recuperare l'immagine",
"imageSavingFailed": "Salvataggio dell'immagine non riuscito",
"addIcon": "Aggiungi icona",
"coverRemoveAlert": "Verrà rimosso dalla copertura dopo essere stato eliminato.",
"alertDialogConfirmation": "Sei sicuro di voler continuare?"
},
"mathEquation": {
"addMathEquation": "Aggiungi equazione matematica",
"editMathEquation": "Modifica equazione matematica"
},
"optionAction": {
"click": "Clic",
"toOpenMenu": " per aprire il menu",
"delete": "Eliminare",
"duplicate": "Duplicare",
"turnInto": "Trasforma in",
"moveUp": "Andare avanti",
"moveDown": "Abbassati",
"color": "Colore",
"align": "Allineare",
"left": "Sinistra",
"center": "Centro",
"right": "Giusto",
"defaultColor": "Predefinito"
},
"image": {
"copiedToPasteBoard": "Il link dell'immagine è stato copiato negli appunti"
},
"outline": {
"addHeadingToCreateOutline": "Aggiungi intestazioni per creare un sommario."
}
},
"textBlock": {
"placeholder": "Digita '/' per i comandi"
},
"title": {
"placeholder": "Senza titolo"
},
"imageBlock": {
"placeholder": "Fare clic per aggiungere l'immagine",
"upload": {
"label": "Caricamento",
"placeholder": "Clicca per caricare l'immagine"
},
"url": {
"label": "URL dell'immagine",
"placeholder": "Inserisci l'URL dell'immagine"
},
"support": "Il limite della dimensione dell'immagine è di 5 MB. Formati supportati: JPEG, PNG, GIF, SVG",
"error": {
"invalidImage": "Immagine non valida",
"invalidImageSize": "La dimensione dell'immagine deve essere inferiore a 5 MB",
"invalidImageFormat": "Il formato dell'immagine non è supportato. Formati supportati: JPEG, PNG, GIF, SVG",
"invalidImageUrl": "URL dell'immagine non valido"
}
},
"codeBlock": {
"language": {
"label": "Lingua",
"placeholder": "Seleziona la lingua"
}
},
"inlineLink": {
"placeholder": "Incolla o digita un link",
"url": {
"label": "URL di collegamento",
"placeholder": "Inserisci l'URL del collegamento"
},
"title": {
"label": "Titolo collegamento",
"placeholder": "Inserisci il titolo del collegamento"
}
}
},
"sideBar": {
"openSidebar": "Open sidebar",
"closeSidebar": "Close sidebar"
},
"moreAction.small": "piccolo",
"moreAction": {
"small": "piccolo",
"medium": "medio",
"large": "grande",
"fontSize": "Dimensione del font",
"import": "Importare",
"moreOptions": "Più opzioni"
},
"youCanAlso": "Puoi anche",
"and": "E",
"blockActions.addBelowTooltip": "Fare clic per aggiungere di seguito",
"blockActions.addAboveCmd": "Alt+clic",
"blockActions.addAboveMacCmd": "Opzione+clic",
"blockActions.addAboveTooltip": "aggiungere sopra",
"signIn.loginAsGuestButtonText": "Iniziare",
"moreAction.medium": "medio",
"moreAction.large": "grande",
"moreAction.fontSize": "Dimensione del font",
"moreAction.import": "Importare",
"moreAction.moreOptions": "Più opzioni",
"importPanel.textAndMarkdown": "Testo e markdown",
"importPanel.documentFromV010": "Documento dalla v0.1.0",
"importPanel.databaseFromV010": "Database dalla v0.1.0",
"importPanel.csv": "CSV",
"importPanel.database": "Banca dati",
"disclosureAction.openNewTab": "Apri in una nuova scheda",
"trash.confirmDeleteAll.title": "Sei sicuro di eliminare tutte le pagine nel Cestino?",
"trash.confirmDeleteAll.caption": "Questa azione non può essere annullata.",
"trash.confirmRestoreAll.title": "Sei sicuro di ripristinare tutte le pagine nel Cestino?",
"trash.confirmRestoreAll.caption": "Questa azione non può essere annullata.",
"questionBubble.shortcuts": "Scorciatoie",
"questionBubble.markdown": "Ribasso",
"questionBubble.feedback": "Feedback",
"toolbar.color": "Colore",
"toolbar.addLink": "Aggiungi collegamento",
"toolbar.link": "Collegamento",
"tooltip.openAsPage": "Apri come pagina",
"tooltip.addNewRow": "Aggiungi una nuova riga",
"tooltip.openMenu": "Fare clic per aprire il menu",
"tooltip.dragRow": "Premere a lungo per riordinare la riga",
"tooltip.viewDataBase": "Visualizza banca dati",
"tooltip.referencePage": "Questo {nome} è referenziato",
"tooltip.addBlockBelow": "Aggiungi un blocco qui sotto",
"notifications.export.markdown": "Nota esportata in Markdown",
"notifications.export.path": "Documenti/fluido",
"button.Done": "Fatto",
"button.generate": "creare",
"button.esc": "ESC",
"button.keep": "Mantenere",
"button.tryAgain": "Riprova",
"button.discard": "Scartare",
"button.replace": "Sostituire",
"button.insertBelow": "Inserisci sotto",
"button.upload": "Caricamento",
"button.edit": "Modificare",
"button.delete": "Eliminare",
"button.duplicate": "Duplicare",
"button.done": "Fatto",
"button.putback": "Rimettere a posto",
"settings.menu.user": "Utente",
"settings.menu.files": "File",
"settings.menu.supabaseSetting": "Impostazione Supabase",
"settings.appearance.fontFamily.label": "Famiglia di font",
"settings.appearance.fontFamily.search": "Ricerca",
"settings.appearance.themeUpload.button": "Caricamento",
"settings.appearance.themeUpload.description": "Carica il tuo tema AppFlowy utilizzando il pulsante in basso.",
"settings.appearance.themeUpload.failure": "Il tema che è stato caricato aveva un formato non valido.",
"settings.appearance.themeUpload.loading": "Attendi mentre convalidiamo e carichiamo il tuo tema...",
"settings.appearance.themeUpload.uploadSuccess": "Il tuo tema è stato caricato correttamente",
"settings.appearance.themeUpload.deletionFailure": "Impossibile eliminare il tema. Prova a eliminarlo manualmente.",
"settings.appearance.themeUpload.filePickerDialogTitle": "Scegli un file .flowy_plugin",
"settings.appearance.themeUpload.urlUploadFailure": "Impossibile aprire l'URL: {}",
"settings.appearance.theme": "Tema",
"settings.appearance.builtInsLabel": "Temi incorporati",
"settings.appearance.pluginsLabel": "Plugin",
"settings.files.copy": "copia",
"settings.files.defaultLocation": "Leggi i file e la posizione di archiviazione dei dati",
"settings.files.exportData": "Esporta i tuoi dati",
"settings.files.doubleTapToCopy": "Tocca due volte per copiare il percorso",
"settings.files.restoreLocation": "Ripristina nel percorso predefinito di AppFlowy",
"settings.files.customizeLocation": "Apri un'altra cartella",
"settings.files.restartApp": "Riavvia l'app per rendere effettive le modifiche.",
"settings.files.exportDatabase": "Esporta banca dati",
"settings.files.selectFiles": "Seleziona i file che devono essere esportati",
"settings.files.selectAll": "Seleziona tutto",
"settings.files.deselectAll": "Deselezionare tutto",
"settings.files.createNewFolder": "Crea una nuova cartella",
"settings.files.createNewFolderDesc": "Dicci dove vuoi salvare i tuoi dati",
"settings.files.defineWhereYourDataIsStored": "Definisci dove sono archiviati i tuoi dati",
"settings.files.open": "Aprire",
"settings.files.openFolder": "Apri una cartella esistente",
"settings.files.openFolderDesc": "Leggilo e scrivilo nella tua cartella AppFlowy esistente",
"settings.files.folderHintText": "nome della cartella",
"settings.files.location": "Creazione di una nuova cartella",
"settings.files.locationDesc": "Scegli un nome per la cartella dei dati di AppFlowy",
"settings.files.browser": "Navigare",
"settings.files.create": "Creare",
"settings.files.set": "Impostato",
"settings.files.folderPath": "Percorso per memorizzare la tua cartella",
"settings.files.locationCannotBeEmpty": "Il percorso non può essere vuoto",
"settings.files.pathCopiedSnackbar": "Percorso di archiviazione file copiato negli appunti!",
"settings.files.changeLocationTooltips": "Modificare la directory dei dati",
"settings.files.change": "Modifica",
"settings.files.openLocationTooltips": "Apri un'altra directory di dati",
"settings.files.openCurrentDataFolder": "Apre la directory dei dati corrente",
"settings.files.recoverLocationTooltips": "Ripristina la directory dei dati predefinita di AppFlowy",
"settings.files.exportFileSuccess": "Esporta file con successo!",
"settings.files.exportFileFail": "File di esportazione non riuscito!",
"settings.files.export": "Esportare",
"settings.user.name": "Nome",
"settings.user.icon": "Icona",
"settings.user.selectAnIcon": "Seleziona un'icona",
"settings.user.pleaseInputYourOpenAIKey": "inserisci la tua chiave OpenAI",
"grid.deleteView": "Sei sicuro di voler eliminare questa vista?",
"grid.createView": "Nuovo",
"grid.settings.filter": "Filtro",
"grid.settings.sort": "Ordinare",
"grid.settings.sortBy": "Ordina per",
"grid.settings.properties": "Proprietà",
"grid.settings.reorderPropertiesTooltip": "Trascina per riordinare le proprietà",
"grid.settings.group": "Gruppo",
"grid.settings.addFilter": "Aggiungi filtro",
"grid.settings.deleteFilter": "Elimina filtro",
"grid.settings.filterBy": "Filtra per...",
"grid.settings.typeAValue": "Digita un valore...",
"grid.settings.layout": "Disposizione",
"grid.settings.databaseLayout": "Disposizione",
"grid.textFilter.contains": "Contiene",
"grid.textFilter.doesNotContain": "Non contiene",
"grid.textFilter.endsWith": "Finisce con",
"grid.textFilter.startWith": "Inizia con",
"grid.textFilter.is": "È",
"grid.textFilter.isNot": "Non è",
"grid.textFilter.isEmpty": "È vuoto",
"grid.textFilter.isNotEmpty": "Non è vuoto",
"grid.textFilter.choicechipPrefix.isNot": "Non",
"grid.textFilter.choicechipPrefix.startWith": "Inizia con",
"grid.textFilter.choicechipPrefix.endWith": "Finisce con",
"grid.textFilter.choicechipPrefix.isEmpty": "è vuoto",
"grid.textFilter.choicechipPrefix.isNotEmpty": "non è vuoto",
"grid.checkboxFilter.isChecked": "Controllato",
"grid.checkboxFilter.isUnchecked": "Deselezionato",
"grid.checkboxFilter.choicechipPrefix.is": "È",
"grid.checklistFilter.isComplete": "è completo",
"grid.checklistFilter.isIncomplted": "è incompleto",
"grid.singleSelectOptionFilter.is": "È",
"grid.singleSelectOptionFilter.isNot": "Non è",
"grid.singleSelectOptionFilter.isEmpty": "È vuoto",
"grid.singleSelectOptionFilter.isNotEmpty": "Non è vuoto",
"grid.multiSelectOptionFilter.contains": "Contiene",
"grid.multiSelectOptionFilter.doesNotContain": "Non contiene",
"grid.multiSelectOptionFilter.isEmpty": "È vuoto",
"grid.multiSelectOptionFilter.isNotEmpty": "Non è vuoto",
"grid.field.hide": "Nascondere",
"grid.field.insertLeft": "Inserisci a sinistra",
"grid.field.insertRight": "Inserisci a destra",
"grid.field.duplicate": "Duplicare",
"grid.field.delete": "Eliminare",
"grid.field.textFieldName": "Testo",
"grid.field.checkboxFieldName": "Casella di controllo",
"grid.field.dateFieldName": "Data",
"grid.field.updatedAtFieldName": "Ora dell'ultima modifica",
"grid.field.createdAtFieldName": "Tempo creato",
"grid.field.numberFieldName": "Numeri",
"grid.field.singleSelectFieldName": "Selezionare",
"grid.field.multiSelectFieldName": "Selezione multipla",
"grid.field.urlFieldName": "URL",
"grid.field.checklistFieldName": "Lista di controllo",
"grid.field.numberFormat": "Formato numerico",
"grid.field.dateFormat": "Formato data",
"grid.field.includeTime": "Includi il tempo",
"grid.field.dateFormatFriendly": "Mese giorno anno",
"grid.field.dateFormatISO": "Anno mese giorno",
"grid.field.dateFormatLocal": "Mese giorno anno",
"grid.field.dateFormatUS": "Anno mese giorno",
"grid.field.dateFormatDayMonthYear": "Giorno mese Anno",
"grid.field.timeFormat": "Formato orario",
"grid.field.invalidTimeFormat": "Formato non valido",
"grid.field.timeFormatTwelveHour": "12 ore",
"grid.field.timeFormatTwentyFourHour": "24 ore",
"grid.field.addSelectOption": "Aggiungi un'opzione",
"grid.field.optionTitle": "Opzioni",
"grid.field.addOption": "Aggiungi opzione",
"grid.field.editProperty": "Modifica proprietà",
"grid.field.newProperty": "Nuova proprietà",
"grid.field.deleteFieldPromptMessage": "Sei sicuro? Questa proprietà verrà eliminata",
"grid.sort.ascending": "Ascendente",
"grid.sort.descending": "Discendente",
"grid.sort.deleteSort": "Elimina ordinamento",
"grid.sort.addSort": "Aggiungi ordinamento",
"grid.row.duplicate": "Duplicare",
"grid.row.delete": "Eliminare",
"grid.row.textPlaceholder": "Vuoto",
"grid.row.copyProperty": "Proprietà copiata negli appunti",
"grid.row.count": "Contare",
"grid.row.newRow": "Nuova fila",
"grid.row.action": "Azione",
"grid.selectOption.create": "Creare",
"grid.selectOption.purpleColor": "Viola",
"grid.selectOption.pinkColor": "Rosa",
"grid.selectOption.lightPinkColor": "Rosa chiaro",
"grid.selectOption.orangeColor": "Arancia",
"grid.selectOption.yellowColor": "Giallo",
"grid.selectOption.limeColor": "Lime",
"grid.selectOption.greenColor": "Verde",
"grid.selectOption.aquaColor": "Acqua",
"grid.selectOption.blueColor": "Blu",
"grid.selectOption.deleteTag": "Elimina etichetta",
"grid.selectOption.colorPanelTitle": "Colori",
"grid.selectOption.panelTitle": "Seleziona un'opzione o creane una",
"grid.selectOption.searchOption": "Cerca un'opzione",
"grid.checklist.panelTitle": "Aggiungi un elemento",
"grid.referencedGridPrefix": "Vista di",
"document.date.timeHintTextInTwelveHour": "13:00",
"document.date.timeHintTextInTwentyFourHour": "13:00",
"document.slashMenu.board.selectABoardToLinkTo": "Seleziona una bacheca a cui collegarti",
"document.slashMenu.board.createANewBoard": "Crea una nuova bacheca",
"document.slashMenu.grid.selectAGridToLinkTo": "Seleziona una griglia a cui collegarti",
"document.slashMenu.grid.createANewGrid": "Crea una nuova griglia",
"document.slashMenu.calendar.selectACalendarToLinkTo": "Seleziona un calendario a cui collegarti",
"document.slashMenu.calendar.createANewCalendar": "Crea un nuovo calendario",
"document.selectionMenu.outline": "Contorno",
"document.plugins.referencedBoard": "Consiglio referenziato",
"document.plugins.referencedGrid": "Griglia di riferimento",
"document.plugins.referencedCalendar": "Calendario referenziato",
"document.plugins.autoGeneratorMenuItemName": "Scrittore OpenAI",
"document.plugins.autoGeneratorTitleName": "OpenAI: chiedi all'AI di scrivere qualsiasi cosa...",
"document.plugins.autoGeneratorLearnMore": "Saperne di più",
"document.plugins.autoGeneratorGenerate": "creare",
"document.plugins.autoGeneratorHintText": "Chiedi a OpenAI...",
"document.plugins.autoGeneratorCantGetOpenAIKey": "Impossibile ottenere la chiave OpenAI",
"document.plugins.autoGeneratorRewrite": "Riscrivere",
"document.plugins.smartEdit": "Assistenti AI",
"document.plugins.openAI": "OpenAI",
"document.plugins.smartEditFixSpelling": "Correggi l'ortografia",
"document.plugins.warning": "⚠️ Le risposte AI possono essere imprecise o fuorvianti.",
"document.plugins.smartEditSummarize": "Riassumere",
"document.plugins.smartEditImproveWriting": "Migliora la scrittura",
"document.plugins.smartEditMakeLonger": "Rendi più lungo",
"document.plugins.smartEditCouldNotFetchResult": "Impossibile recuperare il risultato da OpenAI",
"document.plugins.smartEditCouldNotFetchKey": "Impossibile recuperare la chiave OpenAI",
"document.plugins.smartEditDisabled": "Connetti OpenAI in Impostazioni",
"document.plugins.discardResponse": "Vuoi scartare le risposte AI?",
"document.plugins.createInlineMathEquation": "Crea un'equazione",
"document.plugins.toggleList": "Elenco alternato",
"document.plugins.cover.changeCover": "Cambiamento di copertura",
"document.plugins.cover.colors": "Colori",
"document.plugins.cover.images": "immagini",
"document.plugins.cover.clearAll": "Cancella tutto",
"document.plugins.cover.abstract": "Astratto",
"document.plugins.cover.addCover": "Aggiungi copertina",
"document.plugins.cover.addLocalImage": "Aggiungi immagine locale",
"document.plugins.cover.invalidImageUrl": "URL dell'immagine non valido",
"document.plugins.cover.failedToAddImageToGallery": "Impossibile aggiungere l'immagine alla galleria",
"document.plugins.cover.enterImageUrl": "Inserisci l'URL dell'immagine",
"document.plugins.cover.add": "Aggiungere",
"document.plugins.cover.back": "Indietro",
"document.plugins.cover.saveToGallery": "Salva nella galleria",
"document.plugins.cover.removeIcon": "Rimuovi icona",
"document.plugins.cover.pasteImageUrl": "Incolla l'URL dell'immagine",
"document.plugins.cover.or": "O",
"document.plugins.cover.pickFromFiles": "Scegli dai file",
"document.plugins.cover.couldNotFetchImage": "Impossibile recuperare l'immagine",
"document.plugins.cover.imageSavingFailed": "Salvataggio dell'immagine non riuscito",
"document.plugins.cover.addIcon": "Aggiungi icona",
"document.plugins.cover.coverRemoveAlert": "Verrà rimosso dalla copertura dopo essere stato eliminato.",
"document.plugins.cover.alertDialogConfirmation": "Sei sicuro di voler continuare?",
"document.plugins.mathEquation.addMathEquation": "Aggiungi equazione matematica",
"document.plugins.mathEquation.editMathEquation": "Modifica equazione matematica",
"document.plugins.optionAction.click": "Clic",
"document.plugins.optionAction.toOpenMenu": " per aprire il menu",
"document.plugins.optionAction.delete": "Eliminare",
"document.plugins.optionAction.duplicate": "Duplicare",
"document.plugins.optionAction.turnInto": "Trasforma in",
"document.plugins.optionAction.moveUp": "Andare avanti",
"document.plugins.optionAction.moveDown": "Abbassati",
"document.plugins.optionAction.color": "Colore",
"document.plugins.optionAction.align": "Allineare",
"document.plugins.optionAction.left": "Sinistra",
"document.plugins.optionAction.center": "Centro",
"document.plugins.optionAction.right": "Giusto",
"document.plugins.optionAction.defaultColor": "Predefinito",
"document.plugins.image.copiedToPasteBoard": "Il link dell'immagine è stato copiato negli appunti",
"document.plugins.outline.addHeadingToCreateOutline": "Aggiungi intestazioni per creare un sommario.",
"document.textBlock.placeholder": "Digita '/' per i comandi",
"document.title.placeholder": "Senza titolo",
"document.imageBlock.placeholder": "Fare clic per aggiungere l'immagine",
"document.imageBlock.upload.label": "Caricamento",
"document.imageBlock.upload.placeholder": "Clicca per caricare l'immagine",
"document.imageBlock.url.label": "URL dell'immagine",
"document.imageBlock.url.placeholder": "Inserisci l'URL dell'immagine",
"document.imageBlock.support": "Il limite della dimensione dell'immagine è di 5 MB. Formati supportati: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImage": "Immagine non valida",
"document.imageBlock.error.invalidImageSize": "La dimensione dell'immagine deve essere inferiore a 5 MB",
"document.imageBlock.error.invalidImageFormat": "Il formato dell'immagine non è supportato. Formati supportati: JPEG, PNG, GIF, SVG",
"document.imageBlock.error.invalidImageUrl": "URL dell'immagine non valido",
"document.codeBlock.language.label": "Lingua",
"document.codeBlock.language.placeholder": "Seleziona la lingua",
"document.inlineLink.placeholder": "Incolla o digita un link",
"document.inlineLink.url.label": "URL di collegamento",
"document.inlineLink.url.placeholder": "Inserisci l'URL del collegamento",
"document.inlineLink.title.label": "Titolo collegamento",
"document.inlineLink.title.placeholder": "Inserisci il titolo del collegamento",
"board.column.create_new_card": "Nuovo",
"board.menuName": "Asse",
"board.referencedBoardPrefix": "Vista di",
"calendar.menuName": "Calendario",
"calendar.defaultNewCalendarTitle": "Senza titolo",
"calendar.navigation.today": "Oggi",
"calendar.navigation.jumpToday": "Vai a Oggi",
"calendar.navigation.previousMonth": "Il mese scorso",
"calendar.navigation.nextMonth": "Il prossimo mese",
"calendar.settings.showWeekNumbers": "Mostra i numeri della settimana",
"calendar.settings.showWeekends": "Mostra i fine settimana",
"calendar.settings.firstDayOfWeek": "Inizia la settimana",
"calendar.settings.layoutDateField": "Layout calendario per",
"calendar.settings.noDateTitle": "Nessuna data",
"calendar.settings.noDateHint": "Gli eventi non programmati verranno visualizzati qui",
"calendar.settings.clickToAdd": "Fare clic per aggiungere al calendario",
"calendar.settings.name": "Disposizione del calendario",
"calendar.referencedCalendarPrefix": "Vista di",
"errorDialog.title": "Errore AppFlow",
"errorDialog.howToFixFallback": "Ci scusiamo per l'inconveniente! Invia un problema sulla nostra pagina GitHub che descriva il tuo errore.",
"errorDialog.github": "Visualizza su GitHub",
"search.label": "Ricerca",
"search.placeholder.actions": "Cerca azioni...",
"message.copy.success": "Copiato!",
"message.copy.fail": "Impossibile copiare",
"blockActions": {
"addBelowTooltip": "Fare clic per aggiungere di seguito",
"addAboveCmd": "Alt+clic",
"addAboveMacCmd": "Opzione+clic",
"addAboveTooltip": "aggiungere sopra"
},
"importPanel": {
"textAndMarkdown": "Testo e markdown",
"documentFromV010": "Documento dalla v0.1.0",
"databaseFromV010": "Database dalla v0.1.0",
"csv": "CSV",
"database": "Banca dati"
},
"notifications": {
"export": {
"markdown": "Nota esportata in Markdown",
"path": "Documenti/fluido"
}
},
"board": {
"column": {
"create_new_card": "Nuovo"
},
"menuName": "Asse",
"referencedBoardPrefix": "Vista di"
},
"calendar": {
"menuName": "Calendario",
"defaultNewCalendarTitle": "Senza titolo",
"navigation": {
"today": "Oggi",
"jumpToday": "Vai a Oggi",
"previousMonth": "Il mese scorso",
"nextMonth": "Il prossimo mese"
},
"settings": {
"showWeekNumbers": "Mostra i numeri della settimana",
"showWeekends": "Mostra i fine settimana",
"firstDayOfWeek": "Inizia la settimana",
"layoutDateField": "Layout calendario per",
"noDateTitle": "Nessuna data",
"noDateHint": "Gli eventi non programmati verranno visualizzati qui",
"clickToAdd": "Fare clic per aggiungere al calendario",
"name": "Disposizione del calendario"
},
"referencedCalendarPrefix": "Vista di"
},
"errorDialog": {
"title": "Errore AppFlow",
"howToFixFallback": "Ci scusiamo per l'inconveniente! Invia un problema sulla nostra pagina GitHub che descriva il tuo errore.",
"github": "Visualizza su GitHub"
},
"search": {
"label": "Ricerca",
"placeholder": {
"actions": "Cerca azioni..."
}
},
"message": {
"copy": {
"success": "Copiato!",
"fail": "Impossibile copiare"
}
},
"unSupportBlock": "La versione attuale non supporta questo blocco.",
"views.deleteContentTitle": "Sei sicuro di voler eliminare {pageType}?",
"views.deleteContentCaption": "se elimini questo {pageType}, puoi ripristinarlo dal cestino."
"views": {
"deleteContentTitle": "Sei sicuro di voler eliminare {pageType}?",
"deleteContentCaption": "se elimini questo {pageType}, puoi ripristinarlo dal cestino."
}
}
Loaded 100 of 257 files, more files were not shown because too many files have changed in this diff. Show more