Browse Source

Merge branch 'develop' into enhancement/date-filters

pull/5185/head
Wing-Kam Wong 2 years ago
parent
commit
7ddc0c63a6
  1. 6
      .github/workflows/publish-api-docs.yml
  2. 4
      packages/nc-gui/components.d.ts
  3. 21
      packages/nc-gui/lang/ar.json
  4. 21
      packages/nc-gui/lang/bn_IN.json
  5. 21
      packages/nc-gui/lang/cs.json
  6. 21
      packages/nc-gui/lang/da.json
  7. 18
      packages/nc-gui/lang/de.json
  8. 21
      packages/nc-gui/lang/es.json
  9. 21
      packages/nc-gui/lang/eu.json
  10. 21
      packages/nc-gui/lang/fa.json
  11. 21
      packages/nc-gui/lang/fi.json
  12. 21
      packages/nc-gui/lang/fr.json
  13. 21
      packages/nc-gui/lang/he.json
  14. 21
      packages/nc-gui/lang/hi.json
  15. 21
      packages/nc-gui/lang/hr.json
  16. 21
      packages/nc-gui/lang/id.json
  17. 21
      packages/nc-gui/lang/it.json
  18. 21
      packages/nc-gui/lang/ja.json
  19. 21
      packages/nc-gui/lang/ko.json
  20. 21
      packages/nc-gui/lang/lv.json
  21. 21
      packages/nc-gui/lang/nl.json
  22. 21
      packages/nc-gui/lang/no.json
  23. 21
      packages/nc-gui/lang/pl.json
  24. 21
      packages/nc-gui/lang/pt.json
  25. 21
      packages/nc-gui/lang/pt_BR.json
  26. 21
      packages/nc-gui/lang/ru.json
  27. 21
      packages/nc-gui/lang/sk.json
  28. 21
      packages/nc-gui/lang/sl.json
  29. 21
      packages/nc-gui/lang/sv.json
  30. 21
      packages/nc-gui/lang/th.json
  31. 21
      packages/nc-gui/lang/tr.json
  32. 21
      packages/nc-gui/lang/uk.json
  33. 21
      packages/nc-gui/lang/vi.json
  34. 53
      packages/nc-gui/lang/zh-Hans.json
  35. 21
      packages/nc-gui/lang/zh-Hant.json
  36. 11
      packages/nc-gui/utils/errorUtils.ts
  37. 3
      packages/noco-docs/content/en/setup-and-usages/column-types.md
  38. 2
      packages/nocodb-sdk/package.json
  39. 576
      packages/nocodb-sdk/src/lib/Api.ts
  40. 325
      packages/nocodb/package-lock.json
  41. 1
      packages/nocodb/package.json
  42. 9
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/CustomKnex.ts
  43. 8
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/helpers/getAst.ts
  44. 2
      packages/nocodb/src/lib/meta/api/apiTokenApis.ts
  45. 3
      packages/nocodb/src/lib/meta/api/auditApis.ts
  46. 4
      packages/nocodb/src/lib/meta/api/baseApis.ts
  47. 2
      packages/nocodb/src/lib/meta/api/columnApis.ts
  48. 4
      packages/nocodb/src/lib/meta/api/filterApis.ts
  49. 3
      packages/nocodb/src/lib/meta/api/formViewApis.ts
  50. 2
      packages/nocodb/src/lib/meta/api/formViewColumnApis.ts
  51. 3
      packages/nocodb/src/lib/meta/api/galleryViewApis.ts
  52. 2
      packages/nocodb/src/lib/meta/api/gridViewApis.ts
  53. 2
      packages/nocodb/src/lib/meta/api/gridViewColumnApis.ts
  54. 34
      packages/nocodb/src/lib/meta/api/helpers/apiHelpers.ts
  55. 3
      packages/nocodb/src/lib/meta/api/helpers/columnHelpers.ts
  56. 4
      packages/nocodb/src/lib/meta/api/hookApis.ts
  57. 3
      packages/nocodb/src/lib/meta/api/hookFilterApis.ts
  58. 3
      packages/nocodb/src/lib/meta/api/kanbanViewApis.ts
  59. 1
      packages/nocodb/src/lib/meta/api/mapViewApis.ts
  60. 2
      packages/nocodb/src/lib/meta/api/modelVisibilityApis.ts
  61. 2
      packages/nocodb/src/lib/meta/api/orgLicenseApis.ts
  62. 2
      packages/nocodb/src/lib/meta/api/orgTokenApis.ts
  63. 3
      packages/nocodb/src/lib/meta/api/orgUserApis.ts
  64. 4
      packages/nocodb/src/lib/meta/api/pluginApis.ts
  65. 3
      packages/nocodb/src/lib/meta/api/projectApis.ts
  66. 3
      packages/nocodb/src/lib/meta/api/projectUserApis.ts
  67. 3
      packages/nocodb/src/lib/meta/api/sharedBaseApis.ts
  68. 3
      packages/nocodb/src/lib/meta/api/sortApis.ts
  69. 13
      packages/nocodb/src/lib/meta/api/tableApis.ts
  70. 65
      packages/nocodb/src/lib/meta/api/userApi/userApis.ts
  71. 1
      packages/nocodb/src/lib/meta/api/viewApis.ts
  72. 384
      packages/nocodb/src/lib/meta/helpers/catchError.ts
  73. 6
      packages/nocodb/src/lib/models/Base.ts
  74. 4
      packages/nocodb/src/lib/models/Filter.ts
  75. 3
      packages/nocodb/src/lib/models/LinkToAnotherRecordColumn.ts
  76. 1
      packages/nocodb/src/lib/models/MapView.ts
  77. 15
      packages/nocodb/src/lib/models/Model.ts
  78. 6
      packages/nocodb/src/lib/models/Project.ts
  79. 1
      packages/nocodb/src/lib/utils/globals.ts
  80. 1228
      packages/nocodb/src/schema/swagger.json

6
.github/workflows/publish-api-docs.yml

@ -4,7 +4,7 @@ on:
push: push:
branches: [ master ] branches: [ master ]
paths: paths:
- "scripts/sdk/swagger.json" - "packages/nocodb/src/schema/swagger.json"
release: release:
types: [ published ] types: [ published ]
@ -22,7 +22,7 @@ jobs:
env: env:
API_TOKEN_GITHUB: ${{ secrets.GH_TOKEN }} API_TOKEN_GITHUB: ${{ secrets.GH_TOKEN }}
with: with:
source_file: 'scripts/sdk/swagger.json' source_file: 'packages/nocodb/src/schema/swagger.json'
destination_repo: 'nocodb/noco-apis-doc' destination_repo: 'nocodb/noco-apis-doc'
destination_folder: 'src' destination_folder: 'src'
user_email: 'oof1lab@gmail.com' user_email: 'oof1lab@gmail.com'
@ -34,7 +34,7 @@ jobs:
env: env:
API_TOKEN_GITHUB: ${{ secrets.GH_TOKEN }} API_TOKEN_GITHUB: ${{ secrets.GH_TOKEN }}
with: with:
source_file: 'scripts/sdk/swagger.json' source_file: 'packages/nocodb/src/schema/swagger.json'
destination_repo: 'nocodb/noco-apis-doc' destination_repo: 'nocodb/noco-apis-doc'
destination_folder: 'meta-src' destination_folder: 'meta-src'
user_email: 'oof1lab@gmail.com' user_email: 'oof1lab@gmail.com'

4
packages/nc-gui/components.d.ts vendored

@ -251,8 +251,12 @@ declare module '@vue/runtime-core' {
NcIconsRowHeightMedium: typeof import('~icons/nc-icons/row-height-medium')['default'] NcIconsRowHeightMedium: typeof import('~icons/nc-icons/row-height-medium')['default']
NcIconsRowHeightShort: typeof import('~icons/nc-icons/row-height-short')['default'] NcIconsRowHeightShort: typeof import('~icons/nc-icons/row-height-short')['default']
NcIconsRowHeightTall: typeof import('~icons/nc-icons/row-height-tall')['default'] NcIconsRowHeightTall: typeof import('~icons/nc-icons/row-height-tall')['default']
PhChatTextThin: typeof import('~icons/ph/chat-text-thin')['default']
PhCloudLightningDuotone: typeof import('~icons/ph/cloud-lightning-duotone')['default'] PhCloudLightningDuotone: typeof import('~icons/ph/cloud-lightning-duotone')['default']
PhCloudLightningThin: typeof import('~icons/ph/cloud-lightning-thin')['default']
PhFileCsv: typeof import('~icons/ph/file-csv')['default'] PhFileCsv: typeof import('~icons/ph/file-csv')['default']
PhUserPlusThin: typeof import('~icons/ph/user-plus-thin')['default']
PhUsersThreeThin: typeof import('~icons/ph/users-three-thin')['default']
RiLineHeight: typeof import('~icons/ri/line-height')['default'] RiLineHeight: typeof import('~icons/ri/line-height')['default']
RiTeamFill: typeof import('~icons/ri/team-fill')['default'] RiTeamFill: typeof import('~icons/ri/team-fill')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']

21
packages/nc-gui/lang/ar.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "مشروع", "project": "مشروع",
@ -98,7 +99,8 @@
"gallery": "معرض صور", "gallery": "معرض صور",
"form": "نموذج", "form": "نموذج",
"kanban": "كانبان", "kanban": "كانبان",
"calendar": "تقويم" "calendar": "تقويم",
"map": "Map"
}, },
"user": "مستخدم", "user": "مستخدم",
"users": "مستخدمين", "users": "مستخدمين",
@ -136,6 +138,7 @@
"Currency": "عملة", "Currency": "عملة",
"Percent": "نسبة مؤية", "Percent": "نسبة مؤية",
"Duration": "مدة", "Duration": "مدة",
"GeoData": "GeoData",
"Rating": "تقييم", "Rating": "تقييم",
"Formula": "معادلة", "Formula": "معادلة",
"Rollup": "جمع البيانات", "Rollup": "جمع البيانات",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "وظيفة التجميع", "aggregateFunction": "وظيفة التجميع",
"dbCreateIfNotExists": "قاعدة البيانات: إنشاء إذا لم يكن موجودا", "dbCreateIfNotExists": "قاعدة البيانات: إنشاء إذا لم يكن موجودا",
"clientKey": "مفتاح العميل", "clientKey": "مفتاح العميل",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "الصفوف لكل صفحة", "footerInfo": "الصفوف لكل صفحة",
"upload": "حدد الملف المراد رفعه", "upload": "حدد الملف المراد رفعه",
"upload_sub": "أو سحب وإسقاط الملف", "upload_sub": "أو سحب وإسقاط الملف",
@ -600,6 +615,7 @@
"gallery": "إضافة عرض المعرض", "gallery": "إضافة عرض المعرض",
"form": "إضافة عرض النموذج", "form": "إضافة عرض النموذج",
"kanban": "إضافة عرض كانبان", "kanban": "إضافة عرض كانبان",
"map": "Add Map View",
"calendar": "إضافة طريقة عرض التقويم" "calendar": "إضافة طريقة عرض التقويم"
}, },
"tablesMetadataInSync": "تزامن البيانات الوصفية للجداول", "tablesMetadataInSync": "تزامن البيانات الوصفية للجداول",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/bn_IN.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "পরকলপ", "project": "পরকলপ",
@ -98,7 +99,8 @@
"gallery": "গ", "gallery": "গ",
"form": "ফরম", "form": "ফরম",
"kanban": "কনবন", "kanban": "কনবন",
"calendar": "কর" "calendar": "কর",
"map": "Map"
}, },
"user": "বযবহরক", "user": "বযবহরক",
"users": "বযবহরক", "users": "বযবহরক",
@ -136,6 +138,7 @@
"Currency": "ম", "Currency": "ম",
"Percent": "শতশ", "Percent": "শতশ",
"Duration": "সমযল", "Duration": "সমযল",
"GeoData": "GeoData",
"Rating": "রি", "Rating": "রি",
"Formula": "সর", "Formula": "সর",
"Rollup": "রলআপ", "Rollup": "রলআপ",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "সমগিক ফশন", "aggregateFunction": "সমগিক ফশন",
"dbCreateIfNotExists": "ডস: উপসিত নকলি করন", "dbCreateIfNotExists": "ডস: উপসিত নকলি করন",
"clientKey": "কট ক", "clientKey": "কট ক",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "পরতিি", "footerInfo": "পরতিি",
"upload": "আপলড করতইল নিচন করন", "upload": "আপলড করতইল নিচন করন",
"upload_sub": "অথবইল ট আনন", "upload_sub": "অথবইল ট আনন",
@ -600,6 +615,7 @@
"gallery": "গিউ যত করন", "gallery": "গিউ যত করন",
"form": "ফরম ভিউ যগ করন", "form": "ফরম ভিউ যগ করন",
"kanban": "কনবন ভিউ যত করন", "kanban": "কনবন ভিউ যত করন",
"map": "Add Map View",
"calendar": "কর ভিউ যত করন" "calendar": "কর ভিউ যত করন"
}, },
"tablesMetadataInSync": "টির মিক কর আছ", "tablesMetadataInSync": "টির মিক কর আছ",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/cs.json

@ -74,7 +74,8 @@
"insertBefore": "Vložit před", "insertBefore": "Vložit před",
"hideField": "Skrýt pole", "hideField": "Skrýt pole",
"sortAsc": "Seřadit vzestupně", "sortAsc": "Seřadit vzestupně",
"sortDesc": "Seřadit sestupně" "sortDesc": "Seřadit sestupně",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -98,7 +99,8 @@
"gallery": "Galerie", "gallery": "Galerie",
"form": "Formulář", "form": "Formulář",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalendář" "calendar": "Kalendář",
"map": "Map"
}, },
"user": "Uživatel", "user": "Uživatel",
"users": "Uživatelé", "users": "Uživatelé",
@ -136,6 +138,7 @@
"Currency": "Měna", "Currency": "Měna",
"Percent": "Procenta", "Percent": "Procenta",
"Duration": "Doba trvání", "Duration": "Doba trvání",
"GeoData": "GeoData",
"Rating": "Hodnocení", "Rating": "Hodnocení",
"Formula": "Vzorec", "Formula": "Vzorec",
"Rollup": "Rollup", "Rollup": "Rollup",
@ -253,6 +256,9 @@
"barcodeFormat": "Formát čárového kódu", "barcodeFormat": "Formát čárového kódu",
"qrCodeValueTooLong": "Příliš mnoho znaků pro QR kód", "qrCodeValueTooLong": "Příliš mnoho znaků pro QR kód",
"barcodeValueTooLong": "Příliš mnoho znaků pro čárový kód", "barcodeValueTooLong": "Příliš mnoho znaků pro čárový kód",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Agregační funkce", "aggregateFunction": "Agregační funkce",
"dbCreateIfNotExists": "Databáze : vytvořit, pokud neexistuje", "dbCreateIfNotExists": "Databáze : vytvořit, pokud neexistuje",
"clientKey": "Klíč klienta", "clientKey": "Klíč klienta",
@ -452,6 +458,10 @@
"stackedBy": "Naskládáno podle", "stackedBy": "Naskládáno podle",
"chooseGroupingField": "Výběr pole pro seskupení", "chooseGroupingField": "Výběr pole pro seskupení",
"addOrEditStack": "Přidat / upravit zásobník" "addOrEditStack": "Přidat / upravit zásobník"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Tvůrce může vytvářet nové projekty a přistupovat k jakémukoli pozvanému projektu.", "orgCreator": "Tvůrce může vytvářet nové projekty a přistupovat k jakémukoli pozvanému projektu.",
"orgViewer": "Prohlížeč nemůže vytvářet nové projekty, ale může přistupovat k jakémukoli pozvanému projektu." "orgViewer": "Prohlížeč nemůže vytvářet nové projekty, ale může přistupovat k jakémukoli pozvanému projektu."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Řádky na stránku", "footerInfo": "Řádky na stránku",
"upload": "Vyberte soubor, který chcete nahrát", "upload": "Vyberte soubor, který chcete nahrát",
"upload_sub": "nebo přetažením souboru", "upload_sub": "nebo přetažením souboru",
@ -600,6 +615,7 @@
"gallery": "Přidat zobrazení galerie", "gallery": "Přidat zobrazení galerie",
"form": "Přidání zobrazení formuláře", "form": "Přidání zobrazení formuláře",
"kanban": "Přidání zobrazení Kanban", "kanban": "Přidání zobrazení Kanban",
"map": "Add Map View",
"calendar": "Přidat zobrazení kalendáře" "calendar": "Přidat zobrazení kalendáře"
}, },
"tablesMetadataInSync": "Metadata tabulek jsou synchronizována", "tablesMetadataInSync": "Metadata tabulek jsou synchronizována",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Jméno by mělo začínat abecedou nebo _", "nameShouldStartWithAnAlphabetOr_": "Jméno by mělo začínat abecedou nebo _",
"followingCharactersAreNotAllowed": "Následující znaky nejsou povoleny", "followingCharactersAreNotAllowed": "Následující znaky nejsou povoleny",
"columnNameRequired": "Název sloupce je povinný", "columnNameRequired": "Název sloupce je povinný",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Název projektu přesahuje 50 znaků", "projectNameExceeds50Characters": "Název projektu přesahuje 50 znaků",
"projectNameCannotStartWithSpace": "Název projektu nesmí začínat mezerou", "projectNameCannotStartWithSpace": "Název projektu nesmí začínat mezerou",
"requiredField": "Povinné pole", "requiredField": "Povinné pole",

21
packages/nc-gui/lang/da.json

@ -74,7 +74,8 @@
"insertBefore": "Indsæt før", "insertBefore": "Indsæt før",
"hideField": "Skjul felt", "hideField": "Skjul felt",
"sortAsc": "Sortere stigende", "sortAsc": "Sortere stigende",
"sortDesc": "Sortere nedadgående" "sortDesc": "Sortere nedadgående",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -98,7 +99,8 @@
"gallery": "Galleri", "gallery": "Galleri",
"form": "Formular", "form": "Formular",
"kanban": "Kanban.", "kanban": "Kanban.",
"calendar": "Kalender" "calendar": "Kalender",
"map": "Map"
}, },
"user": "Bruger", "user": "Bruger",
"users": "Brugere", "users": "Brugere",
@ -136,6 +138,7 @@
"Currency": "betalingsmiddel", "Currency": "betalingsmiddel",
"Percent": "Procentdel", "Percent": "Procentdel",
"Duration": "Varighed", "Duration": "Varighed",
"GeoData": "GeoData",
"Rating": "Bedømmelse", "Rating": "Bedømmelse",
"Formula": "Formel", "Formula": "Formel",
"Rollup": "Rul op", "Rollup": "Rul op",
@ -253,6 +256,9 @@
"barcodeFormat": "Stregkodeformat", "barcodeFormat": "Stregkodeformat",
"qrCodeValueTooLong": "For mange tegn til en QR-kode", "qrCodeValueTooLong": "For mange tegn til en QR-kode",
"barcodeValueTooLong": "For mange tegn til en stregkode", "barcodeValueTooLong": "For mange tegn til en stregkode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Aggregate Function.", "aggregateFunction": "Aggregate Function.",
"dbCreateIfNotExists": "DATABASE: Opret, hvis ikke eksisterer", "dbCreateIfNotExists": "DATABASE: Opret, hvis ikke eksisterer",
"clientKey": "Klientnøgle", "clientKey": "Klientnøgle",
@ -452,6 +458,10 @@
"stackedBy": "Stablet af", "stackedBy": "Stablet af",
"chooseGroupingField": "Vælg et grupperingsfelt", "chooseGroupingField": "Vælg et grupperingsfelt",
"addOrEditStack": "Tilføj / Rediger stak" "addOrEditStack": "Tilføj / Rediger stak"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Skaberen kan oprette nye projekter og få adgang til alle inviterede projekter.", "orgCreator": "Skaberen kan oprette nye projekter og få adgang til alle inviterede projekter.",
"orgViewer": "Seeren har ikke lov til at oprette nye projekter, men kan få adgang til alle inviterede projekter." "orgViewer": "Seeren har ikke lov til at oprette nye projekter, men kan få adgang til alle inviterede projekter."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Rækker per side", "footerInfo": "Rækker per side",
"upload": "Vælg fil for at uploade", "upload": "Vælg fil for at uploade",
"upload_sub": "eller træk og slip filen", "upload_sub": "eller træk og slip filen",
@ -600,6 +615,7 @@
"gallery": "Tilføj Gallery View.", "gallery": "Tilføj Gallery View.",
"form": "Tilføj formularvisning", "form": "Tilføj formularvisning",
"kanban": "Tilføj Kanban View.", "kanban": "Tilføj Kanban View.",
"map": "Add Map View",
"calendar": "Tilføj kalendervisning" "calendar": "Tilføj kalendervisning"
}, },
"tablesMetadataInSync": "Tabeller Metadata er synkroniseret", "tablesMetadataInSync": "Tabeller Metadata er synkroniseret",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Navnet skal starte med et alfabet eller _", "nameShouldStartWithAnAlphabetOr_": "Navnet skal starte med et alfabet eller _",
"followingCharactersAreNotAllowed": "Følgende tegn er ikke tilladt", "followingCharactersAreNotAllowed": "Følgende tegn er ikke tilladt",
"columnNameRequired": "Kolonnens navn er påkrævet", "columnNameRequired": "Kolonnens navn er påkrævet",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Projektnavnet overstiger 50 tegn", "projectNameExceeds50Characters": "Projektnavnet overstiger 50 tegn",
"projectNameCannotStartWithSpace": "Projektnavnet kan ikke begynde med et mellemrum", "projectNameCannotStartWithSpace": "Projektnavnet kan ikke begynde med et mellemrum",
"requiredField": "Obligatorisk felt", "requiredField": "Obligatorisk felt",

18
packages/nc-gui/lang/de.json

@ -74,7 +74,8 @@
"insertBefore": "davor einfügen", "insertBefore": "davor einfügen",
"hideField": "Feld ausblenden", "hideField": "Feld ausblenden",
"sortAsc": "Aufsteigend sortieren", "sortAsc": "Aufsteigend sortieren",
"sortDesc": "Absteigend sortieren" "sortDesc": "Absteigend sortieren",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -137,6 +138,7 @@
"Currency": "Währung", "Currency": "Währung",
"Percent": "Prozent", "Percent": "Prozent",
"Duration": "Dauer", "Duration": "Dauer",
"GeoData": "GeoData",
"Rating": "Klassifizierung", "Rating": "Klassifizierung",
"Formula": "Formel", "Formula": "Formel",
"Rollup": "Zusammenfassung", "Rollup": "Zusammenfassung",
@ -254,6 +256,9 @@
"barcodeFormat": "Barcode-Format", "barcodeFormat": "Barcode-Format",
"qrCodeValueTooLong": "Zu viele Zeichen für einen QR-Code", "qrCodeValueTooLong": "Zu viele Zeichen für einen QR-Code",
"barcodeValueTooLong": "Zu viele Zeichen für einen Barcode", "barcodeValueTooLong": "Zu viele Zeichen für einen Barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Globale Funktion", "aggregateFunction": "Globale Funktion",
"dbCreateIfNotExists": "Datenbank: Erstellen, falls nicht vorhanden", "dbCreateIfNotExists": "Datenbank: Erstellen, falls nicht vorhanden",
"clientKey": "Client-Schlüssel", "clientKey": "Client-Schlüssel",
@ -453,6 +458,10 @@
"stackedBy": "Gestapelt von", "stackedBy": "Gestapelt von",
"chooseGroupingField": "Wählen Sie ein Gruppierungsfeld", "chooseGroupingField": "Wählen Sie ein Gruppierungsfeld",
"addOrEditStack": "Stapel hinzufügen / bearbeiten" "addOrEditStack": "Stapel hinzufügen / bearbeiten"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -519,6 +528,11 @@
"orgCreator": "Der Ersteller kann neue Projekte erstellen und auf alle eingeladenen Projekte zugreifen.", "orgCreator": "Der Ersteller kann neue Projekte erstellen und auf alle eingeladenen Projekte zugreifen.",
"orgViewer": "Betrachter können keine neuen Projekte erstellen, aber sie können auf alle eingeladenen Projekte zugreifen." "orgViewer": "Betrachter können keine neuen Projekte erstellen, aber sie können auf alle eingeladenen Projekte zugreifen."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Zeilen pro Seite", "footerInfo": "Zeilen pro Seite",
"upload": "Datei zum Hochladen auswählen", "upload": "Datei zum Hochladen auswählen",
"upload_sub": "oder Drag & Drop Datei", "upload_sub": "oder Drag & Drop Datei",
@ -601,6 +615,7 @@
"gallery": "Galerie-Ansicht hinzufügen", "gallery": "Galerie-Ansicht hinzufügen",
"form": "Formular-Ansicht hinzufügen", "form": "Formular-Ansicht hinzufügen",
"kanban": "Kanban-Ansicht hinzufügen", "kanban": "Kanban-Ansicht hinzufügen",
"map": "Add Map View",
"calendar": "Kalender-Ansicht hinzufügen" "calendar": "Kalender-Ansicht hinzufügen"
}, },
"tablesMetadataInSync": "Tabellen-Metadaten sind synchron", "tablesMetadataInSync": "Tabellen-Metadaten sind synchron",
@ -691,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name muss mit einem Buchstaben oder _ beginnen", "nameShouldStartWithAnAlphabetOr_": "Name muss mit einem Buchstaben oder _ beginnen",
"followingCharactersAreNotAllowed": "Folgende Zeichen sind nicht erlaubt", "followingCharactersAreNotAllowed": "Folgende Zeichen sind nicht erlaubt",
"columnNameRequired": "Spaltenname ist erforderlich", "columnNameRequired": "Spaltenname ist erforderlich",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Projektname überschreitet 50 Zeichen", "projectNameExceeds50Characters": "Projektname überschreitet 50 Zeichen",
"projectNameCannotStartWithSpace": "Projektname darf nicht mit einem Leerzeichen beginnen", "projectNameCannotStartWithSpace": "Projektname darf nicht mit einem Leerzeichen beginnen",
"requiredField": "Pflichtfeld", "requiredField": "Pflichtfeld",

21
packages/nc-gui/lang/es.json

@ -74,7 +74,8 @@
"insertBefore": "Insertar antes", "insertBefore": "Insertar antes",
"hideField": "Ocultar campo", "hideField": "Ocultar campo",
"sortAsc": "Ordenación ascendente", "sortAsc": "Ordenación ascendente",
"sortDesc": "Orden descendente" "sortDesc": "Orden descendente",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Proyecto", "project": "Proyecto",
@ -98,7 +99,8 @@
"gallery": "Galería", "gallery": "Galería",
"form": "Formulario", "form": "Formulario",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Calendario" "calendar": "Calendario",
"map": "Map"
}, },
"user": "Usuario", "user": "Usuario",
"users": "Usuarios", "users": "Usuarios",
@ -136,6 +138,7 @@
"Currency": "Divisa", "Currency": "Divisa",
"Percent": "Por ciento", "Percent": "Por ciento",
"Duration": "Duración", "Duration": "Duración",
"GeoData": "GeoData",
"Rating": "Clasificación", "Rating": "Clasificación",
"Formula": "Fórmula", "Formula": "Fórmula",
"Rollup": "Acumulado", "Rollup": "Acumulado",
@ -253,6 +256,9 @@
"barcodeFormat": "Formato del código de barras", "barcodeFormat": "Formato del código de barras",
"qrCodeValueTooLong": "Demasiados caracteres para un código QR", "qrCodeValueTooLong": "Demasiados caracteres para un código QR",
"barcodeValueTooLong": "Demasiados caracteres para un código de barras", "barcodeValueTooLong": "Demasiados caracteres para un código de barras",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Función agregada", "aggregateFunction": "Función agregada",
"dbCreateIfNotExists": "Base de datos : Crear si no existe", "dbCreateIfNotExists": "Base de datos : Crear si no existe",
"clientKey": "Clave de Cliente", "clientKey": "Clave de Cliente",
@ -452,6 +458,10 @@
"stackedBy": "Apilado por", "stackedBy": "Apilado por",
"chooseGroupingField": "Elija un campo de agrupación", "chooseGroupingField": "Elija un campo de agrupación",
"addOrEditStack": "Añadir / Editar pila" "addOrEditStack": "Añadir / Editar pila"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "El creador puede crear nuevos proyectos y acceder a cualquier proyecto invitado.", "orgCreator": "El creador puede crear nuevos proyectos y acceder a cualquier proyecto invitado.",
"orgViewer": "El espectador no puede crear nuevos proyectos, pero puede acceder a cualquier proyecto invitado." "orgViewer": "El espectador no puede crear nuevos proyectos, pero puede acceder a cualquier proyecto invitado."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Filas por página", "footerInfo": "Filas por página",
"upload": "Selecciona Archivo para cargar", "upload": "Selecciona Archivo para cargar",
"upload_sub": "o arrastra y suelta el archivo", "upload_sub": "o arrastra y suelta el archivo",
@ -600,6 +615,7 @@
"gallery": "Agregar vista de Galería", "gallery": "Agregar vista de Galería",
"form": "Agregar vista de Formulario", "form": "Agregar vista de Formulario",
"kanban": "Agregar vista de Kanban", "kanban": "Agregar vista de Kanban",
"map": "Add Map View",
"calendar": "Agregar vista de Calendario" "calendar": "Agregar vista de Calendario"
}, },
"tablesMetadataInSync": "Sincronización de tablas de metadatos activa", "tablesMetadataInSync": "Sincronización de tablas de metadatos activa",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "El nombre debe empezar por un alfabeto o _", "nameShouldStartWithAnAlphabetOr_": "El nombre debe empezar por un alfabeto o _",
"followingCharactersAreNotAllowed": "Los siguientes caracteres no están permitidos", "followingCharactersAreNotAllowed": "Los siguientes caracteres no están permitidos",
"columnNameRequired": "El nombre de la columna es obligatorio", "columnNameRequired": "El nombre de la columna es obligatorio",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "El nombre del proyecto supera los 50 caracteres", "projectNameExceeds50Characters": "El nombre del proyecto supera los 50 caracteres",
"projectNameCannotStartWithSpace": "El nombre del proyecto no puede empezar con un espacio", "projectNameCannotStartWithSpace": "El nombre del proyecto no puede empezar con un espacio",
"requiredField": "Campo obligatorio", "requiredField": "Campo obligatorio",

21
packages/nc-gui/lang/eu.json

@ -74,7 +74,8 @@
"insertBefore": "Txertatu aurretik", "insertBefore": "Txertatu aurretik",
"hideField": "Ezkutatu eremua", "hideField": "Ezkutatu eremua",
"sortAsc": "Ordenatu gorantz", "sortAsc": "Ordenatu gorantz",
"sortDesc": "Ordenatu beherantz" "sortDesc": "Ordenatu beherantz",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Proiektua", "project": "Proiektua",
@ -98,7 +99,8 @@
"gallery": "Galeria", "gallery": "Galeria",
"form": "Inprimakia", "form": "Inprimakia",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Egutegia" "calendar": "Egutegia",
"map": "Map"
}, },
"user": "Erabiltzailea", "user": "Erabiltzailea",
"users": "Erabiltzaileak", "users": "Erabiltzaileak",
@ -136,6 +138,7 @@
"Currency": "Moneta", "Currency": "Moneta",
"Percent": "Ehunekoa", "Percent": "Ehunekoa",
"Duration": "Iraupena", "Duration": "Iraupena",
"GeoData": "GeoData",
"Rating": "Balorazioa", "Rating": "Balorazioa",
"Formula": "Ekuazioa", "Formula": "Ekuazioa",
"Rollup": "Rollup", "Rollup": "Rollup",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Aggregate function", "aggregateFunction": "Aggregate function",
"dbCreateIfNotExists": "Database : create if not exists", "dbCreateIfNotExists": "Database : create if not exists",
"clientKey": "Client Key", "clientKey": "Client Key",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Rows per page", "footerInfo": "Rows per page",
"upload": "Select file to Upload", "upload": "Select file to Upload",
"upload_sub": "or drag and drop file", "upload_sub": "or drag and drop file",
@ -600,6 +615,7 @@
"gallery": "Add Gallery View", "gallery": "Add Gallery View",
"form": "Add Form View", "form": "Add Form View",
"kanban": "Add Kanban View", "kanban": "Add Kanban View",
"map": "Add Map View",
"calendar": "Add Calendar View" "calendar": "Add Calendar View"
}, },
"tablesMetadataInSync": "Tables metadata is in Sync", "tablesMetadataInSync": "Tables metadata is in Sync",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/fa.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "پروژه", "project": "پروژه",
@ -98,7 +99,8 @@
"gallery": "گالری", "gallery": "گالری",
"form": "فرم", "form": "فرم",
"kanban": "کانبان", "kanban": "کانبان",
"calendar": "تقویم" "calendar": "تقویم",
"map": "Map"
}, },
"user": "کاربر", "user": "کاربر",
"users": "کاربران", "users": "کاربران",
@ -136,6 +138,7 @@
"Currency": "واحد پول", "Currency": "واحد پول",
"Percent": "درصد", "Percent": "درصد",
"Duration": "مدت زمان", "Duration": "مدت زمان",
"GeoData": "GeoData",
"Rating": "امتیاز", "Rating": "امتیاز",
"Formula": "فرمول", "Formula": "فرمول",
"Rollup": "تجمیع کردن", "Rollup": "تجمیع کردن",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "تابع جمع", "aggregateFunction": "تابع جمع",
"dbCreateIfNotExists": "پایگاه داده: ایجاد در صورت عدم وجود", "dbCreateIfNotExists": "پایگاه داده: ایجاد در صورت عدم وجود",
"clientKey": "کلید Client", "clientKey": "کلید Client",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "تعداد ردیفها در هر صفحه", "footerInfo": "تعداد ردیفها در هر صفحه",
"upload": "فایل را برای بارگذاری انتخاب کنید", "upload": "فایل را برای بارگذاری انتخاب کنید",
"upload_sub": "یا فایل را بکشید و رها کنید", "upload_sub": "یا فایل را بکشید و رها کنید",
@ -600,6 +615,7 @@
"gallery": "افزودن نمایش گالری", "gallery": "افزودن نمایش گالری",
"form": "افزودن نمایش فرم", "form": "افزودن نمایش فرم",
"kanban": "افزودن نمایش کانبان", "kanban": "افزودن نمایش کانبان",
"map": "Add Map View",
"calendar": "افزودن نمایش تقویم" "calendar": "افزودن نمایش تقویم"
}, },
"tablesMetadataInSync": "متاداده جداول در حالت همگامسازی است", "tablesMetadataInSync": "متاداده جداول در حالت همگامسازی است",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/fi.json

@ -74,7 +74,8 @@
"insertBefore": "Lisää ennen", "insertBefore": "Lisää ennen",
"hideField": "Piilota kenttä", "hideField": "Piilota kenttä",
"sortAsc": "Lajittelu nouseva", "sortAsc": "Lajittelu nouseva",
"sortDesc": "Lajittelu laskeva" "sortDesc": "Lajittelu laskeva",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Hanke", "project": "Hanke",
@ -98,7 +99,8 @@
"gallery": "Galleria", "gallery": "Galleria",
"form": "Lomake", "form": "Lomake",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalenteri" "calendar": "Kalenteri",
"map": "Map"
}, },
"user": "Käyttäjä", "user": "Käyttäjä",
"users": "Käyttäjät", "users": "Käyttäjät",
@ -136,6 +138,7 @@
"Currency": "Valuutta", "Currency": "Valuutta",
"Percent": "Prosentti", "Percent": "Prosentti",
"Duration": "Kesto", "Duration": "Kesto",
"GeoData": "GeoData",
"Rating": "Luokitus", "Rating": "Luokitus",
"Formula": "Kaava", "Formula": "Kaava",
"Rollup": "Rullaus", "Rollup": "Rullaus",
@ -253,6 +256,9 @@
"barcodeFormat": "Viivakoodin muoto", "barcodeFormat": "Viivakoodin muoto",
"qrCodeValueTooLong": "Liian monta merkkiä QR-koodiin", "qrCodeValueTooLong": "Liian monta merkkiä QR-koodiin",
"barcodeValueTooLong": "Liikaa merkkejä viivakoodiin", "barcodeValueTooLong": "Liikaa merkkejä viivakoodiin",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Kokonaistoiminto", "aggregateFunction": "Kokonaistoiminto",
"dbCreateIfNotExists": "Tietokanta: Luo jos ei ole olemassa", "dbCreateIfNotExists": "Tietokanta: Luo jos ei ole olemassa",
"clientKey": "Asiakasnäppäin", "clientKey": "Asiakasnäppäin",
@ -452,6 +458,10 @@
"stackedBy": "Pinottu by", "stackedBy": "Pinottu by",
"chooseGroupingField": "Valitse ryhmittelykenttä", "chooseGroupingField": "Valitse ryhmittelykenttä",
"addOrEditStack": "Lisää / Muokkaa pinoa" "addOrEditStack": "Lisää / Muokkaa pinoa"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Luoja voi luoda uusia projekteja ja käyttää kaikkia kutsuttuja projekteja.", "orgCreator": "Luoja voi luoda uusia projekteja ja käyttää kaikkia kutsuttuja projekteja.",
"orgViewer": "Katsoja ei saa luoda uusia projekteja, mutta hän voi käyttää mitä tahansa kutsuttua projektia." "orgViewer": "Katsoja ei saa luoda uusia projekteja, mutta hän voi käyttää mitä tahansa kutsuttua projektia."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Rivit sivua kohti", "footerInfo": "Rivit sivua kohti",
"upload": "Valitse lataa tiedosto", "upload": "Valitse lataa tiedosto",
"upload_sub": "tai vedä ja pudota tiedosto", "upload_sub": "tai vedä ja pudota tiedosto",
@ -600,6 +615,7 @@
"gallery": "Lisää galleria-näkymä", "gallery": "Lisää galleria-näkymä",
"form": "Lisää lomake", "form": "Lisää lomake",
"kanban": "Lisää Kanban View", "kanban": "Lisää Kanban View",
"map": "Add Map View",
"calendar": "Lisää kalenteri-näkymä" "calendar": "Lisää kalenteri-näkymä"
}, },
"tablesMetadataInSync": "Taulukot Metatieto on synkronoitu", "tablesMetadataInSync": "Taulukot Metatieto on synkronoitu",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Nimen on alettava aakkosilla tai _", "nameShouldStartWithAnAlphabetOr_": "Nimen on alettava aakkosilla tai _",
"followingCharactersAreNotAllowed": "Seuraavat merkit eivät ole sallittuja", "followingCharactersAreNotAllowed": "Seuraavat merkit eivät ole sallittuja",
"columnNameRequired": "Sarakkeen nimi vaaditaan", "columnNameRequired": "Sarakkeen nimi vaaditaan",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Hankkeen nimi ylittää 50 merkkiä", "projectNameExceeds50Characters": "Hankkeen nimi ylittää 50 merkkiä",
"projectNameCannotStartWithSpace": "Projektin nimi ei voi alkaa välilyönnillä", "projectNameCannotStartWithSpace": "Projektin nimi ei voi alkaa välilyönnillä",
"requiredField": "Pakollinen kenttä", "requiredField": "Pakollinen kenttä",

21
packages/nc-gui/lang/fr.json

@ -74,7 +74,8 @@
"insertBefore": "Insérer avant", "insertBefore": "Insérer avant",
"hideField": "Masquer le champ", "hideField": "Masquer le champ",
"sortAsc": "Trier par ordre croissant", "sortAsc": "Trier par ordre croissant",
"sortDesc": "Trier par ordre décroissant" "sortDesc": "Trier par ordre décroissant",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projet", "project": "Projet",
@ -98,7 +99,8 @@
"gallery": "Galerie", "gallery": "Galerie",
"form": "Formulaire", "form": "Formulaire",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Calendrier" "calendar": "Calendrier",
"map": "Map"
}, },
"user": "Utilisateur", "user": "Utilisateur",
"users": "Utilisateurs", "users": "Utilisateurs",
@ -136,6 +138,7 @@
"Currency": "Devise", "Currency": "Devise",
"Percent": "Pourcentage", "Percent": "Pourcentage",
"Duration": "Durée", "Duration": "Durée",
"GeoData": "GeoData",
"Rating": "Évaluation", "Rating": "Évaluation",
"Formula": "Formule", "Formula": "Formule",
"Rollup": "Synthèse", "Rollup": "Synthèse",
@ -253,6 +256,9 @@
"barcodeFormat": "Format du code-barres", "barcodeFormat": "Format du code-barres",
"qrCodeValueTooLong": "Trop de caractères pour un code QR", "qrCodeValueTooLong": "Trop de caractères pour un code QR",
"barcodeValueTooLong": "Trop de caractères pour un code-barres", "barcodeValueTooLong": "Trop de caractères pour un code-barres",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Fonction agrégée", "aggregateFunction": "Fonction agrégée",
"dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas", "dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas",
"clientKey": "Clé client", "clientKey": "Clé client",
@ -452,6 +458,10 @@
"stackedBy": "Empilés par", "stackedBy": "Empilés par",
"chooseGroupingField": "Choisir un champ de regroupement", "chooseGroupingField": "Choisir un champ de regroupement",
"addOrEditStack": "Ajouter / Modifier une pile" "addOrEditStack": "Ajouter / Modifier une pile"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Le créateur peut créer de nouveaux projets et accéder à tout projet invité.", "orgCreator": "Le créateur peut créer de nouveaux projets et accéder à tout projet invité.",
"orgViewer": "Le visualisateur n'est pas autorisé à créer de nouveaux projets mais il peut accéder à tout projet invité." "orgViewer": "Le visualisateur n'est pas autorisé à créer de nouveaux projets mais il peut accéder à tout projet invité."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Lignes par page", "footerInfo": "Lignes par page",
"upload": "Sélectionner un fichier à téléverser", "upload": "Sélectionner un fichier à téléverser",
"upload_sub": "ou glisser-déposer un fichier", "upload_sub": "ou glisser-déposer un fichier",
@ -600,6 +615,7 @@
"gallery": "Ajouter une vue Galerie", "gallery": "Ajouter une vue Galerie",
"form": "Ajouter une vue Formulaire", "form": "Ajouter une vue Formulaire",
"kanban": "Ajouter une vue Kanban", "kanban": "Ajouter une vue Kanban",
"map": "Add Map View",
"calendar": "Ajouter une vue Calendrier" "calendar": "Ajouter une vue Calendrier"
}, },
"tablesMetadataInSync": "Les métadonnées de tables sont en synchronisation", "tablesMetadataInSync": "Les métadonnées de tables sont en synchronisation",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Le nom doit commencer par une lettre de l'alphabet ou _", "nameShouldStartWithAnAlphabetOr_": "Le nom doit commencer par une lettre de l'alphabet ou _",
"followingCharactersAreNotAllowed": "Les caractères suivants ne sont pas autorisés", "followingCharactersAreNotAllowed": "Les caractères suivants ne sont pas autorisés",
"columnNameRequired": "Nom de la colonne requis", "columnNameRequired": "Nom de la colonne requis",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Le nom du projet dépasse les 50 caractères", "projectNameExceeds50Characters": "Le nom du projet dépasse les 50 caractères",
"projectNameCannotStartWithSpace": "Le nom du projet ne peut pas commencer par un espace", "projectNameCannotStartWithSpace": "Le nom du projet ne peut pas commencer par un espace",
"requiredField": "Champ requis", "requiredField": "Champ requis",

21
packages/nc-gui/lang/he.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": ּרוֹיֶקט", "project": ּרוֹיֶקט",
@ -98,7 +99,8 @@
"gallery": "גלריה", "gallery": "גלריה",
"form": "טופס", "form": "טופס",
"kanban": "קאנב\"כ", "kanban": "קאנב\"כ",
"calendar": "לוּחַ שָׁנָה" "calendar": "לוּחַ שָׁנָה",
"map": "Map"
}, },
"user": ִשׁתַמֵשׁ", "user": ִשׁתַמֵשׁ",
"users": "משתמשים.", "users": "משתמשים.",
@ -136,6 +138,7 @@
"Currency": ַטְבֵּעַ", "Currency": ַטְבֵּעַ",
"Percent": ָחוּז", "Percent": ָחוּז",
"Duration": "אורך זמן", "Duration": "אורך זמן",
"GeoData": "GeoData",
"Rating": "דירוג", "Rating": "דירוג",
"Formula": "נוּסחָה", "Formula": "נוּסחָה",
"Rollup": "Rullup", "Rollup": "Rullup",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "פונקציה מצטברת", "aggregateFunction": "פונקציה מצטברת",
"dbCreateIfNotExists": "מסד נתונים: צור אם לא קיים", "dbCreateIfNotExists": "מסד נתונים: צור אם לא קיים",
"clientKey": "מפתח הלקוח", "clientKey": "מפתח הלקוח",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "שורות לדף", "footerInfo": "שורות לדף",
"upload": "בחר קובץ להעלאה", "upload": "בחר קובץ להעלאה",
"upload_sub": "או גרור ושחרר קובץ", "upload_sub": "או גרור ושחרר קובץ",
@ -600,6 +615,7 @@
"gallery": "הוסף תצוגת גלריה", "gallery": "הוסף תצוגת גלריה",
"form": "הוסף טופס View.", "form": "הוסף טופס View.",
"kanban": "הוסף Kanban View.", "kanban": "הוסף Kanban View.",
"map": "Add Map View",
"calendar": "הוסף תצוגת לוח שנה" "calendar": "הוסף תצוגת לוח שנה"
}, },
"tablesMetadataInSync": "טבלאות מטא נתונים מסונכרנים", "tablesMetadataInSync": "טבלאות מטא נתונים מסונכרנים",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/hi.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "परिजन", "project": "परिजन",
@ -98,7 +99,8 @@
"gallery": "गलर", "gallery": "गलर",
"form": "परपतर", "form": "परपतर",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "पग" "calendar": "पग",
"map": "Map"
}, },
"user": "उपयगकर", "user": "उपयगकर",
"users": "उपयगकर", "users": "उपयगकर",
@ -136,6 +138,7 @@
"Currency": "म", "Currency": "म",
"Percent": "परतिशत", "Percent": "परतिशत",
"Duration": "अवधि", "Duration": "अवधि",
"GeoData": "GeoData",
"Rating": "रिग", "Rating": "रिग",
"Formula": "सर", "Formula": "सर",
"Rollup": "जमन", "Rollup": "जमन",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "कल समह", "aggregateFunction": "कल समह",
"dbCreateIfNotExists": "डस: बन यदिद नह", "dbCreateIfNotExists": "डस: बन यदिद नह",
"clientKey": "गहक क", "clientKey": "गहक क",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "परतिठ पि", "footerInfo": "परतिठ पि",
"upload": "अपलड करनिए फइल क चयन कर", "upload": "अपलड करनिए फइल क चयन कर",
"upload_sub": "यग एड डप फइल", "upload_sub": "यग एड डप फइल",
@ -600,6 +615,7 @@
"gallery": "गलरय ज", "gallery": "गलरय ज",
"form": "फम व", "form": "फम व",
"kanban": "कनबन दय ज", "kanban": "कनबन दय ज",
"map": "Add Map View",
"calendar": "कडर दय ज" "calendar": "कडर दय ज"
}, },
"tablesMetadataInSync": "टबल क SYNC ह", "tablesMetadataInSync": "टबल क SYNC ह",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/hr.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -98,7 +99,8 @@
"gallery": "Galerija", "gallery": "Galerija",
"form": "Oblik", "form": "Oblik",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalendar" "calendar": "Kalendar",
"map": "Map"
}, },
"user": "Korisnik", "user": "Korisnik",
"users": "Korisnik", "users": "Korisnik",
@ -136,6 +138,7 @@
"Currency": "Valuta", "Currency": "Valuta",
"Percent": "Postotak", "Percent": "Postotak",
"Duration": "Trajanje", "Duration": "Trajanje",
"GeoData": "GeoData",
"Rating": "Ocjena", "Rating": "Ocjena",
"Formula": "Formula", "Formula": "Formula",
"Rollup": "Valjak", "Rollup": "Valjak",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Agregatna funkcija", "aggregateFunction": "Agregatna funkcija",
"dbCreateIfNotExists": "Baza podataka: stvoriti ako ne postoji", "dbCreateIfNotExists": "Baza podataka: stvoriti ako ne postoji",
"clientKey": "Ključ klijenta", "clientKey": "Ključ klijenta",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Redaka po stranici", "footerInfo": "Redaka po stranici",
"upload": "Odaberite datoteku za prijenos", "upload": "Odaberite datoteku za prijenos",
"upload_sub": "ili povucite i ispustite datoteku", "upload_sub": "ili povucite i ispustite datoteku",
@ -600,6 +615,7 @@
"gallery": "Dodajte pogled na galeriju", "gallery": "Dodajte pogled na galeriju",
"form": "Dodajte prikaz obrasca", "form": "Dodajte prikaz obrasca",
"kanban": "Dodajte Kanban pogled", "kanban": "Dodajte Kanban pogled",
"map": "Add Map View",
"calendar": "Dodajte prikaz kalendara" "calendar": "Dodajte prikaz kalendara"
}, },
"tablesMetadataInSync": "Metapodaci tablice se sinkroniziraju", "tablesMetadataInSync": "Metapodaci tablice se sinkroniziraju",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/id.json

@ -74,7 +74,8 @@
"insertBefore": "Sisipkan Sebelum", "insertBefore": "Sisipkan Sebelum",
"hideField": "Sembunyikan Bidang", "hideField": "Sembunyikan Bidang",
"sortAsc": "Urutkan Menaik", "sortAsc": "Urutkan Menaik",
"sortDesc": "Urutkan Menurun" "sortDesc": "Urutkan Menurun",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Proyek", "project": "Proyek",
@ -98,7 +99,8 @@
"gallery": "Galeri", "gallery": "Galeri",
"form": "Membentuk", "form": "Membentuk",
"kanban": "Kanban.", "kanban": "Kanban.",
"calendar": "Kalender" "calendar": "Kalender",
"map": "Map"
}, },
"user": "Pengguna", "user": "Pengguna",
"users": "Pengguna.", "users": "Pengguna.",
@ -136,6 +138,7 @@
"Currency": "Mata uang", "Currency": "Mata uang",
"Percent": "Persen", "Percent": "Persen",
"Duration": "Durasi", "Duration": "Durasi",
"GeoData": "GeoData",
"Rating": "Peringkat", "Rating": "Peringkat",
"Formula": "Rumus", "Formula": "Rumus",
"Rollup": "Rollup.", "Rollup": "Rollup.",
@ -253,6 +256,9 @@
"barcodeFormat": "Format kode batang", "barcodeFormat": "Format kode batang",
"qrCodeValueTooLong": "Terlalu banyak karakter untuk kode QR", "qrCodeValueTooLong": "Terlalu banyak karakter untuk kode QR",
"barcodeValueTooLong": "Terlalu banyak karakter untuk barcode", "barcodeValueTooLong": "Terlalu banyak karakter untuk barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Fungsi agregat.", "aggregateFunction": "Fungsi agregat.",
"dbCreateIfNotExists": "Basis Data: Buat jika tidak ada", "dbCreateIfNotExists": "Basis Data: Buat jika tidak ada",
"clientKey": "Kunci klien", "clientKey": "Kunci klien",
@ -452,6 +458,10 @@
"stackedBy": "Ditumpuk oleh", "stackedBy": "Ditumpuk oleh",
"chooseGroupingField": "Pilih Bidang Pengelompokan", "chooseGroupingField": "Pilih Bidang Pengelompokan",
"addOrEditStack": "Tambah / Edit Tumpukan" "addOrEditStack": "Tambah / Edit Tumpukan"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Kreator dapat membuat proyek baru dan mengakses proyek yang diundang.", "orgCreator": "Kreator dapat membuat proyek baru dan mengakses proyek yang diundang.",
"orgViewer": "Penonton tidak diizinkan untuk membuat proyek baru, tetapi mereka dapat mengakses proyek yang diundang." "orgViewer": "Penonton tidak diizinkan untuk membuat proyek baru, tetapi mereka dapat mengakses proyek yang diundang."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Baris per halaman", "footerInfo": "Baris per halaman",
"upload": "Pilih file untuk diunggah", "upload": "Pilih file untuk diunggah",
"upload_sub": "atau seret dan jatuhkan file", "upload_sub": "atau seret dan jatuhkan file",
@ -600,6 +615,7 @@
"gallery": "Tambahkan Tampilan Galeri", "gallery": "Tambahkan Tampilan Galeri",
"form": "Tambahkan tampilan formulir", "form": "Tambahkan tampilan formulir",
"kanban": "Tambahkan Kanban Lihat", "kanban": "Tambahkan Kanban Lihat",
"map": "Add Map View",
"calendar": "Tambahkan tampilan kalender" "calendar": "Tambahkan tampilan kalender"
}, },
"tablesMetadataInSync": "Tabel metadata sedang disinkronkan", "tablesMetadataInSync": "Tabel metadata sedang disinkronkan",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Nama harus dimulai dengan alfabet atau _", "nameShouldStartWithAnAlphabetOr_": "Nama harus dimulai dengan alfabet atau _",
"followingCharactersAreNotAllowed": "Karakter berikut tidak diperbolehkan", "followingCharactersAreNotAllowed": "Karakter berikut tidak diperbolehkan",
"columnNameRequired": "Nama kolom harus diisi", "columnNameRequired": "Nama kolom harus diisi",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Nama proyek melebihi 50 karakter", "projectNameExceeds50Characters": "Nama proyek melebihi 50 karakter",
"projectNameCannotStartWithSpace": "Nama proyek tidak boleh dimulai dengan spasi", "projectNameCannotStartWithSpace": "Nama proyek tidak boleh dimulai dengan spasi",
"requiredField": "Bidang yang dibutuhkan", "requiredField": "Bidang yang dibutuhkan",

21
packages/nc-gui/lang/it.json

@ -74,7 +74,8 @@
"insertBefore": "Inserire prima", "insertBefore": "Inserire prima",
"hideField": "Campo nascosto", "hideField": "Campo nascosto",
"sortAsc": "Ordinamento crescente", "sortAsc": "Ordinamento crescente",
"sortDesc": "Ordinamento decrescente" "sortDesc": "Ordinamento decrescente",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Progetto", "project": "Progetto",
@ -98,7 +99,8 @@
"gallery": "Galleria", "gallery": "Galleria",
"form": "Modulo", "form": "Modulo",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Calendario" "calendar": "Calendario",
"map": "Map"
}, },
"user": "Utente", "user": "Utente",
"users": "Utenti", "users": "Utenti",
@ -136,6 +138,7 @@
"Currency": "Moneta", "Currency": "Moneta",
"Percent": "Percento", "Percent": "Percento",
"Duration": "Durata", "Duration": "Durata",
"GeoData": "GeoData",
"Rating": "Valutazione", "Rating": "Valutazione",
"Formula": "Formula", "Formula": "Formula",
"Rollup": "Rollup", "Rollup": "Rollup",
@ -253,6 +256,9 @@
"barcodeFormat": "Formato del codice a barre", "barcodeFormat": "Formato del codice a barre",
"qrCodeValueTooLong": "Troppi caratteri per un codice QR", "qrCodeValueTooLong": "Troppi caratteri per un codice QR",
"barcodeValueTooLong": "Troppi caratteri per un codice a barre", "barcodeValueTooLong": "Troppi caratteri per un codice a barre",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Aggrega funzione", "aggregateFunction": "Aggrega funzione",
"dbCreateIfNotExists": "Database: crea se non esiste", "dbCreateIfNotExists": "Database: crea se non esiste",
"clientKey": "Chiave client", "clientKey": "Chiave client",
@ -452,6 +458,10 @@
"stackedBy": "Impilato da", "stackedBy": "Impilato da",
"chooseGroupingField": "Scegliere un campo di raggruppamento", "chooseGroupingField": "Scegliere un campo di raggruppamento",
"addOrEditStack": "Aggiungere / modificare la pila" "addOrEditStack": "Aggiungere / modificare la pila"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Il Creatore può creare nuovi progetti e accedere a qualsiasi progetto invitato.", "orgCreator": "Il Creatore può creare nuovi progetti e accedere a qualsiasi progetto invitato.",
"orgViewer": "Il visualizzatore non può creare nuovi progetti, ma può accedere a qualsiasi progetto invitato." "orgViewer": "Il visualizzatore non può creare nuovi progetti, ma può accedere a qualsiasi progetto invitato."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Righe per pagina", "footerInfo": "Righe per pagina",
"upload": "Seleziona il file da caricare", "upload": "Seleziona il file da caricare",
"upload_sub": "o trascinalo qui", "upload_sub": "o trascinalo qui",
@ -600,6 +615,7 @@
"gallery": "Aggiungi vista galleria", "gallery": "Aggiungi vista galleria",
"form": "Aggiungi vista modulo", "form": "Aggiungi vista modulo",
"kanban": "Aggiungi vista kanban", "kanban": "Aggiungi vista kanban",
"map": "Add Map View",
"calendar": "Aggiungi vista calendario" "calendar": "Aggiungi vista calendario"
}, },
"tablesMetadataInSync": "I metadati delle tabelle sono sincronizzati", "tablesMetadataInSync": "I metadati delle tabelle sono sincronizzati",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Il nome deve iniziare con un alfabeto o con _", "nameShouldStartWithAnAlphabetOr_": "Il nome deve iniziare con un alfabeto o con _",
"followingCharactersAreNotAllowed": "I seguenti caratteri non sono ammessi", "followingCharactersAreNotAllowed": "I seguenti caratteri non sono ammessi",
"columnNameRequired": "Il nome della colonna è richiesto", "columnNameRequired": "Il nome della colonna è richiesto",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Il nome del progetto supera i 50 caratteri", "projectNameExceeds50Characters": "Il nome del progetto supera i 50 caratteri",
"projectNameCannotStartWithSpace": "Il nome del progetto non può iniziare con uno spazio", "projectNameCannotStartWithSpace": "Il nome del progetto non può iniziare con uno spazio",
"requiredField": "Campo obbligatorio", "requiredField": "Campo obbligatorio",

21
packages/nc-gui/lang/ja.json

@ -74,7 +74,8 @@
"insertBefore": "前に挿入", "insertBefore": "前に挿入",
"hideField": "フィールドを隠す", "hideField": "フィールドを隠す",
"sortAsc": "昇順", "sortAsc": "昇順",
"sortDesc": "降順" "sortDesc": "降順",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "プロジェクト", "project": "プロジェクト",
@ -98,7 +99,8 @@
"gallery": "ギャラリー", "gallery": "ギャラリー",
"form": "フォーム", "form": "フォーム",
"kanban": "カンバン", "kanban": "カンバン",
"calendar": "カレンダー" "calendar": "カレンダー",
"map": "Map"
}, },
"user": "ユーザー", "user": "ユーザー",
"users": "ユーザー", "users": "ユーザー",
@ -136,6 +138,7 @@
"Currency": "通貨", "Currency": "通貨",
"Percent": "パーセント", "Percent": "パーセント",
"Duration": "間隔", "Duration": "間隔",
"GeoData": "GeoData",
"Rating": "レーティング", "Rating": "レーティング",
"Formula": "方式", "Formula": "方式",
"Rollup": "ロールアップ", "Rollup": "ロールアップ",
@ -253,6 +256,9 @@
"barcodeFormat": "バーコードのフォーマット", "barcodeFormat": "バーコードのフォーマット",
"qrCodeValueTooLong": "QRコードにするには文字数が多すぎる", "qrCodeValueTooLong": "QRコードにするには文字数が多すぎる",
"barcodeValueTooLong": "バーコードの文字数が多すぎる", "barcodeValueTooLong": "バーコードの文字数が多すぎる",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "集約関数", "aggregateFunction": "集約関数",
"dbCreateIfNotExists": "データベース:存在しない場合は作成", "dbCreateIfNotExists": "データベース:存在しない場合は作成",
"clientKey": "クライアントキー", "clientKey": "クライアントキー",
@ -452,6 +458,10 @@
"stackedBy": "スタック", "stackedBy": "スタック",
"chooseGroupingField": "グループ化するフィールドを選択", "chooseGroupingField": "グループ化するフィールドを選択",
"addOrEditStack": "スタックの追加/編集" "addOrEditStack": "スタックの追加/編集"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "「作成者」は新しいプロジェクトを作成でき、かつ招待されたプロジェクトにもアクセスできます。", "orgCreator": "「作成者」は新しいプロジェクトを作成でき、かつ招待されたプロジェクトにもアクセスできます。",
"orgViewer": "ビューアーは新規プロジェクトを作成することはできませんが、招待されたプロジェクトにアクセスできます。" "orgViewer": "ビューアーは新規プロジェクトを作成することはできませんが、招待されたプロジェクトにアクセスできます。"
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "1ページあたりの行数", "footerInfo": "1ページあたりの行数",
"upload": "アップロードするファイルを選択してください", "upload": "アップロードするファイルを選択してください",
"upload_sub": "またはファイルをドラッグ & ドロップ", "upload_sub": "またはファイルをドラッグ & ドロップ",
@ -600,6 +615,7 @@
"gallery": "ギャラリービューを追加", "gallery": "ギャラリービューを追加",
"form": "フォームビューを追加", "form": "フォームビューを追加",
"kanban": "カンバンビューを追加", "kanban": "カンバンビューを追加",
"map": "Add Map View",
"calendar": "カレンダービューを追加" "calendar": "カレンダービューを追加"
}, },
"tablesMetadataInSync": "テーブルメタデータは同期されています", "tablesMetadataInSync": "テーブルメタデータは同期されています",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "名前はアルファベットまたは_で始まる必要があります", "nameShouldStartWithAnAlphabetOr_": "名前はアルファベットまたは_で始まる必要があります",
"followingCharactersAreNotAllowed": "以下の文字種は使用できません", "followingCharactersAreNotAllowed": "以下の文字種は使用できません",
"columnNameRequired": "列名が必要です", "columnNameRequired": "列名が必要です",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "プロジェクト名が50文字を超えています", "projectNameExceeds50Characters": "プロジェクト名が50文字を超えています",
"projectNameCannotStartWithSpace": "プロジェクト名の先頭にはスペースは利用できません", "projectNameCannotStartWithSpace": "プロジェクト名の先頭にはスペースは利用できません",
"requiredField": "必須フィールド", "requiredField": "必須フィールド",

21
packages/nc-gui/lang/ko.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "프로젝트", "project": "프로젝트",
@ -98,7 +99,8 @@
"gallery": "갤러리", "gallery": "갤러리",
"form": "폼", "form": "폼",
"kanban": "칸반", "kanban": "칸반",
"calendar": "캘린더" "calendar": "캘린더",
"map": "Map"
}, },
"user": "사용자", "user": "사용자",
"users": "사용자", "users": "사용자",
@ -136,6 +138,7 @@
"Currency": "통화", "Currency": "통화",
"Percent": "퍼센트", "Percent": "퍼센트",
"Duration": "기간", "Duration": "기간",
"GeoData": "GeoData",
"Rating": "등급", "Rating": "등급",
"Formula": "공식", "Formula": "공식",
"Rollup": "롤업", "Rollup": "롤업",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "집합 함수", "aggregateFunction": "집합 함수",
"dbCreateIfNotExists": "데이터베이스 : 존재하지 않는 경우 생성", "dbCreateIfNotExists": "데이터베이스 : 존재하지 않는 경우 생성",
"clientKey": "클라이언트 키", "clientKey": "클라이언트 키",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "페이지 당 행", "footerInfo": "페이지 당 행",
"upload": "업로드 할 파일 선택", "upload": "업로드 할 파일 선택",
"upload_sub": "또는 끌어서 놓기 파일", "upload_sub": "또는 끌어서 놓기 파일",
@ -600,6 +615,7 @@
"gallery": "갤러리 뷰 추가", "gallery": "갤러리 뷰 추가",
"form": "폼 뷰 추가", "form": "폼 뷰 추가",
"kanban": "칸반 뷰 추가", "kanban": "칸반 뷰 추가",
"map": "Add Map View",
"calendar": "캘린더 뷰 추가" "calendar": "캘린더 뷰 추가"
}, },
"tablesMetadataInSync": "테이블 메타 데이터가 동기화되어 있습니다", "tablesMetadataInSync": "테이블 메타 데이터가 동기화되어 있습니다",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/lv.json

@ -74,7 +74,8 @@
"insertBefore": "Ievietot pirms", "insertBefore": "Ievietot pirms",
"hideField": "Slēpt lauku", "hideField": "Slēpt lauku",
"sortAsc": "Kārtot augošā secībā", "sortAsc": "Kārtot augošā secībā",
"sortDesc": "Kārtot dilstošā secībā" "sortDesc": "Kārtot dilstošā secībā",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekts", "project": "Projekts",
@ -98,7 +99,8 @@
"gallery": "Galerija", "gallery": "Galerija",
"form": "Forma", "form": "Forma",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalendārs" "calendar": "Kalendārs",
"map": "Map"
}, },
"user": "Lietotājs", "user": "Lietotājs",
"users": "Lietotāji", "users": "Lietotāji",
@ -136,6 +138,7 @@
"Currency": "Valūta", "Currency": "Valūta",
"Percent": "Procenti", "Percent": "Procenti",
"Duration": "Ilgums", "Duration": "Ilgums",
"GeoData": "GeoData",
"Rating": "Vērtējums", "Rating": "Vērtējums",
"Formula": "Formula", "Formula": "Formula",
"Rollup": "Apkopojums", "Rollup": "Apkopojums",
@ -253,6 +256,9 @@
"barcodeFormat": "Svītrkoda formāts", "barcodeFormat": "Svītrkoda formāts",
"qrCodeValueTooLong": "Pārāk daudz rakstzīmju QR kodam", "qrCodeValueTooLong": "Pārāk daudz rakstzīmju QR kodam",
"barcodeValueTooLong": "Pārāk daudz zīmju svītrkodam", "barcodeValueTooLong": "Pārāk daudz zīmju svītrkodam",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Agregācijas funkcija", "aggregateFunction": "Agregācijas funkcija",
"dbCreateIfNotExists": "Datubāze : izveidotm ja neeksistē", "dbCreateIfNotExists": "Datubāze : izveidotm ja neeksistē",
"clientKey": "Klienta atslēga", "clientKey": "Klienta atslēga",
@ -452,6 +458,10 @@
"stackedBy": "Sakrautas ar", "stackedBy": "Sakrautas ar",
"chooseGroupingField": "Izvēlieties grupēšanas lauku", "chooseGroupingField": "Izvēlieties grupēšanas lauku",
"addOrEditStack": "Pievienot / rediģēt kaudzi" "addOrEditStack": "Pievienot / rediģēt kaudzi"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Radītājs var izveidot jaunus projektus un piekļūt jebkuram uzaicinātajam projektam.", "orgCreator": "Radītājs var izveidot jaunus projektus un piekļūt jebkuram uzaicinātajam projektam.",
"orgViewer": "Skatītājs nedrīkst veidot jaunus projektus, bet var piekļūt jebkuram uzaicinātajam projektam." "orgViewer": "Skatītājs nedrīkst veidot jaunus projektus, bet var piekļūt jebkuram uzaicinātajam projektam."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "ieraksti lapā", "footerInfo": "ieraksti lapā",
"upload": "Izvēlēties datni augšupielādei", "upload": "Izvēlēties datni augšupielādei",
"upload_sub": "vai vilkt un nomest datni", "upload_sub": "vai vilkt un nomest datni",
@ -600,6 +615,7 @@
"gallery": "Pievienot galerijas skatu", "gallery": "Pievienot galerijas skatu",
"form": "Pievienot formas skatu", "form": "Pievienot formas skatu",
"kanban": "Pievienot Kanban skatu", "kanban": "Pievienot Kanban skatu",
"map": "Add Map View",
"calendar": "Pievienot kalendāra skatu" "calendar": "Pievienot kalendāra skatu"
}, },
"tablesMetadataInSync": "Tabulu metadati ir sinhronizācijā", "tablesMetadataInSync": "Tabulu metadati ir sinhronizācijā",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Vārdam jāsākas ar alfabētu vai _", "nameShouldStartWithAnAlphabetOr_": "Vārdam jāsākas ar alfabētu vai _",
"followingCharactersAreNotAllowed": "Šādas rakstzīmes nav atļautas", "followingCharactersAreNotAllowed": "Šādas rakstzīmes nav atļautas",
"columnNameRequired": "Slejas nosaukums ir obligāts", "columnNameRequired": "Slejas nosaukums ir obligāts",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Projekta nosaukums pārsniedz 50 rakstzīmes", "projectNameExceeds50Characters": "Projekta nosaukums pārsniedz 50 rakstzīmes",
"projectNameCannotStartWithSpace": "Projekta nosaukums nedrīkst sākties ar atstarpi", "projectNameCannotStartWithSpace": "Projekta nosaukums nedrīkst sākties ar atstarpi",
"requiredField": "Obligātais lauks", "requiredField": "Obligātais lauks",

21
packages/nc-gui/lang/nl.json

@ -74,7 +74,8 @@
"insertBefore": "Invoegen voor", "insertBefore": "Invoegen voor",
"hideField": "Verberg veld", "hideField": "Verberg veld",
"sortAsc": "Oplopend sorteren", "sortAsc": "Oplopend sorteren",
"sortDesc": "Aflopend sorteren" "sortDesc": "Aflopend sorteren",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Project", "project": "Project",
@ -98,7 +99,8 @@
"gallery": "Galerij", "gallery": "Galerij",
"form": "Formulier", "form": "Formulier",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalender" "calendar": "Kalender",
"map": "Map"
}, },
"user": "Gebruiker", "user": "Gebruiker",
"users": "Gebruikers", "users": "Gebruikers",
@ -136,6 +138,7 @@
"Currency": "Munteenheid", "Currency": "Munteenheid",
"Percent": "Procent", "Percent": "Procent",
"Duration": "Looptijd", "Duration": "Looptijd",
"GeoData": "GeoData",
"Rating": "Beoordeling", "Rating": "Beoordeling",
"Formula": "Formule", "Formula": "Formule",
"Rollup": "Rollup", "Rollup": "Rollup",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode formaat", "barcodeFormat": "Barcode formaat",
"qrCodeValueTooLong": "Te veel tekens voor een QR-code", "qrCodeValueTooLong": "Te veel tekens voor een QR-code",
"barcodeValueTooLong": "Te veel tekens voor een streepjescode", "barcodeValueTooLong": "Te veel tekens voor een streepjescode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Geaggregeerde functie", "aggregateFunction": "Geaggregeerde functie",
"dbCreateIfNotExists": "Database: creëer als het niet bestaat", "dbCreateIfNotExists": "Database: creëer als het niet bestaat",
"clientKey": "Klantensleutel", "clientKey": "Klantensleutel",
@ -452,6 +458,10 @@
"stackedBy": "Gestapeld door", "stackedBy": "Gestapeld door",
"chooseGroupingField": "Kies een groepeerveld", "chooseGroupingField": "Kies een groepeerveld",
"addOrEditStack": "Stapel toevoegen / bewerken" "addOrEditStack": "Stapel toevoegen / bewerken"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator kan nieuwe projecten aanmaken en heeft toegang tot elk uitgenodigd project.", "orgCreator": "Creator kan nieuwe projecten aanmaken en heeft toegang tot elk uitgenodigd project.",
"orgViewer": "De Viewer mag geen nieuwe projecten aanmaken, maar heeft wel toegang tot elk uitgenodigd project." "orgViewer": "De Viewer mag geen nieuwe projecten aanmaken, maar heeft wel toegang tot elk uitgenodigd project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Rijen per pagina", "footerInfo": "Rijen per pagina",
"upload": "Selecteer bestand om te uploaden", "upload": "Selecteer bestand om te uploaden",
"upload_sub": "of sleep het bestand naar hier", "upload_sub": "of sleep het bestand naar hier",
@ -600,6 +615,7 @@
"gallery": "Gallerijweergave toevoegen", "gallery": "Gallerijweergave toevoegen",
"form": "Formulierweergave toevoegen", "form": "Formulierweergave toevoegen",
"kanban": "Kanbanweergave toevoegen", "kanban": "Kanbanweergave toevoegen",
"map": "Add Map View",
"calendar": "Kalenderweergave toevoegen" "calendar": "Kalenderweergave toevoegen"
}, },
"tablesMetadataInSync": "Tabelmetadata is gesynchroniseerd", "tablesMetadataInSync": "Tabelmetadata is gesynchroniseerd",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "De naam moet beginnen met een alfabet of _", "nameShouldStartWithAnAlphabetOr_": "De naam moet beginnen met een alfabet of _",
"followingCharactersAreNotAllowed": "De volgende tekens zijn niet toegestaan", "followingCharactersAreNotAllowed": "De volgende tekens zijn niet toegestaan",
"columnNameRequired": "Kolomnaam is verplicht", "columnNameRequired": "Kolomnaam is verplicht",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Projectnaam meer dan 50 tekens", "projectNameExceeds50Characters": "Projectnaam meer dan 50 tekens",
"projectNameCannotStartWithSpace": "Projectnaam kan niet beginnen met een spatie", "projectNameCannotStartWithSpace": "Projectnaam kan niet beginnen met een spatie",
"requiredField": "Verplicht veld", "requiredField": "Verplicht veld",

21
packages/nc-gui/lang/no.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Prosjekt", "project": "Prosjekt",
@ -98,7 +99,8 @@
"gallery": "Galleri", "gallery": "Galleri",
"form": "Skjema", "form": "Skjema",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalender" "calendar": "Kalender",
"map": "Map"
}, },
"user": "Bruker", "user": "Bruker",
"users": "Brukere", "users": "Brukere",
@ -136,6 +138,7 @@
"Currency": "Valuta", "Currency": "Valuta",
"Percent": "Prosent", "Percent": "Prosent",
"Duration": "Varighet", "Duration": "Varighet",
"GeoData": "GeoData",
"Rating": "Vurdering", "Rating": "Vurdering",
"Formula": "Formel", "Formula": "Formel",
"Rollup": "Rull opp", "Rollup": "Rull opp",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Samlet funksjon", "aggregateFunction": "Samlet funksjon",
"dbCreateIfNotExists": "Database: Opprett hvis ikke eksisterer", "dbCreateIfNotExists": "Database: Opprett hvis ikke eksisterer",
"clientKey": "Klientnøkkel", "clientKey": "Klientnøkkel",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Rader per side.", "footerInfo": "Rader per side.",
"upload": "Velg Fil for å laste opp", "upload": "Velg Fil for å laste opp",
"upload_sub": "eller dra og slipp filen", "upload_sub": "eller dra og slipp filen",
@ -600,6 +615,7 @@
"gallery": "Legg til galleriutsikt", "gallery": "Legg til galleriutsikt",
"form": "Legg til skjemavisning", "form": "Legg til skjemavisning",
"kanban": "Legg til Kanban View", "kanban": "Legg til Kanban View",
"map": "Add Map View",
"calendar": "Legg til kalendervisning" "calendar": "Legg til kalendervisning"
}, },
"tablesMetadataInSync": "Tabeller Metadata er synkronisert", "tablesMetadataInSync": "Tabeller Metadata er synkronisert",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/pl.json

@ -74,7 +74,8 @@
"insertBefore": "Wstaw przed", "insertBefore": "Wstaw przed",
"hideField": "Ukryj pole", "hideField": "Ukryj pole",
"sortAsc": "Sortowanie rosnące", "sortAsc": "Sortowanie rosnące",
"sortDesc": "Sortuj malejąco" "sortDesc": "Sortuj malejąco",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -98,7 +99,8 @@
"gallery": "Galeria", "gallery": "Galeria",
"form": "Formularz", "form": "Formularz",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalendarz" "calendar": "Kalendarz",
"map": "Map"
}, },
"user": "Użytkownik", "user": "Użytkownik",
"users": "Użytkownicy", "users": "Użytkownicy",
@ -136,6 +138,7 @@
"Currency": "Waluta", "Currency": "Waluta",
"Percent": "Procent", "Percent": "Procent",
"Duration": "Czas trwania", "Duration": "Czas trwania",
"GeoData": "GeoData",
"Rating": "Ocena", "Rating": "Ocena",
"Formula": "Formuła", "Formula": "Formuła",
"Rollup": "Zliczanie", "Rollup": "Zliczanie",
@ -253,6 +256,9 @@
"barcodeFormat": "Format kodu kreskowego", "barcodeFormat": "Format kodu kreskowego",
"qrCodeValueTooLong": "Zbyt wiele znaków dla kodu QR", "qrCodeValueTooLong": "Zbyt wiele znaków dla kodu QR",
"barcodeValueTooLong": "Zbyt wiele znaków dla kodu kreskowego", "barcodeValueTooLong": "Zbyt wiele znaków dla kodu kreskowego",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Funkcja agregacji", "aggregateFunction": "Funkcja agregacji",
"dbCreateIfNotExists": "Baza danych: Utwórz, jeśli nie istnieje", "dbCreateIfNotExists": "Baza danych: Utwórz, jeśli nie istnieje",
"clientKey": "Klucz klienta", "clientKey": "Klucz klienta",
@ -452,6 +458,10 @@
"stackedBy": "Ułożone według", "stackedBy": "Ułożone według",
"chooseGroupingField": "Wybierz pole grupowania", "chooseGroupingField": "Wybierz pole grupowania",
"addOrEditStack": "Dodaj / Edytuj stos" "addOrEditStack": "Dodaj / Edytuj stos"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Twórca może tworzyć nowe projekty i mieć dostęp do każdego zaproszonego projektu.", "orgCreator": "Twórca może tworzyć nowe projekty i mieć dostęp do każdego zaproszonego projektu.",
"orgViewer": "Widz nie może tworzyć nowych projektów, ale może mieć dostęp do każdego zaproszonego projektu." "orgViewer": "Widz nie może tworzyć nowych projektów, ale może mieć dostęp do każdego zaproszonego projektu."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Wiersze na stronę", "footerInfo": "Wiersze na stronę",
"upload": "Wybierz plik do przesłania", "upload": "Wybierz plik do przesłania",
"upload_sub": "lub przeciągnij i upuść plik", "upload_sub": "lub przeciągnij i upuść plik",
@ -600,6 +615,7 @@
"gallery": "Dodaj widok galerii.", "gallery": "Dodaj widok galerii.",
"form": "Dodaj widok formy", "form": "Dodaj widok formy",
"kanban": "Dodaj widok Kanban.", "kanban": "Dodaj widok Kanban.",
"map": "Add Map View",
"calendar": "Dodaj widok kalendarza" "calendar": "Dodaj widok kalendarza"
}, },
"tablesMetadataInSync": "Tabele Metadane są synchronizowane", "tablesMetadataInSync": "Tabele Metadane są synchronizowane",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Nazwa powinna zaczynać się od alfabetu lub od _", "nameShouldStartWithAnAlphabetOr_": "Nazwa powinna zaczynać się od alfabetu lub od _",
"followingCharactersAreNotAllowed": "Następujące znaki są niedozwolone", "followingCharactersAreNotAllowed": "Następujące znaki są niedozwolone",
"columnNameRequired": "Nazwa kolumny jest wymagana", "columnNameRequired": "Nazwa kolumny jest wymagana",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Nazwa projektu przekracza 50 znaków", "projectNameExceeds50Characters": "Nazwa projektu przekracza 50 znaków",
"projectNameCannotStartWithSpace": "Nazwa projektu nie może zaczynać się od spacji", "projectNameCannotStartWithSpace": "Nazwa projektu nie może zaczynać się od spacji",
"requiredField": "Pole wymagane", "requiredField": "Pole wymagane",

21
packages/nc-gui/lang/pt.json

@ -74,7 +74,8 @@
"insertBefore": "Inserir Antes", "insertBefore": "Inserir Antes",
"hideField": "Ocultar Campo", "hideField": "Ocultar Campo",
"sortAsc": "Ordenar Ascendente", "sortAsc": "Ordenar Ascendente",
"sortDesc": "Ordenar Descendente" "sortDesc": "Ordenar Descendente",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projeto", "project": "Projeto",
@ -98,7 +99,8 @@
"gallery": "Galeria", "gallery": "Galeria",
"form": "Formulário", "form": "Formulário",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Calendário" "calendar": "Calendário",
"map": "Map"
}, },
"user": "Do utilizador", "user": "Do utilizador",
"users": "Comercial", "users": "Comercial",
@ -136,6 +138,7 @@
"Currency": "Moeda", "Currency": "Moeda",
"Percent": "Por cento", "Percent": "Por cento",
"Duration": "Duração", "Duration": "Duração",
"GeoData": "GeoData",
"Rating": "Avaliação", "Rating": "Avaliação",
"Formula": "Fórmula", "Formula": "Fórmula",
"Rollup": "Rolar", "Rollup": "Rolar",
@ -253,6 +256,9 @@
"barcodeFormat": "Formato do código de barras", "barcodeFormat": "Formato do código de barras",
"qrCodeValueTooLong": "Demasiados caracteres para um código QR", "qrCodeValueTooLong": "Demasiados caracteres para um código QR",
"barcodeValueTooLong": "Demasiados caracteres para um código de barras", "barcodeValueTooLong": "Demasiados caracteres para um código de barras",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Função agregada", "aggregateFunction": "Função agregada",
"dbCreateIfNotExists": "Base de Dados : criar se não existir", "dbCreateIfNotExists": "Base de Dados : criar se não existir",
"clientKey": "Chave do Cliente", "clientKey": "Chave do Cliente",
@ -452,6 +458,10 @@
"stackedBy": "Empilhado por", "stackedBy": "Empilhado por",
"chooseGroupingField": "Escolha um Campo de Agrupamento", "chooseGroupingField": "Escolha um Campo de Agrupamento",
"addOrEditStack": "Adicionar / Editar Pilha" "addOrEditStack": "Adicionar / Editar Pilha"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "O criador pode criar novos projectos e aceder a qualquer projecto convidado.", "orgCreator": "O criador pode criar novos projectos e aceder a qualquer projecto convidado.",
"orgViewer": "O espectador não está autorizado a criar novos projectos, mas pode aceder a qualquer projecto convidado." "orgViewer": "O espectador não está autorizado a criar novos projectos, mas pode aceder a qualquer projecto convidado."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Linhas por página", "footerInfo": "Linhas por página",
"upload": "Selecione Arquivo para upload", "upload": "Selecione Arquivo para upload",
"upload_sub": "ou arrastar e soltar arquivo", "upload_sub": "ou arrastar e soltar arquivo",
@ -600,6 +615,7 @@
"gallery": "Adicionar vista de galeria", "gallery": "Adicionar vista de galeria",
"form": "Adicionar vista de formulário", "form": "Adicionar vista de formulário",
"kanban": "Adicionar vista de Kanban", "kanban": "Adicionar vista de Kanban",
"map": "Add Map View",
"calendar": "Adicionar vista de calendário" "calendar": "Adicionar vista de calendário"
}, },
"tablesMetadataInSync": "Metadados de tabelas está em sincronia", "tablesMetadataInSync": "Metadados de tabelas está em sincronia",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "O nome deve começar com um alfabeto ou _", "nameShouldStartWithAnAlphabetOr_": "O nome deve começar com um alfabeto ou _",
"followingCharactersAreNotAllowed": "Os seguintes caracteres não são permitidos", "followingCharactersAreNotAllowed": "Os seguintes caracteres não são permitidos",
"columnNameRequired": "O nome da coluna é obrigatório", "columnNameRequired": "O nome da coluna é obrigatório",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "O nome do projecto excede 50 caracteres", "projectNameExceeds50Characters": "O nome do projecto excede 50 caracteres",
"projectNameCannotStartWithSpace": "O nome do projecto não pode começar com espaço", "projectNameCannotStartWithSpace": "O nome do projecto não pode começar com espaço",
"requiredField": "Campo obrigatório", "requiredField": "Campo obrigatório",

21
packages/nc-gui/lang/pt_BR.json

@ -74,7 +74,8 @@
"insertBefore": "Inserir Antes", "insertBefore": "Inserir Antes",
"hideField": "Ocultar Campo", "hideField": "Ocultar Campo",
"sortAsc": "Ordenar Ascendente", "sortAsc": "Ordenar Ascendente",
"sortDesc": "Ordenar Descendente" "sortDesc": "Ordenar Descendente",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projeto", "project": "Projeto",
@ -98,7 +99,8 @@
"gallery": "Galeria", "gallery": "Galeria",
"form": "Formulário", "form": "Formulário",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Calendário" "calendar": "Calendário",
"map": "Map"
}, },
"user": "Do utilizador", "user": "Do utilizador",
"users": "Comercial", "users": "Comercial",
@ -136,6 +138,7 @@
"Currency": "Moeda", "Currency": "Moeda",
"Percent": "Por cento", "Percent": "Por cento",
"Duration": "Duração", "Duration": "Duração",
"GeoData": "GeoData",
"Rating": "Avaliação", "Rating": "Avaliação",
"Formula": "Fórmula", "Formula": "Fórmula",
"Rollup": "Rolar", "Rollup": "Rolar",
@ -253,6 +256,9 @@
"barcodeFormat": "Formato do código de barras", "barcodeFormat": "Formato do código de barras",
"qrCodeValueTooLong": "Demasiados caracteres para um código QR", "qrCodeValueTooLong": "Demasiados caracteres para um código QR",
"barcodeValueTooLong": "Demasiados caracteres para um código de barras", "barcodeValueTooLong": "Demasiados caracteres para um código de barras",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Função agregada", "aggregateFunction": "Função agregada",
"dbCreateIfNotExists": "Base de Dados : criar se não existir", "dbCreateIfNotExists": "Base de Dados : criar se não existir",
"clientKey": "Chave do Cliente", "clientKey": "Chave do Cliente",
@ -452,6 +458,10 @@
"stackedBy": "Empilhado por", "stackedBy": "Empilhado por",
"chooseGroupingField": "Escolha um Campo de Agrupamento", "chooseGroupingField": "Escolha um Campo de Agrupamento",
"addOrEditStack": "Adicionar / Editar Pilha" "addOrEditStack": "Adicionar / Editar Pilha"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "O criador pode criar novos projectos e aceder a qualquer projecto convidado.", "orgCreator": "O criador pode criar novos projectos e aceder a qualquer projecto convidado.",
"orgViewer": "O espectador não está autorizado a criar novos projectos, mas pode aceder a qualquer projecto convidado." "orgViewer": "O espectador não está autorizado a criar novos projectos, mas pode aceder a qualquer projecto convidado."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Linhas por página", "footerInfo": "Linhas por página",
"upload": "Selecione Arquivo para upload", "upload": "Selecione Arquivo para upload",
"upload_sub": "ou arrastar e soltar arquivo", "upload_sub": "ou arrastar e soltar arquivo",
@ -600,6 +615,7 @@
"gallery": "Adicionar vizualização de galeria", "gallery": "Adicionar vizualização de galeria",
"form": "Adicionar vizualização de formulário", "form": "Adicionar vizualização de formulário",
"kanban": "Adicionar vizualização de Kanban", "kanban": "Adicionar vizualização de Kanban",
"map": "Add Map View",
"calendar": "Adicionar vizualização de calendário" "calendar": "Adicionar vizualização de calendário"
}, },
"tablesMetadataInSync": "Metadados de tabelas está em sincronia", "tablesMetadataInSync": "Metadados de tabelas está em sincronia",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "O nome deve começar com um alfabeto ou _", "nameShouldStartWithAnAlphabetOr_": "O nome deve começar com um alfabeto ou _",
"followingCharactersAreNotAllowed": "Os seguintes caracteres não são permitidos", "followingCharactersAreNotAllowed": "Os seguintes caracteres não são permitidos",
"columnNameRequired": "O nome da coluna é obrigatório", "columnNameRequired": "O nome da coluna é obrigatório",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "O nome do projecto excede 50 caracteres", "projectNameExceeds50Characters": "O nome do projecto excede 50 caracteres",
"projectNameCannotStartWithSpace": "O nome do projecto não pode começar com espaço", "projectNameCannotStartWithSpace": "O nome do projecto não pode começar com espaço",
"requiredField": "Campo obrigatório", "requiredField": "Campo obrigatório",

21
packages/nc-gui/lang/ru.json

@ -74,7 +74,8 @@
"insertBefore": "Вставить перед", "insertBefore": "Вставить перед",
"hideField": "Скрыть поле", "hideField": "Скрыть поле",
"sortAsc": "По Возрастанию", "sortAsc": "По Возрастанию",
"sortDesc": "По убыванию" "sortDesc": "По убыванию",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Проект", "project": "Проект",
@ -98,7 +99,8 @@
"gallery": "Галерея", "gallery": "Галерея",
"form": "Форма", "form": "Форма",
"kanban": "Канбан", "kanban": "Канбан",
"calendar": "Календарь" "calendar": "Календарь",
"map": "Map"
}, },
"user": "Пользователь", "user": "Пользователь",
"users": "Пользователи", "users": "Пользователи",
@ -136,6 +138,7 @@
"Currency": "Валюта", "Currency": "Валюта",
"Percent": "Процент", "Percent": "Процент",
"Duration": "Интервал времени", "Duration": "Интервал времени",
"GeoData": "GeoData",
"Rating": "Рейтинг", "Rating": "Рейтинг",
"Formula": "Формула", "Formula": "Формула",
"Rollup": "Итоги (Rollup)", "Rollup": "Итоги (Rollup)",
@ -253,6 +256,9 @@
"barcodeFormat": "Формат штрих-кода", "barcodeFormat": "Формат штрих-кода",
"qrCodeValueTooLong": "Слишком много символов для QR-кода", "qrCodeValueTooLong": "Слишком много символов для QR-кода",
"barcodeValueTooLong": "Слишком много символов для штрихкода", "barcodeValueTooLong": "Слишком много символов для штрихкода",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Агрегатная функция", "aggregateFunction": "Агрегатная функция",
"dbCreateIfNotExists": "База данных: создать, если не существует", "dbCreateIfNotExists": "База данных: создать, если не существует",
"clientKey": "Ключ клиента", "clientKey": "Ключ клиента",
@ -452,6 +458,10 @@
"stackedBy": "Группировка по", "stackedBy": "Группировка по",
"chooseGroupingField": "Выберите поле группировки", "chooseGroupingField": "Выберите поле группировки",
"addOrEditStack": "Добавление / редактирование стека" "addOrEditStack": "Добавление / редактирование стека"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Создатель может создавать новые проекты и получать доступ к любому приглашенному проекту.", "orgCreator": "Создатель может создавать новые проекты и получать доступ к любому приглашенному проекту.",
"orgViewer": "Наблюдатель не может создавать новые проекты, но может получить доступ к любому проекту по приглашению." "orgViewer": "Наблюдатель не может создавать новые проекты, но может получить доступ к любому проекту по приглашению."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Количество строк на странице", "footerInfo": "Количество строк на странице",
"upload": "Выберите файл для загрузки", "upload": "Выберите файл для загрузки",
"upload_sub": "или перетащите файл", "upload_sub": "или перетащите файл",
@ -600,6 +615,7 @@
"gallery": "Добавить представление галерея", "gallery": "Добавить представление галерея",
"form": "Добавить представление форма", "form": "Добавить представление форма",
"kanban": "Добавить представление Канбан", "kanban": "Добавить представление Канбан",
"map": "Add Map View",
"calendar": "Добавить представление календарь" "calendar": "Добавить представление календарь"
}, },
"tablesMetadataInSync": "Таблицы метаданные синхронизируются", "tablesMetadataInSync": "Таблицы метаданные синхронизируются",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Имя должно начинаться с алфавита или _", "nameShouldStartWithAnAlphabetOr_": "Имя должно начинаться с алфавита или _",
"followingCharactersAreNotAllowed": "Нельзя использовать следующие символы", "followingCharactersAreNotAllowed": "Нельзя использовать следующие символы",
"columnNameRequired": "Требуется название столбца", "columnNameRequired": "Требуется название столбца",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Название проекта превышает 50 символов", "projectNameExceeds50Characters": "Название проекта превышает 50 символов",
"projectNameCannotStartWithSpace": "Название проекта не может начинаться с пробела", "projectNameCannotStartWithSpace": "Название проекта не может начинаться с пробела",
"requiredField": "Обязательное поле", "requiredField": "Обязательное поле",

21
packages/nc-gui/lang/sk.json

@ -74,7 +74,8 @@
"insertBefore": "Vložiť pred", "insertBefore": "Vložiť pred",
"hideField": "Skryť pole", "hideField": "Skryť pole",
"sortAsc": "Zoradiť vzostupne", "sortAsc": "Zoradiť vzostupne",
"sortDesc": "Zoradiť zostupne" "sortDesc": "Zoradiť zostupne",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -98,7 +99,8 @@
"gallery": "Galéria", "gallery": "Galéria",
"form": "Formulár", "form": "Formulár",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalendár" "calendar": "Kalendár",
"map": "Map"
}, },
"user": "Používateľ", "user": "Používateľ",
"users": "Používatelia", "users": "Používatelia",
@ -136,6 +138,7 @@
"Currency": "Mena", "Currency": "Mena",
"Percent": "Percentá", "Percent": "Percentá",
"Duration": "Trvanie", "Duration": "Trvanie",
"GeoData": "GeoData",
"Rating": "Hodnotenie", "Rating": "Hodnotenie",
"Formula": "Vzorec", "Formula": "Vzorec",
"Rollup": "Rollup", "Rollup": "Rollup",
@ -253,6 +256,9 @@
"barcodeFormat": "Formát čiarového kódu", "barcodeFormat": "Formát čiarového kódu",
"qrCodeValueTooLong": "Príliš veľa znakov pre kód QR", "qrCodeValueTooLong": "Príliš veľa znakov pre kód QR",
"barcodeValueTooLong": "Príliš veľa znakov pre čiarový kód", "barcodeValueTooLong": "Príliš veľa znakov pre čiarový kód",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Súhrnná funkcia", "aggregateFunction": "Súhrnná funkcia",
"dbCreateIfNotExists": "Databáza : vytvoriť, ak neexistuje", "dbCreateIfNotExists": "Databáza : vytvoriť, ak neexistuje",
"clientKey": "Kľúč klienta", "clientKey": "Kľúč klienta",
@ -452,6 +458,10 @@
"stackedBy": "Naskladané podľa", "stackedBy": "Naskladané podľa",
"chooseGroupingField": "Výber zoskupovacieho poľa", "chooseGroupingField": "Výber zoskupovacieho poľa",
"addOrEditStack": "Pridať / upraviť zásobník" "addOrEditStack": "Pridať / upraviť zásobník"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator môže vytvárať nové projekty a pristupovať k ľubovoľnému pozvanému projektu.", "orgCreator": "Creator môže vytvárať nové projekty a pristupovať k ľubovoľnému pozvanému projektu.",
"orgViewer": "Prehliadač nemôže vytvárať nové projekty, ale môže pristupovať k ľubovoľnému pozvanému projektu." "orgViewer": "Prehliadač nemôže vytvárať nové projekty, ale môže pristupovať k ľubovoľnému pozvanému projektu."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Riadky na stránku", "footerInfo": "Riadky na stránku",
"upload": "Vyberte súbor na odoslanie", "upload": "Vyberte súbor na odoslanie",
"upload_sub": "alebo potiahnite a pustite súbor", "upload_sub": "alebo potiahnite a pustite súbor",
@ -600,6 +615,7 @@
"gallery": "Pridanie zobrazenia galérie", "gallery": "Pridanie zobrazenia galérie",
"form": "Pridanie zobrazenia formulára", "form": "Pridanie zobrazenia formulára",
"kanban": "Pridanie zobrazenia Kanban", "kanban": "Pridanie zobrazenia Kanban",
"map": "Add Map View",
"calendar": "Pridanie zobrazenia kalendára" "calendar": "Pridanie zobrazenia kalendára"
}, },
"tablesMetadataInSync": "Metadáta tabuliek sú synchronizované", "tablesMetadataInSync": "Metadáta tabuliek sú synchronizované",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Meno by malo začínať abecedou alebo _", "nameShouldStartWithAnAlphabetOr_": "Meno by malo začínať abecedou alebo _",
"followingCharactersAreNotAllowed": "Nasledujúce znaky nie sú povolené", "followingCharactersAreNotAllowed": "Nasledujúce znaky nie sú povolené",
"columnNameRequired": "Vyžaduje sa názov stĺpca", "columnNameRequired": "Vyžaduje sa názov stĺpca",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Názov projektu presahuje 50 znakov", "projectNameExceeds50Characters": "Názov projektu presahuje 50 znakov",
"projectNameCannotStartWithSpace": "Názov projektu nemôže začínať medzerou", "projectNameCannotStartWithSpace": "Názov projektu nemôže začínať medzerou",
"requiredField": "Povinné pole", "requiredField": "Povinné pole",

21
packages/nc-gui/lang/sl.json

@ -74,7 +74,8 @@
"insertBefore": "Vstavljanje pred", "insertBefore": "Vstavljanje pred",
"hideField": "Skrij polje", "hideField": "Skrij polje",
"sortAsc": "Razvrsti naraščajoče", "sortAsc": "Razvrsti naraščajoče",
"sortDesc": "Razvrsti padajoče" "sortDesc": "Razvrsti padajoče",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Project.", "project": "Project.",
@ -98,7 +99,8 @@
"gallery": "Galerija", "gallery": "Galerija",
"form": "Obrazec", "form": "Obrazec",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Koledar" "calendar": "Koledar",
"map": "Map"
}, },
"user": "Uporabnik", "user": "Uporabnik",
"users": "Uporabniki", "users": "Uporabniki",
@ -136,6 +138,7 @@
"Currency": "Valuta", "Currency": "Valuta",
"Percent": "Odstotek", "Percent": "Odstotek",
"Duration": "Trajanje", "Duration": "Trajanje",
"GeoData": "GeoData",
"Rating": "Ocena", "Rating": "Ocena",
"Formula": "Formula", "Formula": "Formula",
"Rollup": "Zavihamo", "Rollup": "Zavihamo",
@ -253,6 +256,9 @@
"barcodeFormat": "Format črtne kode", "barcodeFormat": "Format črtne kode",
"qrCodeValueTooLong": "Preveč znakov za kodo QR", "qrCodeValueTooLong": "Preveč znakov za kodo QR",
"barcodeValueTooLong": "Preveč znakov za črtno kodo", "barcodeValueTooLong": "Preveč znakov za črtno kodo",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Agregatna funkcija", "aggregateFunction": "Agregatna funkcija",
"dbCreateIfNotExists": "Baza podatkov: Ustvari, če ne obstaja", "dbCreateIfNotExists": "Baza podatkov: Ustvari, če ne obstaja",
"clientKey": "Odjemalski ključ", "clientKey": "Odjemalski ključ",
@ -452,6 +458,10 @@
"stackedBy": "Zloženo po", "stackedBy": "Zloženo po",
"chooseGroupingField": "Izberite polje za združevanje", "chooseGroupingField": "Izberite polje za združevanje",
"addOrEditStack": "Dodajanje / urejanje sklada" "addOrEditStack": "Dodajanje / urejanje sklada"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Ustvarjalec lahko ustvarja nove projekte in dostopa do vseh povabljenih projektov.", "orgCreator": "Ustvarjalec lahko ustvarja nove projekte in dostopa do vseh povabljenih projektov.",
"orgViewer": "Pregledovalec ne sme ustvarjati novih projektov, lahko pa dostopa do vseh povabljenih projektov." "orgViewer": "Pregledovalec ne sme ustvarjati novih projektov, lahko pa dostopa do vseh povabljenih projektov."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Vrstice na stran.", "footerInfo": "Vrstice na stran.",
"upload": "Izberite datoteko za nalaganje", "upload": "Izberite datoteko za nalaganje",
"upload_sub": "ali datoteko povlecite in spustite", "upload_sub": "ali datoteko povlecite in spustite",
@ -600,6 +615,7 @@
"gallery": "Dodaj ogled galerije", "gallery": "Dodaj ogled galerije",
"form": "Dodaj pogled obrazca", "form": "Dodaj pogled obrazca",
"kanban": "Dodaj pogled Kanban-a", "kanban": "Dodaj pogled Kanban-a",
"map": "Add Map View",
"calendar": "Dodaj pogled koledarja" "calendar": "Dodaj pogled koledarja"
}, },
"tablesMetadataInSync": "Tabele metapodatkov je v sinhronizaciji", "tablesMetadataInSync": "Tabele metapodatkov je v sinhronizaciji",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Ime se mora začeti z abecedo ali _", "nameShouldStartWithAnAlphabetOr_": "Ime se mora začeti z abecedo ali _",
"followingCharactersAreNotAllowed": "Naslednji znaki niso dovoljeni", "followingCharactersAreNotAllowed": "Naslednji znaki niso dovoljeni",
"columnNameRequired": "Ime stolpca je obvezno", "columnNameRequired": "Ime stolpca je obvezno",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Ime projekta presega 50 znakov", "projectNameExceeds50Characters": "Ime projekta presega 50 znakov",
"projectNameCannotStartWithSpace": "Ime projekta se ne sme začeti s presledkom", "projectNameCannotStartWithSpace": "Ime projekta se ne sme začeti s presledkom",
"requiredField": "Obvezno polje", "requiredField": "Obvezno polje",

21
packages/nc-gui/lang/sv.json

@ -74,7 +74,8 @@
"insertBefore": "Infoga före", "insertBefore": "Infoga före",
"hideField": "Dölj fältet", "hideField": "Dölj fältet",
"sortAsc": "Sortera i stigande riktning", "sortAsc": "Sortera i stigande riktning",
"sortDesc": "Sortera fallande" "sortDesc": "Sortera fallande",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Projekt", "project": "Projekt",
@ -98,7 +99,8 @@
"gallery": "Galleri", "gallery": "Galleri",
"form": "Formulär", "form": "Formulär",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Kalender" "calendar": "Kalender",
"map": "Map"
}, },
"user": "Användare", "user": "Användare",
"users": "Användare", "users": "Användare",
@ -136,6 +138,7 @@
"Currency": "Valuta", "Currency": "Valuta",
"Percent": "Procent", "Percent": "Procent",
"Duration": "Varaktighet", "Duration": "Varaktighet",
"GeoData": "GeoData",
"Rating": "Betyg", "Rating": "Betyg",
"Formula": "Formel", "Formula": "Formel",
"Rollup": "Rulla upp", "Rollup": "Rulla upp",
@ -253,6 +256,9 @@
"barcodeFormat": "Streckkodsformat", "barcodeFormat": "Streckkodsformat",
"qrCodeValueTooLong": "För många tecken för en QR-kod", "qrCodeValueTooLong": "För många tecken för en QR-kod",
"barcodeValueTooLong": "För många tecken för en streckkod", "barcodeValueTooLong": "För många tecken för en streckkod",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Aggregatfunktion", "aggregateFunction": "Aggregatfunktion",
"dbCreateIfNotExists": "Databas: Skapa om det inte finns", "dbCreateIfNotExists": "Databas: Skapa om det inte finns",
"clientKey": "Klientnyckel", "clientKey": "Klientnyckel",
@ -452,6 +458,10 @@
"stackedBy": "Staplade av", "stackedBy": "Staplade av",
"chooseGroupingField": "Välj ett grupperingsfält", "chooseGroupingField": "Välj ett grupperingsfält",
"addOrEditStack": "Lägg till/redigera stacken" "addOrEditStack": "Lägg till/redigera stacken"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Skaparen kan skapa nya projekt och få tillgång till alla inbjudna projekt.", "orgCreator": "Skaparen kan skapa nya projekt och få tillgång till alla inbjudna projekt.",
"orgViewer": "Visaren får inte skapa nya projekt, men kan få tillgång till alla inbjudna projekt." "orgViewer": "Visaren får inte skapa nya projekt, men kan få tillgång till alla inbjudna projekt."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Rader per sida", "footerInfo": "Rader per sida",
"upload": "Välj fil för att ladda upp", "upload": "Välj fil för att ladda upp",
"upload_sub": "eller dra och släpp filen", "upload_sub": "eller dra och släpp filen",
@ -600,6 +615,7 @@
"gallery": "Lägg till Gallery View", "gallery": "Lägg till Gallery View",
"form": "Lägg till formulärvy", "form": "Lägg till formulärvy",
"kanban": "Lägg till Kanban View", "kanban": "Lägg till Kanban View",
"map": "Add Map View",
"calendar": "Lägg till kalendervisning" "calendar": "Lägg till kalendervisning"
}, },
"tablesMetadataInSync": "Tabeller Metadata är synkroniserad", "tablesMetadataInSync": "Tabeller Metadata är synkroniserad",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Namnet ska börja med ett alfabet eller _", "nameShouldStartWithAnAlphabetOr_": "Namnet ska börja med ett alfabet eller _",
"followingCharactersAreNotAllowed": "Följande tecken är inte tillåtna", "followingCharactersAreNotAllowed": "Följande tecken är inte tillåtna",
"columnNameRequired": "Kolumnnamn krävs", "columnNameRequired": "Kolumnnamn krävs",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Projektnamnet har mer än 50 tecken", "projectNameExceeds50Characters": "Projektnamnet har mer än 50 tecken",
"projectNameCannotStartWithSpace": "Projektnamnet kan inte börja med ett mellanslag", "projectNameCannotStartWithSpace": "Projektnamnet kan inte börja med ett mellanslag",
"requiredField": "Obligatoriskt fält", "requiredField": "Obligatoriskt fält",

21
packages/nc-gui/lang/th.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "โครงการ", "project": "โครงการ",
@ -98,7 +99,8 @@
"gallery": "แกลลอร", "gallery": "แกลลอร",
"form": "รปราง", "form": "รปราง",
"kanban": "ภาษาคณาตา", "kanban": "ภาษาคณาตา",
"calendar": "ปฏน" "calendar": "ปฏน",
"map": "Map"
}, },
"user": "ผใช", "user": "ผใช",
"users": "ผใช", "users": "ผใช",
@ -136,6 +138,7 @@
"Currency": "สกลเงน", "Currency": "สกลเงน",
"Percent": "รอยละ", "Percent": "รอยละ",
"Duration": "ระยะเวลา", "Duration": "ระยะเวลา",
"GeoData": "GeoData",
"Rating": "การจดอนดบ", "Rating": "การจดอนดบ",
"Formula": "สตร", "Formula": "สตร",
"Rollup": "มวน", "Rollup": "มวน",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "ฟงกนรวม", "aggregateFunction": "ฟงกนรวม",
"dbCreateIfNotExists": "ฐานขอมล: สรางถาไมอย", "dbCreateIfNotExists": "ฐานขอมล: สรางถาไมอย",
"clientKey": "รหสลกคา", "clientKey": "รหสลกคา",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "แถวตอหนา", "footerInfo": "แถวตอหนา",
"upload": "เลอกไฟลจะอปโหลด", "upload": "เลอกไฟลจะอปโหลด",
"upload_sub": "หรอลากและวางไฟล", "upload_sub": "หรอลากและวางไฟล",
@ -600,6 +615,7 @@
"gallery": "เพมมมมองแกลลอร", "gallery": "เพมมมมองแกลลอร",
"form": "เพมมมมองแบบฟอรม", "form": "เพมมมมองแบบฟอรม",
"kanban": "เพมมมมอง Kanban", "kanban": "เพมมมมอง Kanban",
"map": "Add Map View",
"calendar": "เพมมมมองปฏน" "calendar": "เพมมมมองปฏน"
}, },
"tablesMetadataInSync": "ตารางเมตาดาตากำลงซงค", "tablesMetadataInSync": "ตารางเมตาดาตากำลงซงค",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

21
packages/nc-gui/lang/tr.json

@ -74,7 +74,8 @@
"insertBefore": "Önce Ekle", "insertBefore": "Önce Ekle",
"hideField": "Alanı Gizle", "hideField": "Alanı Gizle",
"sortAsc": "Artan Sırala", "sortAsc": "Artan Sırala",
"sortDesc": "Azalan Sıralama" "sortDesc": "Azalan Sıralama",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Proje", "project": "Proje",
@ -98,7 +99,8 @@
"gallery": "Galeri", "gallery": "Galeri",
"form": "Form", "form": "Form",
"kanban": "Kanban", "kanban": "Kanban",
"calendar": "Takvim" "calendar": "Takvim",
"map": "Map"
}, },
"user": "Kullanıcı", "user": "Kullanıcı",
"users": "Kullanıcılar", "users": "Kullanıcılar",
@ -136,6 +138,7 @@
"Currency": "Para birimi", "Currency": "Para birimi",
"Percent": "Yüzde", "Percent": "Yüzde",
"Duration": "Süre", "Duration": "Süre",
"GeoData": "GeoData",
"Rating": "Değerlendirme", "Rating": "Değerlendirme",
"Formula": "Formül", "Formula": "Formül",
"Rollup": "Referans hesapla", "Rollup": "Referans hesapla",
@ -253,6 +256,9 @@
"barcodeFormat": "Barkod formatı", "barcodeFormat": "Barkod formatı",
"qrCodeValueTooLong": "QR kodu için çok fazla karakter", "qrCodeValueTooLong": "QR kodu için çok fazla karakter",
"barcodeValueTooLong": "Barkod için çok fazla karakter", "barcodeValueTooLong": "Barkod için çok fazla karakter",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Birleştirme fonksiyonu", "aggregateFunction": "Birleştirme fonksiyonu",
"dbCreateIfNotExists": "Veritabanı : yoksa oluştur", "dbCreateIfNotExists": "Veritabanı : yoksa oluştur",
"clientKey": "İstemci Anahtarı", "clientKey": "İstemci Anahtarı",
@ -452,6 +458,10 @@
"stackedBy": "Tarafından Yığılmış", "stackedBy": "Tarafından Yığılmış",
"chooseGroupingField": "Bir Gruplama Alanı Seçin", "chooseGroupingField": "Bir Gruplama Alanı Seçin",
"addOrEditStack": "Yığın Ekle / Düzenle" "addOrEditStack": "Yığın Ekle / Düzenle"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "İçerik oluşturucu yeni projeler oluşturabilir ve davet edilen herhangi bir projeye erişebilir.", "orgCreator": "İçerik oluşturucu yeni projeler oluşturabilir ve davet edilen herhangi bir projeye erişebilir.",
"orgViewer": "İzleyicinin yeni proje oluşturmasına izin verilmez ancak davet edilen herhangi bir projeye erişebilir." "orgViewer": "İzleyicinin yeni proje oluşturmasına izin verilmez ancak davet edilen herhangi bir projeye erişebilir."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Sayfa başına satır", "footerInfo": "Sayfa başına satır",
"upload": "Yüklenecek Dosyayı Seçin", "upload": "Yüklenecek Dosyayı Seçin",
"upload_sub": "veya dosyayı sürükleyip bırakın", "upload_sub": "veya dosyayı sürükleyip bırakın",
@ -600,6 +615,7 @@
"gallery": "Galeri görünümü ekle", "gallery": "Galeri görünümü ekle",
"form": "Form görünümü ekle", "form": "Form görünümü ekle",
"kanban": "Kanban görünümü ekle", "kanban": "Kanban görünümü ekle",
"map": "Add Map View",
"calendar": "Takvim görünümü ekle" "calendar": "Takvim görünümü ekle"
}, },
"tablesMetadataInSync": "Tablonun meta verileri senkronize", "tablesMetadataInSync": "Tablonun meta verileri senkronize",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "İsim bir alfabe veya _ ile başlamalıdır", "nameShouldStartWithAnAlphabetOr_": "İsim bir alfabe veya _ ile başlamalıdır",
"followingCharactersAreNotAllowed": "Aşağıdaki karakterlere izin verilmez", "followingCharactersAreNotAllowed": "Aşağıdaki karakterlere izin verilmez",
"columnNameRequired": "Sütun adı gereklidir", "columnNameRequired": "Sütun adı gereklidir",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Proje adı 50 karakteri aşıyor", "projectNameExceeds50Characters": "Proje adı 50 karakteri aşıyor",
"projectNameCannotStartWithSpace": "Proje adı boşlukla başlayamaz", "projectNameCannotStartWithSpace": "Proje adı boşlukla başlayamaz",
"requiredField": "Zorunlu alan", "requiredField": "Zorunlu alan",

21
packages/nc-gui/lang/uk.json

@ -74,7 +74,8 @@
"insertBefore": "Вставити перед", "insertBefore": "Вставити перед",
"hideField": "Приховати поле", "hideField": "Приховати поле",
"sortAsc": "За зростанням", "sortAsc": "За зростанням",
"sortDesc": "За спаданням" "sortDesc": "За спаданням",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Проєкт", "project": "Проєкт",
@ -98,7 +99,8 @@
"gallery": "Галерея", "gallery": "Галерея",
"form": "Форма", "form": "Форма",
"kanban": "Канбан", "kanban": "Канбан",
"calendar": "Календар" "calendar": "Календар",
"map": "Map"
}, },
"user": "Користувач", "user": "Користувач",
"users": "Користувачі", "users": "Користувачі",
@ -136,6 +138,7 @@
"Currency": "Валюта", "Currency": "Валюта",
"Percent": "Відсоток", "Percent": "Відсоток",
"Duration": "Тривалість", "Duration": "Тривалість",
"GeoData": "GeoData",
"Rating": "Рейтинг", "Rating": "Рейтинг",
"Formula": "Формула", "Formula": "Формула",
"Rollup": "Накопичення", "Rollup": "Накопичення",
@ -253,6 +256,9 @@
"barcodeFormat": "Формат штрих-коду", "barcodeFormat": "Формат штрих-коду",
"qrCodeValueTooLong": "Забагато символів для QR-коду", "qrCodeValueTooLong": "Забагато символів для QR-коду",
"barcodeValueTooLong": "Забагато символів для штрих-коду", "barcodeValueTooLong": "Забагато символів для штрих-коду",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Агрегатна функція", "aggregateFunction": "Агрегатна функція",
"dbCreateIfNotExists": "База даних: створити, якщо не існує", "dbCreateIfNotExists": "База даних: створити, якщо не існує",
"clientKey": "Ключ клієнта", "clientKey": "Ключ клієнта",
@ -452,6 +458,10 @@
"stackedBy": "Групувати по", "stackedBy": "Групувати по",
"chooseGroupingField": "Виберіть поле групування", "chooseGroupingField": "Виберіть поле групування",
"addOrEditStack": "Додавання/Редагування Стеку" "addOrEditStack": "Додавання/Редагування Стеку"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Розробник може створювати нові проєкти та мати доступ до будь-якого відкритого проєкту.", "orgCreator": "Розробник може створювати нові проєкти та мати доступ до будь-якого відкритого проєкту.",
"orgViewer": "Глядач не може створювати нові проєкти, але він може отримати доступ до будь-якого відкритого проєкту." "orgViewer": "Глядач не може створювати нові проєкти, але він може отримати доступ до будь-якого відкритого проєкту."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Рядків на сторінці", "footerInfo": "Рядків на сторінці",
"upload": "Виберіть файл для завантаження", "upload": "Виберіть файл для завантаження",
"upload_sub": "або перетягніть файл", "upload_sub": "або перетягніть файл",
@ -600,6 +615,7 @@
"gallery": "Додати вигляд галереї", "gallery": "Додати вигляд галереї",
"form": "Додати вигляд форми", "form": "Додати вигляд форми",
"kanban": "Додати вигляд Kanban", "kanban": "Додати вигляд Kanban",
"map": "Add Map View",
"calendar": "Додати вигляд календаря" "calendar": "Додати вигляд календаря"
}, },
"tablesMetadataInSync": "Таблиці метаданих синхронізуються", "tablesMetadataInSync": "Таблиці метаданих синхронізуються",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Ім'я повинно починатися з літери або _", "nameShouldStartWithAnAlphabetOr_": "Ім'я повинно починатися з літери або _",
"followingCharactersAreNotAllowed": "Наступні символи не допускаються", "followingCharactersAreNotAllowed": "Наступні символи не допускаються",
"columnNameRequired": "Ім'я стовпця є обов'язковим", "columnNameRequired": "Ім'я стовпця є обов'язковим",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Назва проєкту перевищує 50 символів", "projectNameExceeds50Characters": "Назва проєкту перевищує 50 символів",
"projectNameCannotStartWithSpace": "Назва проєкту не може починатися з пробілу", "projectNameCannotStartWithSpace": "Назва проєкту не може починатися з пробілу",
"requiredField": "Обов'язкове поле", "requiredField": "Обов'язкове поле",

21
packages/nc-gui/lang/vi.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "Dự định", "project": "Dự định",
@ -98,7 +99,8 @@
"gallery": "Bộ sưu tập", "gallery": "Bộ sưu tập",
"form": "Mẫu đơn", "form": "Mẫu đơn",
"kanban": "Kanban.", "kanban": "Kanban.",
"calendar": "Lịch" "calendar": "Lịch",
"map": "Map"
}, },
"user": "Người dùng", "user": "Người dùng",
"users": "Người dùng", "users": "Người dùng",
@ -136,6 +138,7 @@
"Currency": "Tiền tệ", "Currency": "Tiền tệ",
"Percent": "Phần trăm", "Percent": "Phần trăm",
"Duration": "Khoảng thời gian", "Duration": "Khoảng thời gian",
"GeoData": "GeoData",
"Rating": "Xếp hạng", "Rating": "Xếp hạng",
"Formula": "Công thức", "Formula": "Công thức",
"Rollup": "ROLLUP.", "Rollup": "ROLLUP.",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Chức năng tổng hợp", "aggregateFunction": "Chức năng tổng hợp",
"dbCreateIfNotExists": "Cơ sở dữ liệu: Tạo nếu không tồn tại", "dbCreateIfNotExists": "Cơ sở dữ liệu: Tạo nếu không tồn tại",
"clientKey": "Khóa khách", "clientKey": "Khóa khách",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "Creator can create new projects and access any invited project.", "orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "Hàng trên mỗi trang", "footerInfo": "Hàng trên mỗi trang",
"upload": "Chọn tệp để tải lên", "upload": "Chọn tệp để tải lên",
"upload_sub": "hoặc kéo và thả tập tin", "upload_sub": "hoặc kéo và thả tập tin",
@ -600,6 +615,7 @@
"gallery": "Thêm Gallery View.", "gallery": "Thêm Gallery View.",
"form": "Thêm hình thức xem", "form": "Thêm hình thức xem",
"kanban": "Thêm tầm nhìn Kanban", "kanban": "Thêm tầm nhìn Kanban",
"map": "Add Map View",
"calendar": "Thêm chế độ xem lịch" "calendar": "Thêm chế độ xem lịch"
}, },
"tablesMetadataInSync": "Bảng siêu dữ liệu được đồng bộ hóa", "tablesMetadataInSync": "Bảng siêu dữ liệu được đồng bộ hóa",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "Column name is required", "columnNameRequired": "Column name is required",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "Project name exceeds 50 characters", "projectNameExceeds50Characters": "Project name exceeds 50 characters",
"projectNameCannotStartWithSpace": "Project name cannot start with space", "projectNameCannotStartWithSpace": "Project name cannot start with space",
"requiredField": "Required field", "requiredField": "Required field",

53
packages/nc-gui/lang/zh-Hans.json

@ -67,14 +67,15 @@
"questions": "问题", "questions": "问题",
"reachOut": "联系我们", "reachOut": "联系我们",
"betaNote": "此功能仍在测试中。", "betaNote": "此功能仍在测试中。",
"moreInfo": "点击此处了解更多信息。", "moreInfo": "这里可以找到更多信息",
"logs": "日志", "logs": "日志",
"groupingField": "分组字段", "groupingField": "分组字段",
"insertAfter": "在右侧插入列", "insertAfter": "在右侧插入列",
"insertBefore": "在左侧插入列", "insertBefore": "在左侧插入列",
"hideField": "隐藏字段", "hideField": "隐藏字段",
"sortAsc": "升序", "sortAsc": "升序",
"sortDesc": "降序" "sortDesc": "降序",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "项目", "project": "项目",
@ -98,7 +99,8 @@
"gallery": "画廊", "gallery": "画廊",
"form": "表单", "form": "表单",
"kanban": "看板", "kanban": "看板",
"calendar": "日历" "calendar": "日历",
"map": "Map"
}, },
"user": "用户", "user": "用户",
"users": "用户", "users": "用户",
@ -136,6 +138,7 @@
"Currency": "货币", "Currency": "货币",
"Percent": "百分比", "Percent": "百分比",
"Duration": "时长", "Duration": "时长",
"GeoData": "GeoData",
"Rating": "评分", "Rating": "评分",
"Formula": "公式", "Formula": "公式",
"Rollup": "聚合", "Rollup": "聚合",
@ -253,6 +256,9 @@
"barcodeFormat": "条形码码制", "barcodeFormat": "条形码码制",
"qrCodeValueTooLong": "字数超出二维码容量", "qrCodeValueTooLong": "字数超出二维码容量",
"barcodeValueTooLong": "字数超出条形码容量", "barcodeValueTooLong": "字数超出条形码容量",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "汇总功能", "aggregateFunction": "汇总功能",
"dbCreateIfNotExists": "自动创建数据库", "dbCreateIfNotExists": "自动创建数据库",
"clientKey": "客户端密钥", "clientKey": "客户端密钥",
@ -298,7 +304,7 @@
"noData": "暂无数据", "noData": "暂无数据",
"goToDashboard": "转到仪表板", "goToDashboard": "转到仪表板",
"importing": "导入中", "importing": "导入中",
"flattenNested": "Flatten Nested", "flattenNested": "扁平化嵌套",
"downloadAllowed": "允许下载", "downloadAllowed": "允许下载",
"weAreHiring": "我们在招募!", "weAreHiring": "我们在招募!",
"primaryKey": "主键", "primaryKey": "主键",
@ -380,14 +386,14 @@
"renameTable": "重命名表格", "renameTable": "重命名表格",
"deleteTable": "删除表格", "deleteTable": "删除表格",
"addField": "添加新字段", "addField": "添加新字段",
"setDisplay": "Set as Display value", "setDisplay": "设置为显示值",
"addRow": "添加新行", "addRow": "添加新行",
"saveRow": "保存行", "saveRow": "保存行",
"saveAndExit": "保存并退出", "saveAndExit": "保存并退出",
"saveAndStay": "保存并留在此页", "saveAndStay": "保存并留在此页",
"insertRow": "插入新行", "insertRow": "插入新行",
"deleteRow": "删除行", "deleteRow": "删除行",
"duplicateRow": "Duplicate Row", "duplicateRow": "复制该行",
"deleteSelectedRow": "删除所选行", "deleteSelectedRow": "删除所选行",
"importExcel": "导入 Excel", "importExcel": "导入 Excel",
"importCSV": "导入 CSV", "importCSV": "导入 CSV",
@ -452,6 +458,10 @@
"stackedBy": "分类依据为", "stackedBy": "分类依据为",
"chooseGroupingField": "选择分组字段", "chooseGroupingField": "选择分组字段",
"addOrEditStack": "添加/编辑分类标签" "addOrEditStack": "添加/编辑分类标签"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -508,16 +518,21 @@
"renderError": "条形码错误 - 请注意输入数据和条形码类型之间的兼容性" "renderError": "条形码错误 - 请注意输入数据和条形码类型之间的兼容性"
}, },
"nonEditableFields": { "nonEditableFields": {
"computedFieldUnableToClear": "Warning: Computed field - unable to clear text", "computedFieldUnableToClear": "警告:自动计算的字段无法被清除内容。",
"qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed." "qrFieldsCannotBeDirectlyChanged": "警告:二维码字段无法更改。"
} }
}, },
"info": { "info": {
"pasteNotSupported": "Paste operation is not supported on the active cell", "pasteNotSupported": "处于活动状态的单元格不能粘贴内容",
"roles": { "roles": {
"orgCreator": "创始人可以创建新项目,访问受邀项目。", "orgCreator": "创始人可以创建新项目,访问受邀项目。",
"orgViewer": "游客不能创建新项目,仅允许访问受邀项目。" "orgViewer": "游客不能创建新项目,仅允许访问受邀项目。"
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "每页行驶", "footerInfo": "每页行驶",
"upload": "选择文件以上传", "upload": "选择文件以上传",
"upload_sub": "或拖放文件", "upload_sub": "或拖放文件",
@ -600,6 +615,7 @@
"gallery": "添加画廊视图", "gallery": "添加画廊视图",
"form": "添加表单视图", "form": "添加表单视图",
"kanban": "添加看板视图", "kanban": "添加看板视图",
"map": "Add Map View",
"calendar": "添加日历视图" "calendar": "添加日历视图"
}, },
"tablesMetadataInSync": "表元数据同步", "tablesMetadataInSync": "表元数据同步",
@ -627,18 +643,18 @@
"valueAlreadyInList": "此值已经在列表中", "valueAlreadyInList": "此值已经在列表中",
"noColumnsToUpdate": "没有要更新的列", "noColumnsToUpdate": "没有要更新的列",
"tableDeleted": "已成功删除表", "tableDeleted": "已成功删除表",
"generatePublicShareableReadonlyBase": "Generate publicly shareable readonly base", "generatePublicShareableReadonlyBase": "生成公开可共享的只读库",
"deleteViewConfirmation": "您确定要删除此视图?", "deleteViewConfirmation": "您确定要删除此视图?",
"deleteTableConfirmation": "您想要删除该表吗?", "deleteTableConfirmation": "您想要删除该表吗?",
"showM2mTables": "显示中间表", "showM2mTables": "显示中间表",
"showM2mTablesDesc": "Many-to-many relation is supported via a junction table & is hidden by default. Enable this option to list all such tables along with existing tables.", "showM2mTablesDesc": "NocoDB 用来支持多对多关系的中间表默认不可见。打开此选项将显示所有中间表。",
"showNullInCells": "Show NULL in Cells", "showNullInCells": "单元格为空时显示 NULL",
"showNullInCellsDesc": "Display 'NULL' tag in cells holding NULL value. This helps differentiate against cells holding EMPTY string.", "showNullInCellsDesc": "未设置值的单元格将显示 NULL。这是为了和值为空字符串(显示 EMPTY)的单元格作出区分。",
"showNullAndEmptyInFilter": "Show NULL and EMPTY in Filter", "showNullAndEmptyInFilter": "在过滤器中显示 NULL 和 EMPTY 选项",
"showNullAndEmptyInFilterDesc": "Enable 'additional' filters to differentiate fields containing NULL & Empty Strings. Default support for Blank treats both NULL & Empty strings alike.", "showNullAndEmptyInFilterDesc": "启用”附加”过滤器来区分未设置值(NULL)和值为空字符串(EMPTY)的字段。默认对 NULL 的处理和对空字符串的处理一样。",
"deleteKanbanStackConfirmation": "删除这个类别标签也将从 \"{groupingField}\"中删除选择选项 \"{stackToBeDeleted}\"。这类记录将移到未分类的类别中。", "deleteKanbanStackConfirmation": "删除这个类别标签也将从 \"{groupingField}\"中删除选择选项 \"{stackToBeDeleted}\"。这类记录将移到未分类的类别中。",
"computedFieldEditWarning": "Computed field: contents are read-only. Use column edit menu to reconfigure", "computedFieldEditWarning": "计算字段:此内容是只读的。使用列编辑菜单来重新配置该字段",
"computedFieldDeleteWarning": "Computed field: contents are read-only. Unable to clear content.", "computedFieldDeleteWarning": "计算字段:此内容是只读的。无法清除内容。",
"noMoreRecords": "暂无数据" "noMoreRecords": "暂无数据"
}, },
"error": { "error": {
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "名称应该以字母或 _ 开头", "nameShouldStartWithAnAlphabetOr_": "名称应该以字母或 _ 开头",
"followingCharactersAreNotAllowed": "不允许使用以下字符", "followingCharactersAreNotAllowed": "不允许使用以下字符",
"columnNameRequired": "列名是必填项", "columnNameRequired": "列名是必填项",
"columnNameExceedsCharacters": "列名的长度超过了 {value} 字符的限制",
"projectNameExceeds50Characters": "项目名称超过 50 个字符", "projectNameExceeds50Characters": "项目名称超过 50 个字符",
"projectNameCannotStartWithSpace": "项目名称不能以空格开头", "projectNameCannotStartWithSpace": "项目名称不能以空格开头",
"requiredField": "必填字段", "requiredField": "必填字段",
@ -722,7 +739,7 @@
}, },
"success": { "success": {
"columnDuplicated": "此列的副本创建成功", "columnDuplicated": "此列的副本创建成功",
"rowDuplicatedWithoutSavedYet": "Row duplicated (not saved)", "rowDuplicatedWithoutSavedYet": "该行已复制(未保存)",
"updatedUIACL": "已成功更新表的 UI ACL", "updatedUIACL": "已成功更新表的 UI ACL",
"pluginUninstalled": "插件卸载成功", "pluginUninstalled": "插件卸载成功",
"pluginSettingsSaved": "插件设置保存成功", "pluginSettingsSaved": "插件设置保存成功",

21
packages/nc-gui/lang/zh-Hant.json

@ -74,7 +74,8 @@
"insertBefore": "Insert Before", "insertBefore": "Insert Before",
"hideField": "Hide Field", "hideField": "Hide Field",
"sortAsc": "Sort Ascending", "sortAsc": "Sort Ascending",
"sortDesc": "Sort Descending" "sortDesc": "Sort Descending",
"geoDataField": "GeoData Field"
}, },
"objects": { "objects": {
"project": "項目", "project": "項目",
@ -98,7 +99,8 @@
"gallery": "相簿", "gallery": "相簿",
"form": "表單", "form": "表單",
"kanban": "看板", "kanban": "看板",
"calendar": "日曆" "calendar": "日曆",
"map": "Map"
}, },
"user": "使用者", "user": "使用者",
"users": "使用者", "users": "使用者",
@ -136,6 +138,7 @@
"Currency": "貨幣", "Currency": "貨幣",
"Percent": "百分", "Percent": "百分",
"Duration": "期間", "Duration": "期間",
"GeoData": "GeoData",
"Rating": "評分", "Rating": "評分",
"Formula": "公式", "Formula": "公式",
"Rollup": "捲起", "Rollup": "捲起",
@ -253,6 +256,9 @@
"barcodeFormat": "Barcode format", "barcodeFormat": "Barcode format",
"qrCodeValueTooLong": "Too many characters for a QR code", "qrCodeValueTooLong": "Too many characters for a QR code",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Too many characters for a barcode",
"yourLocation": "Your Location",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "匯總功能", "aggregateFunction": "匯總功能",
"dbCreateIfNotExists": "資料庫:不存在則建立", "dbCreateIfNotExists": "資料庫:不存在則建立",
"clientKey": "用戶端金鑰", "clientKey": "用戶端金鑰",
@ -452,6 +458,10 @@
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choose a Grouping Field",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
},
"map": {
"mappedBy": "Mapped By",
"chooseMappingField": "Choose a Mapping Field"
} }
}, },
"tooltip": { "tooltip": {
@ -518,6 +528,11 @@
"orgCreator": "建立者可以建立專案與存取任何受邀請的專案", "orgCreator": "建立者可以建立專案與存取任何受邀請的專案",
"orgViewer": "檢視者不能建立專案但可以存取任何受邀請的專案" "orgViewer": "檢視者不能建立專案但可以存取任何受邀請的專案"
}, },
"map": {
"overLimit": "You're over the limit.",
"closeLimit": "You're getting close to the limit.",
"limitNumber": "The limit of markers shown in a Map View is 1000 records."
},
"footerInfo": "每頁行駛", "footerInfo": "每頁行駛",
"upload": "選擇檔案以上傳", "upload": "選擇檔案以上傳",
"upload_sub": "或拖放檔案", "upload_sub": "或拖放檔案",
@ -600,6 +615,7 @@
"gallery": "加入相簿檢視", "gallery": "加入相簿檢視",
"form": "加入表單檢視", "form": "加入表單檢視",
"kanban": "加入看板檢視", "kanban": "加入看板檢視",
"map": "Add Map View",
"calendar": "加入日曆檢視" "calendar": "加入日曆檢視"
}, },
"tablesMetadataInSync": "表元數據同步", "tablesMetadataInSync": "表元數據同步",
@ -690,6 +706,7 @@
"nameShouldStartWithAnAlphabetOr_": "名稱必須用 英文字母 或 _ 當開頭", "nameShouldStartWithAnAlphabetOr_": "名稱必須用 英文字母 或 _ 當開頭",
"followingCharactersAreNotAllowed": "Following characters are not allowed", "followingCharactersAreNotAllowed": "Following characters are not allowed",
"columnNameRequired": "欄位名稱必填", "columnNameRequired": "欄位名稱必填",
"columnNameExceedsCharacters": "The length of column name exceeds the max {value} characters",
"projectNameExceeds50Characters": "專案名稱超過 50 個字元", "projectNameExceeds50Characters": "專案名稱超過 50 個字元",
"projectNameCannotStartWithSpace": "專案名稱不能有空白開頭", "projectNameCannotStartWithSpace": "專案名稱不能有空白開頭",
"requiredField": "必填欄位", "requiredField": "必填欄位",

11
packages/nc-gui/utils/errorUtils.ts

@ -1,14 +1,23 @@
export async function extractSdkResponseErrorMsg(e: Error & { response: any }) { export async function extractSdkResponseErrorMsg(e: Error & { response: any }) {
if (!e || !e.response) return e.message if (!e || !e.response) return e.message
let msg let msg
let errors: any[] | null = null
if (e.response.data instanceof Blob) { if (e.response.data instanceof Blob) {
try { try {
msg = JSON.parse(await e.response.data.text()).msg const parsedData = JSON.parse(await e.response.data.text())
msg = parsedData.msg
errors = parsedData.errors
} catch { } catch {
msg = 'Some internal error occurred' msg = 'Some internal error occurred'
} }
} else { } else {
msg = e.response.data.msg || e.response.data.message || 'Some internal error occurred' msg = e.response.data.msg || e.response.data.message || 'Some internal error occurred'
errors = e.response.data.errors
} }
if (Array.isArray(errors) && errors.length) {
return errors.map((e: any) => (e.instancePath ? `${e.instancePath} - ` : '') + e.message).join(', ')
}
return msg || 'Some error occurred' return msg || 'Some error occurred'
} }

3
packages/noco-docs/content/en/setup-and-usages/column-types.md

@ -10,9 +10,7 @@ menuTitle: 'Column Types'
| Type | Description | | Type | Description |
|---|---| |---|---|
<!-- | [ID](#id) | Primary column of the table | -->
| [LinkToAnotherRecord](#linktoanotherrecord) | Has Many or Many To Many columns | | [LinkToAnotherRecord](#linktoanotherrecord) | Has Many or Many To Many columns |
<!-- | [ForeignKey](#foreignkey)| Belongs To relation | -->
| [SingleLineText](#singlelinetext) | For short text | | [SingleLineText](#singlelinetext) | For short text |
| [LongText](#longtext) | For lengthy string content | | [LongText](#longtext) | For lengthy string content |
| [Attachment](#attachment) | File attachment column | | [Attachment](#attachment) | File attachment column |
@ -36,7 +34,6 @@ menuTitle: 'Column Types'
| [DateTime](#datetime)| Date & Time selector | | [DateTime](#datetime)| Date & Time selector |
| [QR Code](#qr-code)| QR Code visualization of another referenced column | | [QR Code](#qr-code)| QR Code visualization of another referenced column |
| [Barcode](#barcode)| Barcode visualization of another referenced column | | [Barcode](#barcode)| Barcode visualization of another referenced column |
<!-- | [CreateTime](#createtime)| | -->
| [Geometry](#geometry)| Geometry column | | [Geometry](#geometry)| Geometry column |
| [GeoData](#geodata)| GeoData column | | [GeoData](#geodata)| GeoData column |
| [Json](#json)| Json column | | [Json](#json)| Json column |

2
packages/nocodb-sdk/package.json

@ -31,7 +31,7 @@
"test:prettier": "prettier \"src/**/*.ts\" --list-different", "test:prettier": "prettier \"src/**/*.ts\" --list-different",
"test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"", "test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"",
"watch:build": "tsc -p tsconfig.json -w", "watch:build": "tsc -p tsconfig.json -w",
"generate:sdk": "npx --yes swagger-typescript-api@10.0.3 -r -p ../../scripts/sdk/swagger.json -o ./src/lib/ --axios --unwrap-response-data --module-name-first-tag --type-suffix=Type --templates ../../scripts/sdk/templates" "generate:sdk": "npx --yes swagger-typescript-api@10.0.3 -r -p ../nocodb/src/schema/swagger.json -o ./src/lib/ --axios --unwrap-response-data --module-name-first-tag --type-suffix=Type --templates ../../scripts/sdk/templates"
}, },
"dependencies": { "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",

576
packages/nocodb-sdk/src/lib/Api.ts

File diff suppressed because it is too large Load Diff

325
packages/nocodb/package-lock.json generated

@ -13,6 +13,7 @@
"@graphql-tools/merge": "^6.0.12", "@graphql-tools/merge": "^6.0.12",
"@sentry/node": "^6.3.5", "@sentry/node": "^6.3.5",
"airtable": "^0.11.3", "airtable": "^0.11.3",
"ajv": "^8.12.0",
"archiver": "^5.0.2", "archiver": "^5.0.2",
"auto-bind": "^4.0.0", "auto-bind": "^4.0.0",
"aws-sdk": "^2.829.0", "aws-sdk": "^2.829.0",
@ -658,6 +659,22 @@
"node": "^10.12.0 || >=12.0.0" "node": "^10.12.0 || >=12.0.0"
} }
}, },
"node_modules/@eslint/eslintrc/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/@eslint/eslintrc/node_modules/globals": { "node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "13.15.0", "version": "13.15.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
@ -682,6 +699,12 @@
"node": ">= 4" "node": ">= 4"
} }
}, },
"node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/@eslint/eslintrc/node_modules/type-fest": { "node_modules/@eslint/eslintrc/node_modules/type-fest": {
"version": "0.20.2", "version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@ -2215,13 +2238,13 @@
"integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q=="
}, },
"node_modules/ajv": { "node_modules/ajv": {
"version": "6.12.6", "version": "8.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^1.0.0",
"json-schema-traverse": "^0.4.1", "require-from-string": "^2.0.2",
"uri-js": "^4.2.2" "uri-js": "^4.2.2"
}, },
"funding": { "funding": {
@ -2238,15 +2261,6 @@
"ajv": ">=5.0.0" "ajv": ">=5.0.0"
} }
}, },
"node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/amdefine": { "node_modules/amdefine": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
@ -5957,6 +5971,22 @@
"@babel/highlight": "^7.10.4" "@babel/highlight": "^7.10.4"
} }
}, },
"node_modules/eslint/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/eslint/node_modules/ansi-regex": { "node_modules/eslint/node_modules/ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@ -6042,6 +6072,12 @@
"node": ">= 4" "node": ">= 4"
} }
}, },
"node_modules/eslint/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/eslint/node_modules/strip-ansi": { "node_modules/eslint/node_modules/strip-ansi": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@ -8002,6 +8038,26 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/har-validator/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/har-validator/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"node_modules/has": { "node_modules/has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -9465,9 +9521,9 @@
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
}, },
"node_modules/json-schema-traverse": { "node_modules/json-schema-traverse": {
"version": "0.4.1", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
}, },
"node_modules/json-stable-stringify-without-jsonify": { "node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1", "version": "1.0.1",
@ -13898,7 +13954,6 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -14179,6 +14234,37 @@
"url": "https://opencollective.com/webpack" "url": "https://opencollective.com/webpack"
} }
}, },
"node_modules/schema-utils/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/schema-utils/node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/schema-utils/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/scmp": { "node_modules/scmp": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz",
@ -15573,22 +15659,6 @@
"node": ">=10.0.0" "node": ">=10.0.0"
} }
}, },
"node_modules/table/node_modules/ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/table/node_modules/ansi-regex": { "node_modules/table/node_modules/ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@ -15598,12 +15668,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/table/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/table/node_modules/slice-ansi": { "node_modules/table/node_modules/slice-ansi": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@ -18168,6 +18232,31 @@
"node": ">=0.4.0" "node": ">=0.4.0"
} }
}, },
"node_modules/webpack/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/webpack/node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/webpack/node_modules/braces": { "node_modules/webpack/node_modules/braces": {
"version": "2.3.2", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
@ -18303,6 +18392,12 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/webpack/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/webpack/node_modules/json5": { "node_modules/webpack/node_modules/json5": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
@ -19500,6 +19595,18 @@
"strip-json-comments": "^3.1.1" "strip-json-comments": "^3.1.1"
}, },
"dependencies": { "dependencies": {
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"globals": { "globals": {
"version": "13.15.0", "version": "13.15.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
@ -19515,6 +19622,12 @@
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true "dev": true
}, },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"type-fest": { "type-fest": {
"version": "0.20.2", "version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@ -20789,13 +20902,13 @@
} }
}, },
"ajv": { "ajv": {
"version": "6.12.6", "version": "8.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"requires": { "requires": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^1.0.0",
"json-schema-traverse": "^0.4.1", "require-from-string": "^2.0.2",
"uri-js": "^4.2.2" "uri-js": "^4.2.2"
} }
}, },
@ -20806,13 +20919,6 @@
"dev": true, "dev": true,
"requires": {} "requires": {}
}, },
"ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"requires": {}
},
"amdefine": { "amdefine": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
@ -23538,6 +23644,18 @@
"@babel/highlight": "^7.10.4" "@babel/highlight": "^7.10.4"
} }
}, },
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ansi-regex": { "ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@ -23592,6 +23710,12 @@
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true "dev": true
}, },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"strip-ansi": { "strip-ansi": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@ -25352,6 +25476,24 @@
"requires": { "requires": {
"ajv": "^6.12.3", "ajv": "^6.12.3",
"har-schema": "^2.0.0" "har-schema": "^2.0.0"
},
"dependencies": {
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
}
} }
}, },
"has": { "has": {
@ -26420,9 +26562,9 @@
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
}, },
"json-schema-traverse": { "json-schema-traverse": {
"version": "0.4.1", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
}, },
"json-stable-stringify-without-jsonify": { "json-stable-stringify-without-jsonify": {
"version": "1.0.1", "version": "1.0.1",
@ -29930,8 +30072,7 @@
"require-from-string": { "require-from-string": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
"dev": true
}, },
"require-main-filename": { "require-main-filename": {
"version": "2.0.0", "version": "2.0.0",
@ -30138,6 +30279,33 @@
"@types/json-schema": "^7.0.8", "@types/json-schema": "^7.0.8",
"ajv": "^6.12.5", "ajv": "^6.12.5",
"ajv-keywords": "^3.5.2" "ajv-keywords": "^3.5.2"
},
"dependencies": {
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"requires": {}
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
}
} }
}, },
"scmp": { "scmp": {
@ -31273,30 +31441,12 @@
"strip-ansi": "^6.0.1" "strip-ansi": "^6.0.1"
}, },
"dependencies": { "dependencies": {
"ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"ansi-regex": { "ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true "dev": true
}, },
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"slice-ansi": { "slice-ansi": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@ -32978,6 +33128,25 @@
"integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
"dev": true "dev": true
}, },
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"requires": {}
},
"braces": { "braces": {
"version": "2.3.2", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
@ -33095,6 +33264,12 @@
} }
} }
}, },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"json5": { "json5": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",

1
packages/nocodb/package.json

@ -53,6 +53,7 @@
"@graphql-tools/merge": "^6.0.12", "@graphql-tools/merge": "^6.0.12",
"@sentry/node": "^6.3.5", "@sentry/node": "^6.3.5",
"airtable": "^0.11.3", "airtable": "^0.11.3",
"ajv": "^8.12.0",
"archiver": "^5.0.2", "archiver": "^5.0.2",
"auto-bind": "^4.0.0", "auto-bind": "^4.0.0",
"aws-sdk": "^2.829.0", "aws-sdk": "^2.829.0",

9
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/CustomKnex.ts

@ -1,5 +1,6 @@
import { Knex, knex } from 'knex'; import { Knex, knex } from 'knex';
import { SnowflakeClient } from 'nc-help'; import { SnowflakeClient } from 'nc-help';
import { FilterType } from 'nocodb-sdk';
const types = require('pg').types; const types = require('pg').types;
// override parsing date column to Date() // override parsing date column to Date()
@ -1248,7 +1249,13 @@ knex.QueryBuilder.extend('conditionv2', function (conditionObj: Filter) {
return parseConditionv2(conditionObj, this); return parseConditionv2(conditionObj, this);
} as any); } as any);
const parseConditionv2 = (obj: Filter, qb: Knex.QueryBuilder) => { const parseConditionv2 = (_obj: Filter | FilterType, qb: Knex.QueryBuilder) => {
let obj: Filter;
if (_obj instanceof Filter) {
obj = _obj;
} else {
obj = new Filter(_obj);
}
if (obj.is_group) { if (obj.is_group) {
qb = qb.where(function () { qb = qb.where(function () {
const children = obj.children; const children = obj.children;

8
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/helpers/getAst.ts

@ -81,13 +81,13 @@ const getAst = async ({
...(await obj), ...(await obj),
[col.title]: [col.title]:
allowedCols && (!includePkByDefault || !col.pk) allowedCols && (!includePkByDefault || !col.pk)
? (allowedCols[col.id] && ? allowedCols[col.id] &&
(!isSystemColumn(col) || view.show_system_fields) && (!isSystemColumn(col) || view.show_system_fields) &&
(!fields?.length || fields.includes(col.title)) && (!fields?.length || fields.includes(col.title)) &&
value) value
: (fields?.length : fields?.length
? fields.includes(col.title) && value ? fields.includes(col.title) && value
: value), : value,
}; };
}, Promise.resolve({})); }, Promise.resolve({}));
}; };

2
packages/nocodb/src/lib/meta/api/apiTokenApis.ts

@ -5,6 +5,7 @@ import { NcError } from '../helpers/catchError';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import ApiToken from '../../models/ApiToken'; import ApiToken from '../../models/ApiToken';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function apiTokenList(req: Request, res: Response) { export async function apiTokenList(req: Request, res: Response) {
res.json(await ApiToken.list(req['user'].id)); res.json(await ApiToken.list(req['user'].id));
@ -40,6 +41,7 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/api-tokens', '/api/v1/db/meta/projects/:projectId/api-tokens',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/ApiTokenReq'),
ncMetaAclMw(apiTokenCreate, 'apiTokenCreate') ncMetaAclMw(apiTokenCreate, 'apiTokenCreate')
); );
router.delete( router.delete(

3
packages/nocodb/src/lib/meta/api/auditApis.ts

@ -6,6 +6,7 @@ import { PagedResponseImpl } from '../helpers/PagedResponse';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import DOMPurify from 'isomorphic-dompurify'; import DOMPurify from 'isomorphic-dompurify';
import { getAjvValidatorMw } from './helpers';
export async function commentRow(req: Request<any, any>, res) { export async function commentRow(req: Request<any, any>, res) {
res.json( res.json(
@ -69,10 +70,12 @@ router.get(
); );
router.post( router.post(
'/api/v1/db/meta/audits/comments', '/api/v1/db/meta/audits/comments',
getAjvValidatorMw('swagger.json#/components/schemas/CommentReq'),
ncMetaAclMw(commentRow, 'commentRow') ncMetaAclMw(commentRow, 'commentRow')
); );
router.post( router.post(
'/api/v1/db/meta/audits/rows/:rowId/update', '/api/v1/db/meta/audits/rows/:rowId/update',
getAjvValidatorMw('swagger.json#/components/schemas/AuditRowUpdateReq'),
ncMetaAclMw(auditRowUpdate, 'auditRowUpdate') ncMetaAclMw(auditRowUpdate, 'auditRowUpdate')
); );
router.get( router.get(

4
packages/nocodb/src/lib/meta/api/baseApis.ts

@ -7,7 +7,7 @@ import Base from '../../models/Base';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { Tele } from 'nc-help'; import { Tele } from 'nc-help';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { populateMeta } from './helpers'; import { getAjvValidatorMw, populateMeta } from './helpers';
export async function baseGet( export async function baseGet(
req: Request<any, any, any>, req: Request<any, any, any>,
@ -107,6 +107,7 @@ export default (router) => {
router.patch( router.patch(
'/api/v1/db/meta/projects/:projectId/bases/:baseId', '/api/v1/db/meta/projects/:projectId/bases/:baseId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/BaseReq'),
ncMetaAclMw(baseUpdate, 'baseUpdate') ncMetaAclMw(baseUpdate, 'baseUpdate')
); );
router.delete( router.delete(
@ -117,6 +118,7 @@ export default (router) => {
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/bases', '/api/v1/db/meta/projects/:projectId/bases',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/BaseReq'),
ncMetaAclMw(baseCreate, 'baseCreate') ncMetaAclMw(baseCreate, 'baseCreate')
); );
router.get( router.get(

2
packages/nocodb/src/lib/meta/api/columnApis.ts

@ -41,6 +41,7 @@ import formulaQueryBuilderv2 from '../../db/sql-data-mapper/lib/sql/formulav2/fo
import { import {
createHmAndBtColumn, createHmAndBtColumn,
generateFkName, generateFkName,
getAjvValidatorMw,
randomID, randomID,
validateLookupPayload, validateLookupPayload,
validateRequiredField, validateRequiredField,
@ -1785,6 +1786,7 @@ const router = Router({ mergeParams: true });
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/columns/', '/api/v1/db/meta/tables/:tableId/columns/',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/ColumnReq'),
ncMetaAclMw(columnAdd, 'columnAdd') ncMetaAclMw(columnAdd, 'columnAdd')
); );

4
packages/nocodb/src/lib/meta/api/filterApis.ts

@ -13,6 +13,7 @@ import Project from '../../models/Project';
import Filter from '../../models/Filter'; import Filter from '../../models/Filter';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
// @ts-ignore // @ts-ignore
export async function filterGet(req: Request, res: Response, next) { export async function filterGet(req: Request, res: Response, next) {
@ -135,6 +136,7 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/views/:viewId/filters', '/api/v1/db/meta/views/:viewId/filters',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FilterReq'),
ncMetaAclMw(filterCreate, 'filterCreate') ncMetaAclMw(filterCreate, 'filterCreate')
); );
@ -145,6 +147,7 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/hooks/:hookId/filters', '/api/v1/db/meta/hooks/:hookId/filters',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FilterReq'),
ncMetaAclMw(hookFilterCreate, 'filterCreate') ncMetaAclMw(hookFilterCreate, 'filterCreate')
); );
@ -156,6 +159,7 @@ router.get(
router.patch( router.patch(
'/api/v1/db/meta/filters/:filterId', '/api/v1/db/meta/filters/:filterId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FilterReq'),
ncMetaAclMw(filterUpdate, 'filterUpdate') ncMetaAclMw(filterUpdate, 'filterUpdate')
); );
router.delete( router.delete(

3
packages/nocodb/src/lib/meta/api/formViewApis.ts

@ -13,6 +13,7 @@ import View from '../../models/View';
import FormView from '../../models/FormView'; import FormView from '../../models/FormView';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
// @ts-ignore // @ts-ignore
export async function formViewGet(req: Request, res: Response<FormType>) { export async function formViewGet(req: Request, res: Response<FormType>) {
@ -43,6 +44,7 @@ const router = Router({ mergeParams: true });
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/forms', '/api/v1/db/meta/tables/:tableId/forms',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FormCreateReq'),
ncMetaAclMw(formViewCreate, 'formViewCreate') ncMetaAclMw(formViewCreate, 'formViewCreate')
); );
router.get( router.get(
@ -53,6 +55,7 @@ router.get(
router.patch( router.patch(
'/api/v1/db/meta/forms/:formViewId', '/api/v1/db/meta/forms/:formViewId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FormReq'),
ncMetaAclMw(formViewUpdate, 'formViewUpdate') ncMetaAclMw(formViewUpdate, 'formViewUpdate')
); );
router.delete( router.delete(

2
packages/nocodb/src/lib/meta/api/formViewColumnApis.ts

@ -3,6 +3,7 @@ import FormViewColumn from '../../models/FormViewColumn';
import { Tele } from 'nc-help'; import { Tele } from 'nc-help';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function columnUpdate(req: Request, res: Response) { export async function columnUpdate(req: Request, res: Response) {
Tele.emit('evt', { evt_type: 'formViewColumn:updated' }); Tele.emit('evt', { evt_type: 'formViewColumn:updated' });
@ -13,6 +14,7 @@ const router = Router({ mergeParams: true });
router.patch( router.patch(
'/api/v1/db/meta/form-columns/:formViewColumnId', '/api/v1/db/meta/form-columns/:formViewColumnId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FormColumnReq'),
ncMetaAclMw(columnUpdate, 'columnUpdate') ncMetaAclMw(columnUpdate, 'columnUpdate')
); );
export default router; export default router;

3
packages/nocodb/src/lib/meta/api/galleryViewApis.ts

@ -5,6 +5,7 @@ import GalleryView from '../../models/GalleryView';
import { Tele } from 'nc-help'; import { Tele } from 'nc-help';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function galleryViewGet(req: Request, res: Response<GalleryType>) { export async function galleryViewGet(req: Request, res: Response<GalleryType>) {
res.json(await GalleryView.get(req.params.galleryViewId)); res.json(await GalleryView.get(req.params.galleryViewId));
} }
@ -29,11 +30,13 @@ const router = Router({ mergeParams: true });
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/galleries', '/api/v1/db/meta/tables/:tableId/galleries',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/GalleryReq'),
ncMetaAclMw(galleryViewCreate, 'galleryViewCreate') ncMetaAclMw(galleryViewCreate, 'galleryViewCreate')
); );
router.patch( router.patch(
'/api/v1/db/meta/galleries/:galleryViewId', '/api/v1/db/meta/galleries/:galleryViewId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/GalleryReq'),
ncMetaAclMw(galleryViewUpdate, 'galleryViewUpdate') ncMetaAclMw(galleryViewUpdate, 'galleryViewUpdate')
); );
router.get( router.get(

2
packages/nocodb/src/lib/meta/api/gridViewApis.ts

@ -13,6 +13,7 @@ import View from '../../models/View';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import GridView from '../../models/GridView'; import GridView from '../../models/GridView';
import { getAjvValidatorMw } from './helpers';
// @ts-ignore // @ts-ignore
export async function gridViewCreate(req: Request<any, any>, res) { export async function gridViewCreate(req: Request<any, any>, res) {
@ -35,6 +36,7 @@ const router = Router({ mergeParams: true });
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/grids/', '/api/v1/db/meta/tables/:tableId/grids/',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/GridReq'),
ncMetaAclMw(gridViewCreate, 'gridViewCreate') ncMetaAclMw(gridViewCreate, 'gridViewCreate')
); );
router.patch( router.patch(

2
packages/nocodb/src/lib/meta/api/gridViewColumnApis.ts

@ -3,6 +3,7 @@ import GridViewColumn from '../../models/GridViewColumn';
import { Tele } from 'nc-help'; import { Tele } from 'nc-help';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function columnList(req: Request, res: Response) { export async function columnList(req: Request, res: Response) {
res.json(await GridViewColumn.list(req.params.gridViewId)); res.json(await GridViewColumn.list(req.params.gridViewId));
@ -22,6 +23,7 @@ router.get(
router.patch( router.patch(
'/api/v1/db/meta/grid-columns/:gridViewColumnId', '/api/v1/db/meta/grid-columns/:gridViewColumnId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/GridColumnReq'),
ncMetaAclMw(gridColumnUpdate, 'gridColumnUpdate') ncMetaAclMw(gridColumnUpdate, 'gridColumnUpdate')
); );
export default router; export default router;

34
packages/nocodb/src/lib/meta/api/helpers/apiHelpers.ts

@ -1,4 +1,38 @@
import { NextFunction, Request, Response } from 'express';
import Ajv, { ErrorObject } from 'ajv';
// @ts-ignore
import swagger from '../../../../schema/swagger.json';
export function parseHrtimeToSeconds(hrtime) { export function parseHrtimeToSeconds(hrtime) {
const seconds = (hrtime[0] + hrtime[1] / 1e6).toFixed(3); const seconds = (hrtime[0] + hrtime[1] / 1e6).toFixed(3);
return seconds; return seconds;
} }
const ajv = new Ajv({ strictSchema: false, strict: false }); // Initialize AJV
ajv.addSchema(swagger, 'swagger.json');
// A middleware generator to validate the request body
export const getAjvValidatorMw = (schema) => {
return (req: Request, res: Response, next: NextFunction) => {
// Validate the request body against the schema
const valid = ajv.validate(
typeof schema === 'string' ? { $ref: schema } : schema,
req.body
);
// If the request body is valid, call the next middleware
if (valid) {
next();
} else {
const errors: ErrorObject[] | null | undefined = ajv.errors;
// If the request body is invalid, send a response with an error message
res.status(400).json({
status: 'error',
message: 'Invalid request body',
errors,
});
}
};
};

3
packages/nocodb/src/lib/meta/api/helpers/columnHelpers.ts

@ -3,6 +3,7 @@ import {
ColumnReqType, ColumnReqType,
LinkToAnotherRecordType, LinkToAnotherRecordType,
LookupColumnReqType, LookupColumnReqType,
BoolType,
RelationTypes, RelationTypes,
RollupColumnReqType, RollupColumnReqType,
TableType, TableType,
@ -27,7 +28,7 @@ export async function createHmAndBtColumn(
type?: RelationTypes, type?: RelationTypes,
alias?: string, alias?: string,
fkColName?: string, fkColName?: string,
virtual = false, virtual: BoolType = false,
isSystemCol = false isSystemCol = false
) { ) {
// save bt column // save bt column

4
packages/nocodb/src/lib/meta/api/hookApis.ts

@ -9,6 +9,7 @@ import Model from '../../models/Model';
import populateSamplePayload from '../helpers/populateSamplePayload'; import populateSamplePayload from '../helpers/populateSamplePayload';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function hookList( export async function hookList(
req: Request<any, any, any>, req: Request<any, any, any>,
@ -85,11 +86,13 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/hooks/test', '/api/v1/db/meta/tables/:tableId/hooks/test',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/HookTestReq'),
ncMetaAclMw(hookTest, 'hookTest') ncMetaAclMw(hookTest, 'hookTest')
); );
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/hooks', '/api/v1/db/meta/tables/:tableId/hooks',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/HookReq'),
ncMetaAclMw(hookCreate, 'hookCreate') ncMetaAclMw(hookCreate, 'hookCreate')
); );
router.delete( router.delete(
@ -100,6 +103,7 @@ router.delete(
router.patch( router.patch(
'/api/v1/db/meta/hooks/:hookId', '/api/v1/db/meta/hooks/:hookId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/HookReq'),
ncMetaAclMw(hookUpdate, 'hookUpdate') ncMetaAclMw(hookUpdate, 'hookUpdate')
); );
router.get( router.get(

3
packages/nocodb/src/lib/meta/api/hookFilterApis.ts

@ -13,6 +13,7 @@ import Project from '../../models/Project';
import Filter from '../../models/Filter'; import Filter from '../../models/Filter';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
// @ts-ignore // @ts-ignore
export async function filterGet(req: Request, res: Response, next) { export async function filterGet(req: Request, res: Response, next) {
@ -117,6 +118,7 @@ router.get(
router.post( router.post(
'/hooks/:hookId/filters/', '/hooks/:hookId/filters/',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FilterReq'),
ncMetaAclMw(filterCreate, 'filterCreate') ncMetaAclMw(filterCreate, 'filterCreate')
); );
router.get( router.get(
@ -127,6 +129,7 @@ router.get(
router.patch( router.patch(
'/hooks/:hookId/filters/:filterId', '/hooks/:hookId/filters/:filterId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/FilterReq'),
ncMetaAclMw(filterUpdate, 'filterUpdate') ncMetaAclMw(filterUpdate, 'filterUpdate')
); );
router.delete( router.delete(

3
packages/nocodb/src/lib/meta/api/kanbanViewApis.ts

@ -5,6 +5,7 @@ import KanbanView from '../../models/KanbanView';
import { Tele } from 'nc-help'; import { Tele } from 'nc-help';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function kanbanViewGet(req: Request, res: Response<KanbanType>) { export async function kanbanViewGet(req: Request, res: Response<KanbanType>) {
res.json(await KanbanView.get(req.params.kanbanViewId)); res.json(await KanbanView.get(req.params.kanbanViewId));
@ -31,11 +32,13 @@ const router = Router({ mergeParams: true });
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/kanbans', '/api/v1/db/meta/tables/:tableId/kanbans',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/KanbanReq'),
ncMetaAclMw(kanbanViewCreate, 'kanbanViewCreate') ncMetaAclMw(kanbanViewCreate, 'kanbanViewCreate')
); );
router.patch( router.patch(
'/api/v1/db/meta/kanbans/:kanbanViewId', '/api/v1/db/meta/kanbans/:kanbanViewId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/KanbanUpdateReq'),
ncMetaAclMw(kanbanViewUpdate, 'kanbanViewUpdate') ncMetaAclMw(kanbanViewUpdate, 'kanbanViewUpdate')
); );
router.get( router.get(

1
packages/nocodb/src/lib/meta/api/mapViewApis.ts

@ -28,6 +28,7 @@ export async function mapViewUpdate(req, res) {
const router = Router({ mergeParams: true }); const router = Router({ mergeParams: true });
// todo: add schema in swagger and use getAjvValidatorMw
router.post( router.post(
'/api/v1/db/meta/tables/:tableId/maps', '/api/v1/db/meta/tables/:tableId/maps',
metaApiMetrics, metaApiMetrics,

2
packages/nocodb/src/lib/meta/api/modelVisibilityApis.ts

@ -4,6 +4,7 @@ import { Router } from 'express';
import { Tele } from 'nc-help'; import { Tele } from 'nc-help';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
async function xcVisibilityMetaSetAll(req, res) { async function xcVisibilityMetaSetAll(req, res) {
Tele.emit('evt', { evt_type: 'uiAcl:updated' }); Tele.emit('evt', { evt_type: 'uiAcl:updated' });
for (const d of req.body) { for (const d of req.body) {
@ -122,6 +123,7 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/visibility-rules', '/api/v1/db/meta/projects/:projectId/visibility-rules',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/VisibilityRuleReq'),
ncMetaAclMw(xcVisibilityMetaSetAll, 'modelVisibilitySet') ncMetaAclMw(xcVisibilityMetaSetAll, 'modelVisibilitySet')
); );
export default router; export default router;

2
packages/nocodb/src/lib/meta/api/orgLicenseApis.ts

@ -5,6 +5,7 @@ import Store from '../../models/Store';
import Noco from '../../Noco'; import Noco from '../../Noco';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { getAjvValidatorMw } from './helpers';
async function licenseGet(_req, res) { async function licenseGet(_req, res) {
const license = await Store.get(NC_LICENSE_KEY); const license = await Store.get(NC_LICENSE_KEY);
@ -30,6 +31,7 @@ router.get(
router.post( router.post(
'/api/v1/license', '/api/v1/license',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/LicenseReq'),
ncMetaAclMw(licenseSet, 'licenseSet', { ncMetaAclMw(licenseSet, 'licenseSet', {
allowedRoles: [OrgUserRoles.SUPER_ADMIN], allowedRoles: [OrgUserRoles.SUPER_ADMIN],
blockApiTokenAccess: true, blockApiTokenAccess: true,

2
packages/nocodb/src/lib/meta/api/orgTokenApis.ts

@ -8,6 +8,7 @@ import getHandler from '../helpers/getHandler';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { PagedResponseImpl } from '../helpers/PagedResponse'; import { PagedResponseImpl } from '../helpers/PagedResponse';
import { apiTokenListEE } from './ee/orgTokenApis'; import { apiTokenListEE } from './ee/orgTokenApis';
import { getAjvValidatorMw } from './helpers';
async function apiTokenList(req, res) { async function apiTokenList(req, res) {
const fk_user_id = req.user.id; const fk_user_id = req.user.id;
@ -65,6 +66,7 @@ router.get(
router.post( router.post(
'/api/v1/tokens', '/api/v1/tokens',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/ApiTokenReq'),
ncMetaAclMw(apiTokenCreate, 'apiTokenCreate', { ncMetaAclMw(apiTokenCreate, 'apiTokenCreate', {
// allowedRoles: [OrgUserRoles.SUPER], // allowedRoles: [OrgUserRoles.SUPER],
blockApiTokenAccess: true, blockApiTokenAccess: true,

3
packages/nocodb/src/lib/meta/api/orgUserApis.ts

@ -22,6 +22,7 @@ import { extractProps } from '../helpers/extractProps';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { PagedResponseImpl } from '../helpers/PagedResponse'; import { PagedResponseImpl } from '../helpers/PagedResponse';
import { randomTokenString } from '../helpers/stringHelpers'; import { randomTokenString } from '../helpers/stringHelpers';
import { getAjvValidatorMw } from './helpers';
import { sendInviteEmail } from './projectUserApis'; import { sendInviteEmail } from './projectUserApis';
async function userList(req, res) { async function userList(req, res) {
@ -266,6 +267,7 @@ router.get(
router.patch( router.patch(
'/api/v1/users/:userId', '/api/v1/users/:userId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/OrgUserReq'),
ncMetaAclMw(userUpdate, 'userUpdate', { ncMetaAclMw(userUpdate, 'userUpdate', {
allowedRoles: [OrgUserRoles.SUPER_ADMIN], allowedRoles: [OrgUserRoles.SUPER_ADMIN],
blockApiTokenAccess: true, blockApiTokenAccess: true,
@ -282,6 +284,7 @@ router.delete(
router.post( router.post(
'/api/v1/users', '/api/v1/users',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/OrgUserReq'),
ncMetaAclMw(userAdd, 'userAdd', { ncMetaAclMw(userAdd, 'userAdd', {
allowedRoles: [OrgUserRoles.SUPER_ADMIN], allowedRoles: [OrgUserRoles.SUPER_ADMIN],
blockApiTokenAccess: true, blockApiTokenAccess: true,

4
packages/nocodb/src/lib/meta/api/pluginApis.ts

@ -6,6 +6,7 @@ import { PluginType } from 'nocodb-sdk';
import NcPluginMgrv2 from '../helpers/NcPluginMgrv2'; import NcPluginMgrv2 from '../helpers/NcPluginMgrv2';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
export async function pluginList(_req: Request, res: Response) { export async function pluginList(_req: Request, res: Response) {
res.json(new PagedResponseImpl(await Plugin.list())); res.json(new PagedResponseImpl(await Plugin.list()));
@ -43,6 +44,8 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/plugins/test', '/api/v1/db/meta/plugins/test',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/PluginTestReq'),
ncMetaAclMw(pluginTest, 'pluginTest') ncMetaAclMw(pluginTest, 'pluginTest')
); );
router.get( router.get(
@ -53,6 +56,7 @@ router.get(
router.patch( router.patch(
'/api/v1/db/meta/plugins/:pluginId', '/api/v1/db/meta/plugins/:pluginId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/PluginReq'),
ncMetaAclMw(pluginUpdate, 'pluginUpdate') ncMetaAclMw(pluginUpdate, 'pluginUpdate')
); );
router.get( router.get(

3
packages/nocodb/src/lib/meta/api/projectApis.ts

@ -18,7 +18,7 @@ import { metaApiMetrics } from '../helpers/apiMetrics';
import { extractPropsAndSanitize } from '../helpers/extractProps'; import { extractPropsAndSanitize } from '../helpers/extractProps';
import NcConfigFactory from '../../utils/NcConfigFactory'; import NcConfigFactory from '../../utils/NcConfigFactory';
import { promisify } from 'util'; import { promisify } from 'util';
import { populateMeta } from './helpers'; import { getAjvValidatorMw, populateMeta } from './helpers';
import Filter from '../../models/Filter'; import Filter from '../../models/Filter';
const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 4); const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 4);
@ -272,6 +272,7 @@ export default (router) => {
router.post( router.post(
'/api/v1/db/meta/projects', '/api/v1/db/meta/projects',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/ProjectReq'),
ncMetaAclMw(projectCreate, 'projectCreate') ncMetaAclMw(projectCreate, 'projectCreate')
); );
router.get( router.get(

3
packages/nocodb/src/lib/meta/api/projectUserApis.ts

@ -17,6 +17,7 @@ import Noco from '../../Noco';
import { PluginCategory } from 'nocodb-sdk'; import { PluginCategory } from 'nocodb-sdk';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { randomTokenString } from '../helpers/stringHelpers'; import { randomTokenString } from '../helpers/stringHelpers';
import { getAjvValidatorMw } from './helpers';
async function userList(req, res) { async function userList(req, res) {
res.json({ res.json({
@ -310,11 +311,13 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/users', '/api/v1/db/meta/projects/:projectId/users',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/ProjectUserReq'),
ncMetaAclMw(userInvite, 'userInvite') ncMetaAclMw(userInvite, 'userInvite')
); );
router.patch( router.patch(
'/api/v1/db/meta/projects/:projectId/users/:userId', '/api/v1/db/meta/projects/:projectId/users/:userId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/ProjectUserReq'),
ncMetaAclMw(projectUserUpdate, 'projectUserUpdate') ncMetaAclMw(projectUserUpdate, 'projectUserUpdate')
); );
router.delete( router.delete(

3
packages/nocodb/src/lib/meta/api/sharedBaseApis.ts

@ -4,6 +4,7 @@ import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import Project from '../../models/Project'; import Project from '../../models/Project';
import { NcError } from '../helpers/catchError'; import { NcError } from '../helpers/catchError';
import { getAjvValidatorMw } from './helpers';
// todo: load from config // todo: load from config
const config = { const config = {
dashboardPath: '/nc', dashboardPath: '/nc',
@ -96,10 +97,12 @@ router.get(
); );
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/shared', '/api/v1/db/meta/projects/:projectId/shared',
getAjvValidatorMw('swagger.json#/components/schemas/SharedBaseReq'),
ncMetaAclMw(createSharedBaseLink, 'createSharedBaseLink') ncMetaAclMw(createSharedBaseLink, 'createSharedBaseLink')
); );
router.patch( router.patch(
'/api/v1/db/meta/projects/:projectId/shared', '/api/v1/db/meta/projects/:projectId/shared',
getAjvValidatorMw('swagger.json#/components/schemas/SharedBaseReq'),
ncMetaAclMw(updateSharedBaseLink, 'updateSharedBaseLink') ncMetaAclMw(updateSharedBaseLink, 'updateSharedBaseLink')
); );
router.delete( router.delete(

3
packages/nocodb/src/lib/meta/api/sortApis.ts

@ -12,6 +12,7 @@ import Project from '../../models/Project';
import Sort from '../../models/Sort'; import Sort from '../../models/Sort';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { metaApiMetrics } from '../helpers/apiMetrics'; import { metaApiMetrics } from '../helpers/apiMetrics';
import { getAjvValidatorMw } from './helpers';
// @ts-ignore // @ts-ignore
export async function sortGet(req: Request, res: Response<TableType>) {} export async function sortGet(req: Request, res: Response<TableType>) {}
@ -58,6 +59,7 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/views/:viewId/sorts/', '/api/v1/db/meta/views/:viewId/sorts/',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/SortReq'),
ncMetaAclMw(sortCreate, 'sortCreate') ncMetaAclMw(sortCreate, 'sortCreate')
); );
router.get( router.get(
@ -68,6 +70,7 @@ router.get(
router.patch( router.patch(
'/api/v1/db/meta/sorts/:sortId', '/api/v1/db/meta/sorts/:sortId',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/SortReq'),
ncMetaAclMw(sortUpdate, 'sortUpdate') ncMetaAclMw(sortUpdate, 'sortUpdate')
); );
router.delete( router.delete(

13
packages/nocodb/src/lib/meta/api/tableApis.ts

@ -8,6 +8,7 @@ import {
AuditOperationTypes, AuditOperationTypes,
isVirtualCol, isVirtualCol,
ModelTypes, ModelTypes,
NormalColumnRequestType,
TableListType, TableListType,
TableReqType, TableReqType,
TableType, TableType,
@ -17,6 +18,7 @@ import ProjectMgrv2 from '../../db/sql-mgr/v2/ProjectMgrv2';
import Project from '../../models/Project'; import Project from '../../models/Project';
import Audit from '../../models/Audit'; import Audit from '../../models/Audit';
import ncMetaAclMw from '../helpers/ncMetaAclMw'; import ncMetaAclMw from '../helpers/ncMetaAclMw';
import { getAjvValidatorMw } from './helpers';
import { xcVisibilityMetaGet } from './modelVisibilityApis'; import { xcVisibilityMetaGet } from './modelVisibilityApis';
import View from '../../models/View'; import View from '../../models/View';
import getColumnPropsFromUIDT from '../helpers/getColumnPropsFromUIDT'; import getColumnPropsFromUIDT from '../helpers/getColumnPropsFromUIDT';
@ -216,10 +218,13 @@ export async function tableCreate(req: Request<any, any, TableReqType>, res) {
columns: columns.map((c, i) => { columns: columns.map((c, i) => {
const colMetaFromReq = req.body?.columns?.find( const colMetaFromReq = req.body?.columns?.find(
(c1) => c.cn === c1.column_name (c1) => c.cn === c1.column_name
); ) as NormalColumnRequestType;
return { return {
...colMetaFromReq, ...colMetaFromReq,
uidt: colMetaFromReq?.uidt || c.uidt || getColumnUiType(base, c), uidt:
(colMetaFromReq?.uidt as string) ||
c.uidt ||
getColumnUiType(base, c),
...c, ...c,
dtxp: [UITypes.MultiSelect, UITypes.SingleSelect].includes( dtxp: [UITypes.MultiSelect, UITypes.SingleSelect].includes(
colMetaFromReq.uidt as any colMetaFromReq.uidt as any
@ -229,7 +234,7 @@ export async function tableCreate(req: Request<any, any, TableReqType>, res) {
title: colMetaFromReq?.title || getColumnNameAlias(c.cn, base), title: colMetaFromReq?.title || getColumnNameAlias(c.cn, base),
column_name: c.cn, column_name: c.cn,
order: i + 1, order: i + 1,
}; } as NormalColumnRequestType;
}), }),
order: +(tables?.pop()?.order ?? 0) + 1, order: +(tables?.pop()?.order ?? 0) + 1,
}) })
@ -410,11 +415,13 @@ router.get(
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/tables', '/api/v1/db/meta/projects/:projectId/tables',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/TableReq'),
ncMetaAclMw(tableCreate, 'tableCreate') ncMetaAclMw(tableCreate, 'tableCreate')
); );
router.post( router.post(
'/api/v1/db/meta/projects/:projectId/:baseId/tables', '/api/v1/db/meta/projects/:projectId/:baseId/tables',
metaApiMetrics, metaApiMetrics,
getAjvValidatorMw('swagger.json#/components/schemas/TableReq'),
ncMetaAclMw(tableCreate, 'tableCreate') ncMetaAclMw(tableCreate, 'tableCreate')
); );
router.get( router.get(

65
packages/nocodb/src/lib/meta/api/userApi/userApis.ts

@ -22,6 +22,7 @@ import extractProjectIdAndAuthenticate from '../../helpers/extractProjectIdAndAu
import ncMetaAclMw from '../../helpers/ncMetaAclMw'; import ncMetaAclMw from '../../helpers/ncMetaAclMw';
import { MetaTable } from '../../../utils/globals'; import { MetaTable } from '../../../utils/globals';
import Noco from '../../../Noco'; import Noco from '../../../Noco';
import { getAjvValidatorMw } from '../helpers';
import { genJwt } from './helpers'; import { genJwt } from './helpers';
import { randomTokenString } from '../../helpers/stringHelpers'; import { randomTokenString } from '../../helpers/stringHelpers';
@ -523,15 +524,32 @@ async function renderPasswordReset(req, res): Promise<any> {
const mapRoutes = (router) => { const mapRoutes = (router) => {
// todo: old api - /auth/signup?tool=1 // todo: old api - /auth/signup?tool=1
router.post('/auth/user/signup', catchError(signup)); router.post(
router.post('/auth/user/signin', catchError(signin)); '/auth/user/signup',
getAjvValidatorMw('swagger.json#/components/schemas/SignUpReq'),
catchError(signup)
);
router.post(
'/auth/user/signin',
getAjvValidatorMw('swagger.json#/components/schemas/SignInReq'),
catchError(signin)
);
router.get('/auth/user/me', extractProjectIdAndAuthenticate, catchError(me)); router.get('/auth/user/me', extractProjectIdAndAuthenticate, catchError(me));
router.post('/auth/password/forgot', catchError(passwordForgot)); router.post(
'/auth/password/forgot',
getAjvValidatorMw('swagger.json#/components/schemas/ForgotPasswordReq'),
catchError(passwordForgot)
);
router.post('/auth/token/validate/:tokenId', catchError(tokenValidate)); router.post('/auth/token/validate/:tokenId', catchError(tokenValidate));
router.post('/auth/password/reset/:tokenId', catchError(passwordReset)); router.post(
'/auth/password/reset/:tokenId',
getAjvValidatorMw('swagger.json#/components/schemas/PasswordResetReq'),
catchError(passwordReset)
);
router.post('/auth/email/validate/:tokenId', catchError(emailVerification)); router.post('/auth/email/validate/:tokenId', catchError(emailVerification));
router.post( router.post(
'/user/password/change', '/user/password/change',
getAjvValidatorMw('swagger.json#/components/schemas/PasswordChangeReq'),
ncMetaAclMw(passwordChange, 'passwordChange') ncMetaAclMw(passwordChange, 'passwordChange')
); );
router.post('/auth/token/refresh', catchError(refreshToken)); router.post('/auth/token/refresh', catchError(refreshToken));
@ -549,20 +567,33 @@ const mapRoutes = (router) => {
); );
// deprecated APIs // deprecated APIs
router.post('/api/v1/db/auth/user/signup', catchError(signup)); router.post(
router.post('/api/v1/db/auth/user/signin', catchError(signin)); '/api/v1/db/auth/user/signup',
getAjvValidatorMw('swagger.json#/components/schemas/SignUpReq'),
catchError(signup)
);
router.post(
'/api/v1/db/auth/user/signin',
getAjvValidatorMw('swagger.json#/components/schemas/SignInReq'),
catchError(signin)
);
router.get( router.get(
'/api/v1/db/auth/user/me', '/api/v1/db/auth/user/me',
extractProjectIdAndAuthenticate, extractProjectIdAndAuthenticate,
catchError(me) catchError(me)
); );
router.post('/api/v1/db/auth/password/forgot', catchError(passwordForgot)); router.post(
'/api/v1/db/auth/password/forgot',
getAjvValidatorMw('swagger.json#/components/schemas/ForgotPasswordReq'),
catchError(passwordForgot)
);
router.post( router.post(
'/api/v1/db/auth/token/validate/:tokenId', '/api/v1/db/auth/token/validate/:tokenId',
catchError(tokenValidate) catchError(tokenValidate)
); );
router.post( router.post(
'/api/v1/db/auth/password/reset/:tokenId', '/api/v1/db/auth/password/reset/:tokenId',
getAjvValidatorMw('swagger.json#/components/schemas/PasswordResetReq'),
catchError(passwordReset) catchError(passwordReset)
); );
router.post( router.post(
@ -571,6 +602,7 @@ const mapRoutes = (router) => {
); );
router.post( router.post(
'/api/v1/db/auth/password/change', '/api/v1/db/auth/password/change',
getAjvValidatorMw('swagger.json#/components/schemas/PasswordChangeReq'),
ncMetaAclMw(passwordChange, 'passwordChange') ncMetaAclMw(passwordChange, 'passwordChange')
); );
router.post('/api/v1/db/auth/token/refresh', catchError(refreshToken)); router.post('/api/v1/db/auth/token/refresh', catchError(refreshToken));
@ -580,14 +612,26 @@ const mapRoutes = (router) => {
); );
// new API // new API
router.post('/api/v1/auth/user/signup', catchError(signup)); router.post(
router.post('/api/v1/auth/user/signin', catchError(signin)); '/api/v1/auth/user/signup',
getAjvValidatorMw('swagger.json#/components/schemas/SignUpReq'),
catchError(signup)
);
router.post(
'/api/v1/auth/user/signin',
getAjvValidatorMw('swagger.json#/components/schemas/SignInReq'),
catchError(signin)
);
router.get( router.get(
'/api/v1/auth/user/me', '/api/v1/auth/user/me',
extractProjectIdAndAuthenticate, extractProjectIdAndAuthenticate,
catchError(me) catchError(me)
); );
router.post('/api/v1/auth/password/forgot', catchError(passwordForgot)); router.post(
'/api/v1/auth/password/forgot',
getAjvValidatorMw('swagger.json#/components/schemas/ForgotPasswordReq'),
catchError(passwordForgot)
);
router.post( router.post(
'/api/v1/auth/token/validate/:tokenId', '/api/v1/auth/token/validate/:tokenId',
catchError(tokenValidate) catchError(tokenValidate)
@ -602,6 +646,7 @@ const mapRoutes = (router) => {
); );
router.post( router.post(
'/api/v1/auth/password/change', '/api/v1/auth/password/change',
getAjvValidatorMw('swagger.json#/components/schemas/PasswordChangeReq'),
ncMetaAclMw(passwordChange, 'passwordChange') ncMetaAclMw(passwordChange, 'passwordChange')
); );
router.post('/api/v1/auth/token/refresh', catchError(refreshToken)); router.post('/api/v1/auth/token/refresh', catchError(refreshToken));

1
packages/nocodb/src/lib/meta/api/viewApis.ts

@ -89,7 +89,6 @@ async function showAllColumns(req: Request<any, any>, res) {
} }
async function hideAllColumns(req: Request<any, any>, res) { async function hideAllColumns(req: Request<any, any>, res) {
res.json( res.json(
await View.hideAllColumns( await View.hideAllColumns(
req.params.viewId, req.params.viewId,

384
packages/nocodb/src/lib/meta/helpers/catchError.ts

@ -1,3 +1,371 @@
enum DBError {
TABLE_EXIST = 'TABLE_EXIST',
TABLE_NOT_EXIST = 'TABLE_NOT_EXIST',
COLUMN_EXIST = 'COLUMN_EXIST',
COLUMN_NOT_EXIST = 'COLUMN_NOT_EXIST',
CONSTRAINT_EXIST = 'CONSTRAINT_EXIST',
CONSTRAINT_NOT_EXIST = 'CONSTRAINT_NOT_EXIST',
}
// extract db errors using database error code
function extractDBError(error): {
type: DBError;
message: string;
info: any;
extra?: Record<string, any>;
} | void {
if (!error.code) return;
let message: string;
let extra: Record<string, any>;
let type: DBError;
switch (error.code) {
// sqlite errors
case 'SQLITE_BUSY':
message = 'The database is locked by another process or transaction.';
break;
case 'SQLITE_CONSTRAINT':
{
const constraint = /FOREIGN KEY|UNIQUE/.test(error.message)
? error.message.match(/FOREIGN KEY|UNIQUE/gi)?.join(' ')
: 'constraint';
message = `A ${constraint} constraint was violated: ${error.message}`;
extra = {
constraint,
};
}
break;
case 'SQLITE_CORRUPT':
message = 'The database file is corrupt.';
break;
case 'SQLITE_ERROR':
message = 'A SQL error occurred.';
if (error.message) {
const noSuchTableMatch = error.message.match(/no such table: (\w+)/);
const tableAlreadyExistsMatch = error.message.match(
/SQLITE_ERROR: table `?(\w+)`? already exists/
);
const duplicateColumnExistsMatch = error.message.match(
/SQLITE_ERROR: duplicate column name: (\w+)/
);
const unrecognizedTokenMatch = error.message.match(
/SQLITE_ERROR: unrecognized token: "(\w+)"/
);
const columnDoesNotExistMatch = error.message.match(
/SQLITE_ERROR: no such column: (\w+)/
);
const constraintFailedMatch = error.message.match(
/SQLITE_ERROR: constraint failed: (\w+)/
);
if (noSuchTableMatch && noSuchTableMatch[1]) {
message = `The table '${noSuchTableMatch[1]}' does not exist.`;
type = DBError.TABLE_NOT_EXIST;
extra = {
table: noSuchTableMatch[1],
};
} else if (tableAlreadyExistsMatch && tableAlreadyExistsMatch[1]) {
message = `The table '${tableAlreadyExistsMatch[1]}' already exists.`;
type = DBError.TABLE_EXIST;
extra = {
table: tableAlreadyExistsMatch[1],
};
} else if (unrecognizedTokenMatch && unrecognizedTokenMatch[1]) {
message = `Unrecognized token: ${unrecognizedTokenMatch[1]}`;
extra = {
token: unrecognizedTokenMatch[1],
};
} else if (columnDoesNotExistMatch && columnDoesNotExistMatch[1]) {
message = `The column ${columnDoesNotExistMatch[1]} does not exist.`;
type = DBError.COLUMN_NOT_EXIST;
extra = {
column: columnDoesNotExistMatch[1],
};
} else if (constraintFailedMatch && constraintFailedMatch[1]) {
message = `A constraint failed: ${constraintFailedMatch[1]}`;
} else if (
duplicateColumnExistsMatch &&
duplicateColumnExistsMatch[1]
) {
message = `The column '${duplicateColumnExistsMatch[1]}' already exists.`;
type = DBError.COLUMN_EXIST;
extra = {
column: duplicateColumnExistsMatch[1],
};
} else {
const match = error.message.match(/SQLITE_ERROR:\s*(\w+)/);
if (match && match[1]) {
message = match[1];
}
}
}
break;
case 'SQLITE_RANGE':
message = 'A column index is out of range.';
break;
case 'SQLITE_SCHEMA':
message = 'The database schema has changed.';
break;
// mysql errors
case 'ER_TABLE_EXISTS_ERROR':
message = 'The table already exists.';
if (error.message) {
const extractTableNameMatch = error.message.match(
/ Table '?(\w+)'? already exists/i
);
if (extractTableNameMatch && extractTableNameMatch[1]) {
message = `The table '${extractTableNameMatch[1]}' already exists.`;
type = DBError.TABLE_EXIST;
extra = {
table: extractTableNameMatch[1],
};
}
}
break;
case 'ER_DUP_FIELDNAME':
message = 'The column already exists.';
if (error.message) {
const extractColumnNameMatch = error.message.match(
/ Duplicate column name '(\w+)'/i
);
if (extractColumnNameMatch && extractColumnNameMatch[1]) {
message = `The column '${extractColumnNameMatch[1]}' already exists.`;
type = DBError.COLUMN_EXIST;
extra = {
column: extractColumnNameMatch[1],
};
}
}
break;
case 'ER_NO_SUCH_TABLE':
message = 'The table does not exist.';
if (error.message) {
const missingTableMatch = error.message.match(
/ Table '(?:\w+\.)?(\w+)' doesn't exist/i
);
if (missingTableMatch && missingTableMatch[1]) {
message = `The table '${missingTableMatch[1]}' does not exist`;
type = DBError.TABLE_NOT_EXIST;
extra = {
table: missingTableMatch[1],
};
}
}
break;
case 'ER_DUP_ENTRY':
message = 'This record already exists.';
break;
case 'ER_PARSE_ERROR':
message = 'There was a syntax error in your SQL query.';
break;
case 'ER_NO_DEFAULT_FOR_FIELD':
message = 'A value is required for this field.';
break;
case 'ER_BAD_NULL_ERROR':
message = 'A null value is not allowed for this field.';
break;
case 'ER_DATA_TOO_LONG':
message = 'The data entered is too long for this field.';
break;
case 'ER_BAD_FIELD_ERROR':
{
message = 'The field you are trying to access does not exist.';
const extractColNameMatch = error.message.match(
/ Unknown column '(\w+)' in 'field list'/i
);
if (extractColNameMatch && extractColNameMatch[1]) {
message = `The column '${extractColNameMatch[1]}' does not exist.`;
type = DBError.COLUMN_NOT_EXIST;
extra = {
column: extractColNameMatch[1],
};
}
}
break;
case 'ER_ACCESS_DENIED_ERROR':
message = 'You do not have permission to perform this action.';
break;
case 'ER_LOCK_WAIT_TIMEOUT':
message = 'A timeout occurred while waiting for a table lock.';
break;
case 'ER_NO_REFERENCED_ROW':
message = 'The referenced row does not exist.';
break;
case 'ER_ROW_IS_REFERENCED':
message = 'This record is being referenced by other records.';
break;
// postgres errors
case '23505':
message = 'This record already exists.';
break;
case '42601':
message = 'There was a syntax error in your SQL query.';
break;
case '23502':
message = 'A value is required for this field.';
break;
case '23503':
message = 'The referenced row does not exist.';
break;
case '23514':
message = 'A null value is not allowed for this field.';
break;
case '22001':
message = 'The data entered is too long for this field.';
break;
case '28000':
message = 'You do not have permission to perform this action.';
break;
case '40P01':
message = 'A timeout occurred while waiting for a table lock.';
break;
case '23506':
message = 'This record is being referenced by other records.';
break;
case '42P07':
message = 'The table already exists.';
if (error.message) {
const extractTableNameMatch = error.message.match(
/ relation "?(\w+)"? already exists/i
);
if (extractTableNameMatch && extractTableNameMatch[1]) {
message = `The table '${extractTableNameMatch[1]}' already exists.`;
type = DBError.TABLE_EXIST;
extra = {
table: extractTableNameMatch[1],
};
}
}
break;
case '42701':
message = 'The column already exists.';
if (error.message) {
const extractTableNameMatch = error.message.match(
/ column "(\w+)" of relation "(\w+)" already exists/i
);
if (extractTableNameMatch && extractTableNameMatch[1]) {
message = `The column '${extractTableNameMatch[1]}' already exists.`;
type = DBError.COLUMN_EXIST;
extra = {
column: extractTableNameMatch[1],
};
}
}
break;
case '42P01':
message = 'The table does not exist.';
if (error.message) {
const extractTableNameMatch = error.message.match(
/ relation "(\w+)" does not exist/i
);
if (extractTableNameMatch && extractTableNameMatch[1]) {
message = `The table '${extractTableNameMatch[1]}' does not exist.`;
type = DBError.TABLE_NOT_EXIST;
extra = {
table: extractTableNameMatch[1],
};
}
}
break;
case '42703':
message = 'The column does not exist.';
if (error.message) {
const extractTableNameMatch = error.message.match(
/ column "(\w+)" does not exist/i
);
if (extractTableNameMatch && extractTableNameMatch[1]) {
message = `The column '${extractTableNameMatch[1]}' does not exist.`;
type = DBError.COLUMN_NOT_EXIST;
extra = {
column: extractTableNameMatch[1],
};
}
}
break;
// mssql errors
case 'EREQUEST':
message = 'There was a syntax error in your SQL query.';
if (error.message) {
const extractTableNameMatch = error.message.match(
/ There is already an object named '(\w+)' in the database/i
);
const extractDupColMatch = error.message.match(
/ Column name '(\w+)' in table '(\w+)' is specified more than once/i
);
const extractMissingTableMatch = error.message.match(
/ Invalid object name '(\w+)'./i
);
const extractMissingColMatch = error.message.match(
/ Invalid column name '(\w+)'./i
);
if (extractTableNameMatch && extractTableNameMatch[1]) {
message = `The table '${extractTableNameMatch[1]}' already exists.`;
type = DBError.TABLE_EXIST;
extra = {
table: extractTableNameMatch[1],
};
} else if (extractDupColMatch && extractDupColMatch[1]) {
message = `The column '${extractDupColMatch[1]}' already exists.`;
type = DBError.COLUMN_EXIST;
extra = {
column: extractDupColMatch[1],
};
} else if (extractMissingTableMatch && extractMissingTableMatch[1]) {
message = `The table '${extractMissingTableMatch[1]}' does not exist`;
type = DBError.TABLE_NOT_EXIST;
extra = {
table: extractMissingTableMatch[1],
};
} else if (extractMissingColMatch && extractMissingColMatch[1]) {
message = `The column '${extractMissingColMatch[1]}' does not exist`;
type = DBError.COLUMN_NOT_EXIST;
extra = {
column: extractMissingColMatch[1],
};
}
}
break;
case 'ELOGIN':
message = 'You do not have permission to perform this action.';
break;
case 'ETIMEOUT':
message = 'A timeout occurred while waiting for a table lock.';
break;
case 'ECONNRESET':
message = 'The connection was reset.';
break;
case 'ECONNREFUSED':
message = 'The connection was refused.';
break;
case 'EHOSTUNREACH':
message = 'The host is unreachable.';
break;
case 'EHOSTDOWN':
message = 'The host is down.';
break;
}
if (message) {
return {
message,
type,
extra,
info: { message: error.message, code: error.code },
};
}
}
export default function ( export default function (
requestHandler: (req: any, res: any, next?: any) => any requestHandler: (req: any, res: any, next?: any) => any
) { ) {
@ -8,6 +376,12 @@ export default function (
// todo: error log // todo: error log
console.log(requestHandler.name ? `${requestHandler.name} ::` : '', e); console.log(requestHandler.name ? `${requestHandler.name} ::` : '', e);
const dbError = extractDBError(e);
if (dbError) {
return res.status(400).json(dbError);
}
if (e instanceof BadRequest) { if (e instanceof BadRequest) {
return res.status(400).json({ msg: e.message }); return res.status(400).json({ msg: e.message });
} else if (e instanceof Unauthorized) { } else if (e instanceof Unauthorized) {
@ -27,28 +401,38 @@ export default function (
} }
class BadRequest extends Error {} class BadRequest extends Error {}
class Unauthorized extends Error {} class Unauthorized extends Error {}
class Forbidden extends Error {} class Forbidden extends Error {}
class NotFound extends Error {} class NotFound extends Error {}
class InternalServerError extends Error {} class InternalServerError extends Error {}
class NotImplemented extends Error {} class NotImplemented extends Error {}
export class NcError { export class NcError {
static notFound(message = 'Not found') { static notFound(message = 'Not found') {
throw new NotFound(message); throw new NotFound(message);
} }
static badRequest(message) { static badRequest(message) {
throw new BadRequest(message); throw new BadRequest(message);
} }
static unauthorized(message) { static unauthorized(message) {
throw new Unauthorized(message); throw new Unauthorized(message);
} }
static forbidden(message) { static forbidden(message) {
throw new Forbidden(message); throw new Forbidden(message);
} }
static internalServerError(message = 'Internal server error') { static internalServerError(message = 'Internal server error') {
throw new InternalServerError(message); throw new InternalServerError(message);
} }
static notImplemented(message = 'Not implemented') { static notImplemented(message = 'Not implemented') {
throw new NotImplemented(message); throw new NotImplemented(message);
} }

6
packages/nocodb/src/lib/models/Base.ts

@ -7,7 +7,7 @@ import {
MetaTable, MetaTable,
} from '../utils/globals'; } from '../utils/globals';
import Model from './Model'; import Model from './Model';
import { BaseType, UITypes } from 'nocodb-sdk'; import { BaseType, BoolType, UITypes } from 'nocodb-sdk';
import NocoCache from '../cache/NocoCache'; import NocoCache from '../cache/NocoCache';
import CryptoJS from 'crypto-js'; import CryptoJS from 'crypto-js';
import { extractProps } from '../meta/helpers/extractProps'; import { extractProps } from '../meta/helpers/extractProps';
@ -20,14 +20,14 @@ export default class Base implements BaseType {
project_id?: string; project_id?: string;
alias?: string; alias?: string;
type?: string; type?: string;
is_meta?: boolean; is_meta?: BoolType;
config?: any; config?: any;
created_at?: any; created_at?: any;
updated_at?: any; updated_at?: any;
inflection_column?: string; inflection_column?: string;
inflection_table?: string; inflection_table?: string;
order?: number; order?: number;
enabled?: boolean; enabled?: BoolType;
constructor(base: Partial<Base>) { constructor(base: Partial<Base>) {
Object.assign(this, base); Object.assign(this, base);

4
packages/nocodb/src/lib/models/Filter.ts

@ -9,7 +9,7 @@ import {
MetaTable, MetaTable,
} from '../utils/globals'; } from '../utils/globals';
import View from './View'; import View from './View';
import { FilterType, UITypes } from 'nocodb-sdk'; import { BoolType, FilterType, UITypes } from 'nocodb-sdk';
import NocoCache from '../cache/NocoCache'; import NocoCache from '../cache/NocoCache';
import { NcError } from '../meta/helpers/catchError'; import { NcError } from '../meta/helpers/catchError';
import { extractProps } from '../meta/helpers/extractProps'; import { extractProps } from '../meta/helpers/extractProps';
@ -78,7 +78,7 @@ export default class Filter {
value?: string; value?: string;
logical_op?: string; logical_op?: string;
is_group?: boolean; is_group?: BoolType;
children?: Filter[]; children?: Filter[];
project_id?: string; project_id?: string;
base_id?: string; base_id?: string;

3
packages/nocodb/src/lib/models/LinkToAnotherRecordColumn.ts

@ -1,3 +1,4 @@
import { BoolType } from 'nocodb-sdk';
import Noco from '../Noco'; import Noco from '../Noco';
import Column from './Column'; import Column from './Column';
import Model from './Model'; import Model from './Model';
@ -19,7 +20,7 @@ export default class LinkToAnotherRecordColumn {
fk_index_name?: string; fk_index_name?: string;
type: 'hm' | 'bt' | 'mm'; type: 'hm' | 'bt' | 'mm';
virtual = false; virtual: BoolType = false;
mmModel?: Model; mmModel?: Model;
relatedTable?: Model; relatedTable?: Model;

1
packages/nocodb/src/lib/models/MapView.ts

@ -93,7 +93,6 @@ export default class MapView implements MapType {
await View.updateColumn(body.fk_view_id, mapViewMappedByColumn.id, { await View.updateColumn(body.fk_view_id, mapViewMappedByColumn.id, {
show: true, show: true,
}); });
} }
// update meta // update meta

15
packages/nocodb/src/lib/models/Model.ts

@ -7,6 +7,7 @@ import { BaseModelSqlv2 } from '../db/sql-data-mapper/lib/sql/BaseModelSqlv2';
import { import {
isVirtualCol, isVirtualCol,
ModelTypes, ModelTypes,
BoolType,
TableReqType, TableReqType,
TableType, TableType,
UITypes, UITypes,
@ -25,17 +26,17 @@ import { sanitize } from '../db/sql-data-mapper/lib/sql/helpers/sanitize';
import { extractProps } from '../meta/helpers/extractProps'; import { extractProps } from '../meta/helpers/extractProps';
export default class Model implements TableType { export default class Model implements TableType {
copy_enabled: boolean; copy_enabled: BoolType;
created_at: Date | number | string; created_at: Date | number | string;
base_id: 'db' | string; base_id: 'db' | string;
deleted: boolean; deleted: BoolType;
enabled: boolean; enabled: BoolType;
export_enabled: boolean; export_enabled: BoolType;
id: string; id: string;
order: number; order: number;
parent_id: string; parent_id: string;
password: string; password: string;
pin: boolean; pin: BoolType;
project_id: string; project_id: string;
schema: any; schema: any;
show_all_fields: boolean; show_all_fields: boolean;
@ -46,7 +47,7 @@ export default class Model implements TableType {
table_name: string; table_name: string;
title: string; title: string;
mm: boolean; mm: BoolType;
uuid: string; uuid: string;
@ -98,7 +99,7 @@ export default class Model implements TableType {
projectId, projectId,
baseId, baseId,
model: Partial<TableReqType> & { model: Partial<TableReqType> & {
mm?: boolean; mm?: BoolType;
created_at?: any; created_at?: any;
updated_at?: any; updated_at?: any;
}, },

6
packages/nocodb/src/lib/models/Project.ts

@ -1,6 +1,6 @@
import Base from './/Base'; import Base from './/Base';
import Noco from '../Noco'; import Noco from '../Noco';
import { ProjectType } from 'nocodb-sdk'; import { BoolType, MetaType, ProjectType } from 'nocodb-sdk';
import { import {
CacheDelDirection, CacheDelDirection,
CacheGetType, CacheGetType,
@ -16,9 +16,9 @@ export default class Project implements ProjectType {
public prefix: string; public prefix: string;
public status: string; public status: string;
public description: string; public description: string;
public meta: string; public meta: MetaType;
public color: string; public color: string;
public deleted: string; public deleted: BoolType;
public order: number; public order: number;
public is_meta = false; public is_meta = false;
public bases?: Base[]; public bases?: Base[];

1
packages/nocodb/src/lib/utils/globals.ts

@ -42,7 +42,6 @@ export enum MetaTable {
MAP_VIEW = 'nc_map_view_v2', MAP_VIEW = 'nc_map_view_v2',
MAP_VIEW_COLUMNS = 'nc_map_view_columns_v2', MAP_VIEW_COLUMNS = 'nc_map_view_columns_v2',
STORE = 'nc_store', STORE = 'nc_store',
} }
export const orderedMetaTables = [ export const orderedMetaTables = [

1228
scripts/sdk/swagger.json → packages/nocodb/src/schema/swagger.json

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save