Import corteza-locale as golang pkg and allow hybrid lang importing

This commit is contained in:
Denis Arh
2021-09-02 14:42:51 +02:00
parent 25b573000b
commit a9914a5626
126 changed files with 4126 additions and 72 deletions
+5
View File
@@ -2,6 +2,10 @@ module github.com/cortezaproject/corteza-server
go 1.16
// This is useful when testing changes on corteza-locale
// and you do not want to push on every change in the locale repo
// replace github.com/cortezaproject/corteza-locale => ../locale
require (
github.com/766b/chi-prometheus v0.0.0-20180509160047-46ac2b31aa30
github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d
@@ -14,6 +18,7 @@ require (
github.com/SentimensRG/ctx v0.0.0-20180729130232-0bfd988c655d
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d
github.com/brianvoe/gofakeit/v6 v6.5.0
github.com/cortezaproject/corteza-locale v0.0.0-20210902094343-6e40ca3a7d14
github.com/crewjam/saml v0.4.5
github.com/crusttech/go-oidc v0.0.0-20180918092017-982855dad3e1
github.com/davecgh/go-spew v1.1.1
+2
View File
@@ -88,6 +88,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cortezaproject/corteza-locale v0.0.0-20210902094343-6e40ca3a7d14 h1:QMaq2KCK3t0PDwJ6i9tBfxihbUhUMB6/4UatwEAhKhg=
github.com/cortezaproject/corteza-locale v0.0.0-20210902094343-6e40ca3a7d14/go.mod h1:wsI1UftEdBqTuEDKBZmx2LfNu/kZun5pRbCAi420JCg=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/crewjam/httperr v0.0.0-20190612203328-a946449404da h1:WXnT88cFG2davqSFqvaFfzkSMC0lqh/8/rKZ+z7tYvI=
github.com/crewjam/httperr v0.0.0-20190612203328-a946449404da/go.mod h1:+rmNIXRvYMqLQeR4DHyTvs6y0MEMymTz4vyFpFkKTPs=
+53 -53
View File
@@ -6,7 +6,6 @@ import (
"fmt"
"io"
"io/fs"
"os"
"path"
"path/filepath"
"strings"
@@ -17,58 +16,61 @@ import (
const serverApplication = "corteza-server"
var defaultLanguage = language.English
var (
defaultLanguage = language.English
)
// Load all configs that are reachable in the given paths
func loadConfigs(pp ...string) (ll []*Language, err error) {
func loadConfigs(fsys fs.FS) (ll []*Language, err error) {
var (
pattern string
f *os.File
configs []string
sub fs.FS
lang *Language
configs = make([]string, 0)
)
// @todo reads language files from all paths
for _, p := range pp {
pattern = filepath.Join(p, "*", "config.yaml")
configs, err = filepath.Glob(pattern)
if err != nil {
return nil, fmt.Errorf("%s glob failed under: %v", pattern, err)
configs, err = fs.Glob(fsys, "*/config.yaml")
if err != nil {
return nil, err
}
for _, config := range configs {
if sub, err = fs.Sub(fsys, filepath.Dir(config)); err != nil {
return nil, err
}
for _, c := range configs {
tag := language.Make(filepath.Base(filepath.Dir(c)))
lang := &Language{
Tag: tag,
src: filepath.Dir(c),
}
err = func() error {
f, err = os.Open(c)
if err != nil {
return fmt.Errorf("could not read %s: %v", p, err)
}
defer f.Close()
if err = yaml.NewDecoder(f).Decode(&lang); err != nil {
return fmt.Errorf("could not decode %s: %v", p, err)
}
return nil
}()
if err != nil {
return nil, err
}
ll = append(ll, lang)
if lang, err = loadConfig(sub, filepath.Base(config)); err != nil {
return nil, err
}
lang.Tag = language.Make(filepath.Base(filepath.Dir(config)))
lang.src = filepath.Dir(config)
ll = append(ll, lang)
}
return ll, nil
}
func loadConfig(fsys fs.FS, p string) (lang *Language, err error) {
var f fs.File
lang = &Language{
Tag: language.Make(filepath.Base(filepath.Dir(p))),
fs: fsys,
}
f, err = fsys.Open(p)
if err != nil {
return nil, fmt.Errorf("could not read %s: %v", p, err)
}
defer f.Close()
if err = yaml.NewDecoder(f).Decode(&lang); err != nil {
return nil, fmt.Errorf("could not decode %s: %v", p, err)
}
return
}
func loadTranslations(lang *Language, dir string) (err error) {
func loadTranslations(lang *Language) (err error) {
lang.internal = make(internal)
lang.external = make(external)
@@ -78,15 +80,14 @@ func loadTranslations(lang *Language, dir string) (err error) {
auxExternal = make(map[string]map[string]map[string]interface{})
)
err = filepath.Walk(dir, func(p string, finfo fs.FileInfo, err error) error {
if err != nil || finfo.IsDir() {
err = fs.WalkDir(lang.fs, ".", func(p string, entry fs.DirEntry, err error) error {
if err != nil || entry.IsDir() {
return err
}
var (
f *os.File
relPath = p[len(dir)+1:]
firstSep = strings.Index(relPath, string(filepath.Separator))
f fs.File
firstSep = strings.Index(p, string(filepath.Separator))
)
if firstSep == -1 {
@@ -100,9 +101,9 @@ func loadTranslations(lang *Language, dir string) (err error) {
namespace string
keyPath string
ext = path.Ext(relPath)
appDir = relPath[:strings.Index(relPath, string(filepath.Separator))]
subpath = relPath[len(appDir)+1:]
ext = path.Ext(p)
appDir = p[:firstSep]
subpath = p[len(appDir)+1:]
nsDirIndex = strings.Index(subpath, string(filepath.Separator))
nsDotIndex = strings.LastIndex(subpath, ".")
@@ -130,8 +131,7 @@ func loadTranslations(lang *Language, dir string) (err error) {
namespace = subpath[:nsDotIndex]
}
f, err = os.Open(p)
if err != nil {
if f, err = lang.fs.Open(p); err != nil {
return fmt.Errorf("could not open %s: %w", p, err)
}
@@ -143,7 +143,7 @@ func loadTranslations(lang *Language, dir string) (err error) {
}
if err = procInternal(lang.internal[namespace], keyPath, f); err != nil {
return fmt.Errorf("could not process %s: %v", relPath, err)
return fmt.Errorf("could not process %s: %v", p, err)
}
} else {
if isJSON {
@@ -166,7 +166,7 @@ func loadTranslations(lang *Language, dir string) (err error) {
}
if err = procExternal(auxExternal[appDir][namespace], keyPath, f); err != nil {
return fmt.Errorf("could not process %s: %v", relPath, err)
return fmt.Errorf("could not process %s: %v", p, err)
}
}
}
+8
View File
@@ -3,6 +3,7 @@ package locale
import (
"fmt"
"io"
"io/fs"
"strings"
"sync"
@@ -23,8 +24,15 @@ type (
l sync.RWMutex
// location of the language files
// this is mainly for logging/debugging purposes
//
// This value is empty when loading
// embedded languages
src string
// pointer to the place we loaded files from
fs fs.FS
Tag language.Tag
Name string
+68 -18
View File
@@ -4,9 +4,11 @@ import (
"context"
"fmt"
"io"
"os"
"strings"
"sync"
locale "github.com/cortezaproject/corteza-locale"
"github.com/cortezaproject/corteza-server/pkg/options"
"go.uber.org/zap"
"golang.org/x/text/language"
@@ -86,9 +88,17 @@ func (svc *service) Tags() (tt []language.Tag) {
return
}
// Reload all language configurations (as configured via path options) and
// all translation files
func (svc *service) Reload() error {
// Reload all embedded (via github.com/cortezaproject/corteza-locale package)
// and imported (from one or more paths found in LOCALE_PATH) translations
func (svc *service) Reload() (err error) {
var (
i int
lang *Language
ll, aux []*Language
logFields = make([]zap.Field, 0)
)
svc.l.RLock()
defer svc.l.RUnlock()
@@ -98,42 +108,82 @@ func (svc *service) Reload() error {
)
svc.set = make(map[language.Tag]*Language)
configs, err := loadConfigs(svc.src...)
if err != nil {
return err
// load embedded locales from the corteza-locale package
if ll, err = loadConfigs(locale.Languages()); err != nil {
return fmt.Errorf("could not load embedded locales: %w", err)
} else {
// cleanup src and effectively mark the
// loaded languages as embedded
for _, l := range ll {
l.src = ""
}
}
for i, lang := range configs {
// load imported locales from the configured (LOCALE_PATH) paths
for _, p := range svc.src {
aux, err = loadConfigs(os.DirFS(p))
if err != nil {
return fmt.Errorf("could not load imported locales: %w", err)
}
for _, l := range aux {
l.src = p + "/" + l.src
}
ll = append(ll, aux...)
}
for i, lang = range ll {
logFields = []zap.Field{
zap.Stringer("tag", lang.Tag),
}
if !hasTag(lang.Tag, svc.tags) {
svc.log.Info(
"language skipped (see LOCALE_LANGUAGES and LOCALE_PATH)",
svc.log.Debug(
"language skipped (not in LOCALE_LANGUAGES)",
zap.Stringer("tag", lang.Tag),
)
continue
}
if err = loadTranslations(lang, lang.src); err != nil {
return err
if !lang.Extends.IsRoot() {
logFields = append(logFields, zap.Stringer("extends", lang.Extends))
}
svc.log.Info(
"language loaded",
zap.Stringer("tag", lang.Tag),
zap.String("src", lang.src),
zap.Stringer("extends", lang.Extends),
)
if lang.src != "" {
logFields = append(logFields, zap.String("imported", lang.src))
} else {
logFields = append(logFields, zap.Bool("embedded", true))
}
if err = loadTranslations(lang); err != nil {
return err
}
if i == 0 && svc.def == nil {
// set first one as default
svc.def = lang
}
if svc.set[lang.Tag] != nil {
svc.log.Info(
"language overloaded",
logFields...,
)
} else {
svc.log.Info(
"language loaded",
logFields...,
)
}
svc.set[lang.Tag] = lang
}
// Do another pass and link all extended languages
for _, lang := range svc.set {
for _, lang = range svc.set {
if lang.Extends.IsRoot() {
continue
}
+1 -1
View File
@@ -25,4 +25,4 @@ props:
type: bool
description: |-
When enabled, Corteza reloads language files on every request
Enable this for debugging or developing
Enable this for debugging or developing.
@@ -0,0 +1,19 @@
/.idea
/coverage.txt
/*.iml
/.env*
/.dev*
/.*cover.out*
/overalls*
profile.coverprofile
/public_html
/build
/var
/TODO
/gin-bin
/.vscode
/federation/etc/.env*
# https://github.com/nektos/act
/.act*
/workflow
+75
View File
@@ -0,0 +1,75 @@
# Contributing
Thank you for helping us make [our vision](https://cortezaproject.org/about/what-is-corteza/) a reality!
All contributions are welcome; from bug reports, codefixes, and new features!
## Ground Rules
Corteza projects are [Apache 2.0 licensed](LICENSE) and accept contributions via GitHub pull requests.
Cover the [terminology](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/release-cycle/index.html#_terminology) for the development process and versioning.
Cover the [Git and GitHub](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/release-cycle/index.html#_github) ground rules regarding branch naming and conventions.
When you wish to start working on a code contribution, assign yourself to a GitHub issue.
If there is no issue, create one beforehand.
A quick summary on [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/):
1. Separate subject from body with a blank line
2. Limit the subject line to 50 characters
3. Capitalize the subject line
4. Do not end the subject line with a period
5. Use the imperative mood in the subject line
6. Wrap the body at 72 characters
7. Use the body to explain what and why vs. how
## Core repositories
### Corteza Server
Corteza server is the back-end of the Corteza ecosystem.
The core logic is written in GO, using [go-chi](https://pkg.go.dev/github.com/go-chi/chi@v3.3.4+incompatible?utm_source=gopls) for the routing.
Communication between the Corteza server and web applications is done using the REST API and web sockets.
Communication between back-end services (Corteza server and Corredor) is done using gRPC.
The [Developer Guide/Corteza Server](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/corteza-server/index.html) covers the [development setup](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/corteza-server/index.html#_development_setup), the [project structure](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/corteza-server/structure.html), and the feature insight documents.
### Corteza Web Applications
The web applications are written in Vue.js and provide the user interface to interact with the entire system.
The repositories:
1. [corteza-webapp-one](https://github.com/cortezaproject/corteza-webapp-one)
2. [corteza-webapp-admin](https://github.com/cortezaproject/corteza-webapp-admin)
3. [corteza-webapp-compose](https://github.com/cortezaproject/corteza-webapp-compose)
4. [corteza-webapp-workflow](https://github.com/cortezaproject/corteza-webapp-workflow)
Communication between the Corteza server and web applications is done using the REST API and web sockets.
The [Developer Guide/Corteza Web Applications](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/web-applications/index.html) covers the [development setup](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/web-applications/index.html#_development_setup), the [project structure](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/web-applications/structure.html), and the feature insight documents.
### Documentation
The documentation is written in [AsciiDoc](https://asciidoc.org/) and compiled using [Antora](https://antora.org/).
The source code is available on the [GitHub cortezaproject/corteza-docs repository](https://github.com/cortezaproject/corteza-docs); the generated output is available on the [documentation page](http://docs.cortezaproject.org/).
The [Developer Guide/Documentation](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/documentation/index.html) covers the [conventions](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/documentation/index.html#_conventions), [writing guidelines](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/documentation/index.html#documentation-writing-guidelines), as well as some [examples](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/documentation/examples/index.html) to help you get started.
## Bug reporting
Please submit any bug reports on the **issues** section of the corresponding GitHub repository.
If you are unsure where to submit the issue, or you are unsure if this is a feature; reach out to us on [our forum](https://forum.cortezaproject.org/).
## Feature requests
Feature and improvement requests should be submitted on [our forum](https://forum.cortezaproject.org/).
Before opening a new topic, search around to see if there are any similar topics that would cover your case.
## DCO
By contributing to this project you agree to the Developer Certificate of Origin (DCO).
This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.
See the [DCO](DCO) file for details.
+36
View File
@@ -0,0 +1,36 @@
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
660 York Street, Suite 102,
San Francisco, CA 94110 USA
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
+73
View File
@@ -0,0 +1,73 @@
# Guide for frontend and backend developers
This guide is for corteza frontend and backend developers.
It shows how to connect translations from corteza-locale repository to frontend web applications and backend server.
## Prerequisites
Clone corteza-locale repository to a separate folder.
## Fronted developers
### Using corteza-server Docker container to support webapp development
#### Configuration with Docker Compose
See the `docker-compose.yaml` in the root of the repository.
1. Run it by executing (inside cloned `corteza-locale` repository):
```shell
docker-compose up -d
```
2. Fix `config.js` in the web application to point to the server
```js
window.CortezaAPI = `//localhost:1818/api`
```
#### Verify the loaded languages
```shell
docker-compose logs | grep locale | head
```
This will show you first couple (head) filtered (grep) log lines.
If some of them contain "language loaded" that reflect the setup in your `corteza-locale/src` you have successfully loaded translations into Corteza server.
#### Verify by loading translations
```shell
curl 'http://localhost:1818/api/system/locale/en/corteza-webapp-admin' -H "Accept: application/json" -H 'Accept-Language: en'
```
## Backend developers
Corteza server loads, parses and serves all languages files for all frontend web applications and server.
### Changes in configuration
The following chapter assumes your Corteza server development env is already set-up
Add `LOCALE_PATH` and `LOCALE_LOG` to your .env file
```dotenv
LOCALE_PATH=../corteza-locale/src
LOCALE_LOG=true
```
Path can be absolute or relative and should contain subdirectories with languages.
You can remove or comment-out LOCALE_LOG if you find the setting to verbose.
#### Verify the loaded languages
When you (re)start your corteza server yu should see the following log among the first logged lines:
```
20:24:42.881 INFO locale locale/locale.go:81 reloading {"src": ["../corteza-locale/src"]}
20:24:42.899 INFO locale locale/load.go:66 language loaded {"tag": "en", "config": "../corteza-locale/src/en/config.yaml"}
```
You will see additional log lines for every language loaded.
+202
View File
@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+98
View File
@@ -0,0 +1,98 @@
<h1 align="center">
<img width="300px" src=".github/assets/corteza_logo.svg" />
<br />
<p>Corteza translations and locales</p>
<div align="center">
[![DockerHub Downloads Card](https://img.shields.io/docker/pulls/cortezaproject/corteza-server)](https://img.shields.io/docker/pulls/cortezaproject/corteza-server)
[![Latest Version Card](https://img.shields.io/github/v/tag/cortezaproject/corteza-server?label=stable%20version)](https://img.shields.io/github/v/tag/cortezaproject/corteza-server?label=stable%20version)
[![License Card](https://img.shields.io/github/license/cortezaproject/corteza-server)](https://img.shields.io/github/license/cortezaproject/corteza-server)
[![Go Report Card](https://goreportcard.com/badge/github.com/cortezaproject/corteza-server)](https://goreportcard.com/report/github.com/cortezaproject/corteza-server)
[![Build Status](https://drone.crust.tech/api/badges/cortezaproject/corteza/status.svg)](https://drone.crust.tech/cortezaproject/corteza)
[![CodeCov Report Card](https://img.shields.io/codecov/c/github/cortezaproject/corteza-server)](https://img.shields.io/codecov/c/github/cortezaproject/corteza-server)
</div>
</h1>
**Corteza Locale** provides the centralized repository for all corteza translations.
These files are automatically pulled and bundled into corteza-server when it is built.
Please follow the [developer's guide](DEV.md) to configure in your local development environment with translations.
## What is Corteza?
<div align="center">
<img style="max-height: 350px;" src=".github/assets/corteza_dashboard.png" />
</div>
Corteza is the only **100% free**, **open-source**, **standardized** and **enterprise-grade** Low-code platform.
It is developed entirely in the public domain and maintained by [Crust Technology](https://www.crust.tech/), its founder.
With Corteza, you can quickly **build scalable cloud applications** that are **integrable** with external services and **accessible (WCAG 2.1)**.
### Core features:
* quick setup,
* flexible and intuitive low-code configuration,
* powerful automation system using workflows and automation scripts,
* flexible reporting capabilities,
* secure RBAC access control system.
## Online demo
You can check out Corteza online by creating an account on our community instance https://latest.cortezaproject.org.
## Deploying Corteza
Refer to the [DevOps guide](https://docs.cortezaproject.org/corteza-docs/2021.6/devops-guide/index.html) for a complete guide on how to get Corteza up and running.
Additionally, we've provided some [video instructions](https://forum.cortezaproject.org/t/videos-on-how-to-set-up-corteza/91).
Quick references:
* [data backup and restore](https://docs.cortezaproject.org/corteza-docs/2021.6/devops-guide/maintenance/backups.html)
* [troubleshooting](https://docs.cortezaproject.org/corteza-docs/2021.6/devops-guide/maintenance/troubleshooting.html)
* [setting up an email relay](https://docs.cortezaproject.org/corteza-docs/2021.6/devops-guide/extension-requirements/email-relay.html)
* [setting up sink routes](https://docs.cortezaproject.org/corteza-docs/2021.6/devops-guide/extension-requirements/sink-route.html)
## Upgrading Corteza
[![Latest Version Card](https://img.shields.io/github/v/tag/cortezaproject/corteza-server?label=latest%20stable%20version)](https://img.shields.io/github/v/tag/cortezaproject/corteza-server?label=latest%20stable%20version)
Refer to the [changelog](https://docs.cortezaproject.org/corteza-docs/2021.6/changelog/index.html) and the [upgrade guide](https://docs.cortezaproject.org/corteza-docs/2021.6/upgrade-guide/index.html) to upgrade your Corteza instance.
## Using Corteza
Refer to the [End-User Guide](https://docs.cortezaproject.org/corteza-docs/2021.6/end-user-guide/index.html) to learn the built-in applications and features from the end-user perspective.
Quick references:
* [Corteza CRM](https://docs.cortezaproject.org/corteza-docs/2021.6/end-user-guide/crm/index.html)
* [Corteza Service Solution](https://docs.cortezaproject.org/corteza-docs/2021.6/end-user-guide/service-solution/index.html)
## Create with Corteza
Refer to the [Integrator Guide](https://docs.cortezaproject.org/corteza-docs/2021.6/integrator-guide/index.html) to learn how you can build on the core features to create virtually anything.
Quick references:
* [Corteza Compose configuration](https://docs.cortezaproject.org/corteza-docs/2021.6/integrator-guide/compose-configuration/index.html)
* automation using [workflows](https://docs.cortezaproject.org/corteza-docs/2021.6/integrator-guide/workflows/index.html) and [automation scripts](https://docs.cortezaproject.org/corteza-docs/2021.6/integrator-guide/automation-scripts/index.html)
* [using the REST API](https://docs.cortezaproject.org/corteza-docs/2021.6/integrator-guide/accessing-corteza/index.html),
## Contributing
Refer to the [Developer Guide/Corteza Server](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/corteza-server/index.html) document for details regarding the [development setup](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/corteza-server/index.html#_development_setup), the [project structure](https://docs.cortezaproject.org/corteza-docs/2021.6/developer-guide/corteza-server/structure.html), and the feature insight documents.
Refer to the [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines and code of conduct.
## Community
Reach out to us on [our forum](https://forum.cortezaproject.org/).
## License
Corteza is released under the Apache-2.0 license.
Refer to the [LICENSE](LICENSE) file for additional information.
+40
View File
@@ -0,0 +1,40 @@
version: '3.5'
# This is a working sample docker compose configuration file
# that should speed-up your migration to new centralized i18n setup
services:
server:
# image tag (i18n-dev-temp) is temporary and will change in the future!
image: cortezaproject/corteza-server:i18n-dev-temp
restart: on-failure
depends_on: [ db ]
ports: [ "127.0.0.1:1818:80" ]
environment:
HTTP_WEBAPP_ENABLED: 'true'
DOMAIN: localhost:1818
DB_DSN: mysql://dbuser:dbpass@tcp(db:3306)/corteza_i18n?collation=utf8mb4_general_ci
# The two important settings (for i18n dev)
LOCALE_PATH: /corteza-locale/src
LOCALE_LOG: 'true'
volumes:
- .:/corteza-locale:ro
db:
# MySQL Database
# See https://hub.docker.com/r/percona/percona-server for details
image: percona:8.0
restart: on-failure
environment:
# To be picked up by percona image when creating the database
# Must match with DB_DSN settings inside .env
#
# Warning: these are values that are only used on 1st start
# if you want to change it later, you need to do that
# manually inside db container
MYSQL_DATABASE: corteza_i18n
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
MYSQL_ROOT_PASSWORD: dbpass
healthcheck: { test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"], timeout: 20s, retries: 10 }
+3
View File
@@ -0,0 +1,3 @@
module github.com/cortezaproject/corteza-locale
go 1.16
+20
View File
@@ -0,0 +1,20 @@
package locale
///////////////////////////////////////////////////////////////////////////////
// This helps us import translations into corteza-server as a module
// dependency
import (
"embed"
"io/fs"
)
//go:embed src/*
var languages embed.FS
// Languages returns embedded translation files
// as a virtual filesystem
func Languages() fs.FS {
sub, _ := fs.Sub(languages, "src")
return sub
}
+14
View File
@@ -0,0 +1,14 @@
name: English
#extends: base
# Language defaults, can be overwritten in the configuration
#formats:
# datetime:
# full: 'YYYY-MM-DD hh:mm:ss'
# short: 'YYYY-MM-DD'
# time: 'hh:mm'
#
# currency: '$'
@@ -0,0 +1,11 @@
template:
title: Authorized clients
list:
authorized-on: Authorized on
buttons:
revoke: Revoke access
empty: No authorized clients found
alerts:
removed: Client authorization removed
@@ -0,0 +1,19 @@
template:
title: Change your password
form:
email:
label: E-mail *
placeholder: email@domain.ltd
aria-label: Email
old-password:
label: Old password *
placeholder: Enter your old password
aria-label: Old password
new-password:
label: New password *
placeholder: Enter your new password
aria-label: New password
button:
change-password: Change your password
alerts:
passw-changed: Password successfully changed.
@@ -0,0 +1,2 @@
template:
title: Internal error
@@ -0,0 +1 @@
version: version {{version}}
@@ -0,0 +1,2 @@
logged-in-as: You're logged-in as
logout: logout
@@ -0,0 +1,7 @@
template:
authorize-client: Finalize the authorization of
class:
your-profile: Your profile
security: Security
login-session: Login sessions
authorized-clients: Authorized clients
@@ -0,0 +1,22 @@
template:
title: Log in
form:
email:
label: E-mail
placeholder: email@domain.ltd
password:
label: Password
placeholder: password
button:
login-and-remember: Log in and remember me
login: Log in
continue: Continue
links:
request-password-reset: Forgot your password?
signup: Create a new account
external:
login-with: Login with {{idp}}
alerts:
logged-in: You are now logged-in.
local-disabled: Local accounts disabled
@@ -0,0 +1,3 @@
template:
log-out: Logout successful.
log-in: Click here to <a href="{{link}}">log in</a>.
@@ -0,0 +1,5 @@
template:
title: Disable two-factor authentication with TOTP
instructions: Disable by entering existing code.
button:
remove: Remove
@@ -0,0 +1,26 @@
template:
title: Configure two-factor authentication with TOTP
enforced: |
TOTP multi factor authentication is enforced by Corteza administrator.
Please configure it right away.
instructions: |
Corteza uses time based one time passwords (TOTP) as one of the underlying technologies for two-factor authentication. Use one of the applications listed below and type in the secret or scan the QR code.
<br />
<br />
This will enable additional security for your account.
<br />
<br />
You can use one of the following applications:
lastpass: <a target="_blank" href="{{ link }}">LastPass Authenticator</a>
gauth: Google Authenticator for <a target="_blank" href="{{ android }}">Android</a> or <a target="_blank" href="{{ iphone }}">iPhone</a>
authy: <a target="_blank" href="{{ link }}">Authy</a>
form:
title: "Complete the configuration by entering code from the authenticator application:"
button: Submit
alerts:
text-2FA-enabled: Two factor authentication with TOTP enabled
text-2FA-disabled: Two factor authentication with TOTP disabled
@@ -0,0 +1,22 @@
template:
title: Multi-factor authentication
email:
instructions: Check your inbox and enter the received code
code: Code
verify: Verify
resend: Resend
confirmed: Email OTP confirmed
totp:
instructions: Check your TOTP application and enter the code you received
code: Code
confirmed: TOTP confirmed
verify: Verify
alerts:
email:
resent: Email OTP resent
topt:
valid: TOTP valid
@@ -0,0 +1,14 @@
template:
title: Authorize
form:
greeting-paragraph: Hello
question-for-client: would like to perform actions on this Corteza server on your behalf.
buttons:
allow: Allow
deny: Deny
links:
mistake: If this is a mistake, please <a href="{{link}}">log out</a>.
errors:
invalid-user: Cannot continue with unauthorized email, visit <a href="{{link}}">your profile</a> and resolve the issue.
alerts:
denied: cannot authorize {{client}}, no permissions.
@@ -0,0 +1,8 @@
template:
title: Password reset requested
instructions: If the email you entered is found in our database, you'll receive a password reset link to your inbox in a few moments.
links: <a href="{{signup}}">Create new account</a> or <a href="{{login}}">log in</a>.
alert:
inv-exp-passw-token: Invalid or expired password reset token, please repeat password reset request.
pass-reset-success: Password successfully reset.
pass-reset-disabled: Password reset disabled.
@@ -0,0 +1,4 @@
template:
title: Confirm your email
instructions: You should receive email confirmation link to your inbox in a few moments.
links: <a href="{{signup}}">Create new account</a> or <a href="{{login}}">log in</a>.
@@ -0,0 +1,18 @@
template:
title: Your profile
form:
email:
label: Email
placeholder: email@domain.ltd
resend-confirmation-link: Email is not verified, <a href="{{link}}?resend">resend confirmation link.</a>
name:
label: Full name
placeholder: Your full name
handle:
label: Handle
placeholder: Short name, nickname or handle
buttons:
submit: Update profile
alerts:
profile-updated: Profile successfully updated.
profile-update-fail: Could not update profile due to input errors
@@ -0,0 +1,9 @@
template:
title: Request password reset link
form:
email:
label: E-mail
placeholder: email@domain.ltd
buttons:
request: Request password reset link via email
links: <a href="{{signup}}">Create new account</a> or <a href="{{login}}">log in</a>.
@@ -0,0 +1,11 @@
template:
title: Reset your password
form:
email:
label: E-mail
placeholder: email@domain.ltd
new-password:
label: New password
placeholder: Set new password
buttons:
change-password: Change your password
@@ -0,0 +1,27 @@
template:
title: Security
password:
title: Password
change-link: Change your password
mfa:
title: Multi-factor authentication
totp:
title: Additional security with mobile app (time-based one-time-password)
enforced: Configured and required on login.
disabled: Currently disabled.
configure: Configure
disable: Disable
email:
title: Additional security with one-time-password over email
enforced: Enabled and required on login.
disabled: Currently disabled.
enable: Configure
disable: Disable
all-disabled: All MFA methods are currently disabled. Ask your administrator to enable them.
alerts:
topt-disabled: Two factor authentication with TOTP disabled
@@ -0,0 +1,20 @@
template:
title: Your session
list:
current: Current session
authorized-on: Authorized on
same-machine: This machine
ip-address: IP Address
same-browser: This browser
browser: Browser
expires: Expires
expired: Expired
today: Today
tomorrow: In 1 day
soon: In {{days}} days
delete: Delete this session
delete-all: Delete all sessions
@@ -0,0 +1,24 @@
template:
title: Sign up
form:
email:
label: E-mail *
placeholder: email@domain.ltd
password:
label: Password *
placeholder: Password
name:
label: Full name
placeholder: Your full name
nickname:
label: Short name, nickname or handle
placeholder: Short name, nickname or handle
button:
sign-up: Submit
log-in: Already have an account? <a href="{{link}}">Log in</a>
alerts:
signup-successful: Sign-up successful.
email-confirmed-logged-in: Email address confirmed, you're now logged-in.
inv-or-exp-token: Invalid or expired email confirmation token, please resend confirmation request.
signup-disabled: Signup disabled
@@ -0,0 +1,2 @@
errors:
notAllowedToSetPermissions: not allowed to set permissions
@@ -0,0 +1,8 @@
errors:
invalidID: invalid ID
notAllowedToDelete: not allowed to delete this session
notAllowedToManage: not allowed to manage session's workflow
notAllowedToRead: not allowed to read this session
notAllowedToSearch: not allowed to search or list sessions
notFound: session not found
staleData: stale data
@@ -0,0 +1,10 @@
errors:
invalidID: invalid ID
notAllowedToCreate: not allowed to create triggers
notAllowedToDelete: not allowed to delete this trigger
notAllowedToRead: not allowed to read this trigger
notAllowedToSearch: not allowed to search or list triggers
notAllowedToUndelete: not allowed to undelete this trigger
notAllowedToUpdate: not allowed to update this trigger
notFound: trigger not found
staleData: stale data
@@ -0,0 +1,16 @@
errors:
disabled: disabled workflow or trigger
handleNotUnique: workflow handle not unique
invalidHandle: invalid handle
invalidID: invalid ID
notAllowedToCreate: not allowed to create workflows
notAllowedToDelete: not allowed to delete this workflow
notAllowedToExecute: not allowed to execute this workflow
notAllowedToExecuteCorredorStep: not allowed to run corredorExec function, corredor is disabled
notAllowedToRead: not allowed to read this workflow
notAllowedToSearch: not allowed to search or list workflows
notAllowedToUndelete: not allowed to undelete this workflow
notAllowedToUpdate: not allowed to update this workflow
notFound: workflow not found
staleData: stale data
unknownWorkflowStep: unknown workflow step
@@ -0,0 +1,2 @@
errors:
notAllowedToSetPermissions: not allowed to set permissions
@@ -0,0 +1,26 @@
errors:
failedToExtractMimeType: could not extract mime type
failedToProcessImage: could not process image
failedToStoreFile: could not extract store file
invalidID: invalid ID
invalidModuleID: invalid module ID
invalidNamespaceID: invalid namespace ID
invalidPageID: invalid page ID
invalidRecordID: invalid record ID
moduleNotFound: module not found
namespaceNotFound: namespace not found
notAllowedToCreate: not allowed to create attachments
notAllowedToCreateEmptyAttachment: not allowed to create empty attachments
notAllowedToCreateRecords: not allowed to create records
notAllowedToListAttachments: not allowed to list attachments
notAllowedToRead: not allowed to read this module
notAllowedToReadNamespace: not allowed to read this namespace
notAllowedToReadPage: not allowed to read this page
notAllowedToReadRecord: not allowed to read this record
notAllowedToSearch: not allowed to search or list modules
notAllowedToUpdateNamespace: not allowed to update this namespace
notAllowedToUpdatePage: not allowed to update this page
notAllowedToUpdateRecord: not allowed to update this record
notFound: attachment not found
pageNotFound: page not found
recordNotFound: record not found
@@ -0,0 +1,16 @@
errors:
handleNotUnique: handle not unique
invalidHandle: invalid handle
invalidID: invalid ID
invalidNamespaceID: invalid or missing namespace ID
moduleNotFound: module does not exist
namespaceNotFound: namespace does not exist
notAllowedToCreate: not allowed to create charts
notAllowedToDelete: not allowed to delete this chart
notAllowedToRead: not allowed to read this chart
notAllowedToReadNamespace: not allowed to read this namespace
notAllowedToSearch: not allowed to search or list charts
notAllowedToUndelete: not allowed to undelete this chart
notAllowedToUpdate: not allowed to update this chart
notFound: chart does not exist
staleData: stale data
@@ -0,0 +1,17 @@
errors:
handleNotUnique: handle not unique
invalidHandle: invalid handle
invalidID: invalid ID
invalidNamespaceID: invalid or missing namespace ID
nameNotUnique: name not unique
namespaceNotFound: namespace does not exist
notAllowedToCreate: not allowed to create modules
notAllowedToDelete: not allowed to delete this module
notAllowedToListModules: not allowed to list modules
notAllowedToRead: not allowed to read this module
notAllowedToReadNamespace: not allowed to read this namespace
notAllowedToSearch: not allowed to search or list modules
notAllowedToUndelete: not allowed to undelete this module
notAllowedToUpdate: not allowed to update this module
notFound: module does not exist
staleData: stale data
@@ -0,0 +1,12 @@
errors:
handleNotUnique: handle not unique
invalidHandle: invalid handle
invalidID: invalid ID
notAllowedToCreate: not allowed to create namespaces
notAllowedToDelete: not allowed to delete this namespace
notAllowedToRead: not allowed to read this namespace
notAllowedToSearch: not allowed to search or list namespaces
notAllowedToUndelete: not allowed to undelete this namespace
notAllowedToUpdate: not allowed to update this namespace
notFound: namespace does not exist
staleData: stale data
@@ -0,0 +1,5 @@
errors:
failedToDownloadAttachment: 'could not download attachment from {attachmentURL}: {err}'
failedToLoadUser: could not load user for {recipient}
invalidReceipientFormat: invalid recipient format ({recipient})
noRecipients: cannot send email message without recipients
@@ -0,0 +1,17 @@
errors:
handleNotUnique: handle not unique
invalidHandle: invalid handle
invalidID: invalid ID
invalidNamespaceID: invalid or missing namespace ID
moduleNotFound: module does not exist
namespaceNotFound: namespace does not exist
notAllowedToCreate: not allowed to create pages
notAllowedToDelete: not allowed to delete this page
notAllowedToListPages: not allowed to list pages
notAllowedToRead: not allowed to read this page
notAllowedToReadNamespace: not allowed to read this namespace
notAllowedToSearch: not allowed to search or list pages
notAllowedToUndelete: not allowed to undelete this page
notAllowedToUpdate: not allowed to update this page
notFound: page does not exist
staleData: stale data
@@ -0,0 +1,24 @@
errors:
fieldNotFound: no such field {field}
importSessionAlreadActive: import session already active
invalidID: invalid ID
invalidModuleID: invalid or missing module ID
invalidNamespaceID: invalid or missing namespace ID
invalidReferenceFormat: invalid reference format
invalidValueStructure: more than one value for a single-value field {field}
moduleNotFoundModule: module not found
namespaceNotFound: namespace not found
notAllowedToChangeFieldValue: not allowed to change value of field {field}
notAllowedToCreate: not allowed to create records
notAllowedToDelete: not allowed to delete this record
notAllowedToListRecords: not allowed to list records
notAllowedToRead: not allowed to read this record
notAllowedToReadModule: not allowed to read module
notAllowedToReadNamespace: not allowed to read this namespace
notAllowedToSearch: not allowed to search or list records
notAllowedToUndelete: not allowed to undelete this record
notAllowedToUpdate: not allowed to update this record
notFound: record not found
staleData: stale data
unknownBulkOperation: unknown bulk operation {bulkOperation}
valueInput: invalid record value input
@@ -0,0 +1,2 @@
errors:
notAllowedToSetPermissions: not allowed to set permissions
@@ -0,0 +1,11 @@
errors:
composeModuleNotFound: compose module not found
composeNamespaceNotFound: compose namespace not found
invalidID: invalid ID
nodeNotFound: node does not exist
notAllowedToCreate: not allowed to create modules
notAllowedToManage: not allowed to manage this module
notFound: module does not exist
notUnique: node not unique
requestParametersInvalid: request parameters invalid
staleData: stale data
@@ -0,0 +1,8 @@
errors:
composeModuleNotFound: compose module not found
composeNamespaceNotFound: compose namespace not found
federationModuleNotFound: federation module not found
moduleMappingExists: module mapping already exists
nodeNotFound: node does not exist
notAllowedToMap: not allowed to map this module
notFound: module mapping does not exist
@@ -0,0 +1,10 @@
errors:
notAllowedToCreate: not allowed to create nodes
notAllowedToManage: not allowed to manage this node
notAllowedToPair: not allowed to pair this node
notAllowedToSearch: not allowed to search or list nodes
notFound: node does not exist
pairingTokenInvalid: pairing token invalid
pairingURIInvalid: 'pairing URI invalid: {err}'
pairingURISourceIDInvalid: pairing URI without source node ID
pairingURITokenInvalid: pairing URI with invalid pairing token
@@ -0,0 +1,3 @@
errors:
nodeNotFound: node does not exist
notFound: node_sync does not exist
@@ -0,0 +1,10 @@
errors:
federationSyncStructureChanged: module structure changed
invalidID: invalid ID
nodeNotFound: node does not exist
notAllowedToCreate: not allowed to create modules
notAllowedToManage: not allowed to manage this module
notAllowedToMap: not allowed to map this module
notFound: module does not exist
notUnique: node not unique
staleData: stale data
@@ -0,0 +1,3 @@
errors:
unauthorized: unauthorized
unauthorizedScope: unauthorized scope
@@ -0,0 +1,2 @@
errors:
notAllowedToSetPermissions: not allowed to set permissions
@@ -0,0 +1,9 @@
errors:
invalidID: invalid ID
invalidRoute: invalid route
notAllowedToCreate: not allowed to create a filter
notAllowedToDelete: not allowed to delete this filter
notAllowedToRead: not allowed to read this filter
notAllowedToUndelete: not allowed to undelete this filter
notAllowedToUpdate: not allowed to update this filter
notFound: filter not found
@@ -0,0 +1,12 @@
errors:
alreadyExists: route by that endpoint already exists
existsEndpoint: route with this endpoint already exists
invalidEndpoint: invalid endpoint
invalidID: invalid ID
notAllowedToCreate: not allowed to create a route
notAllowedToDelete: not allowed to delete this route
notAllowedToExec: not allowed to execute this route
notAllowedToRead: not allowed to read this route
notAllowedToUndelete: not allowed to undelete this route
notAllowedToUpdate: not allowed to update this route
notFound: route not found
@@ -0,0 +1,11 @@
errors:
invalidID: invalid ID
notAllowedToCreate: not allowed to create applications
notAllowedToDelete: not allowed to delete this application
notAllowedToManageFlag: not allowed to manage flags for applications
notAllowedToManageFlagGlobal: not allowed to manage global flags for applications
notAllowedToRead: not allowed to read this application
notAllowedToSearch: not allowed to search or list applications
notAllowedToUndelete: not allowed to undelete this application
notAllowedToUpdate: not allowed to update this application
notFound: application not found
@@ -0,0 +1,9 @@
errors:
failedToExtractMimeType: could not extract mime type
failedToProcessImage: could not process image
failedToStoreFile: could not extract store file
invalidID: invalid ID
notAllowedToCreate: not allowed to create attachments
notAllowedToCreateEmptyAttachment: not allowed to create empty attachments
notAllowedToListAttachments: not allowed to list attachments
notFound: attachment not found
@@ -0,0 +1,25 @@
errors:
credentialsLinkedToInvalidUser: credentials {credentials.kind} linked to disabled or deleted user {user}
disabledMFAWithEmailOTP: multi factor authentication with email OTP is disabled
disabledMFAWithTOTP: multi factor authentication with TOTP is disabled
enforcedMFAWithEmailOTP: OTP over email is enforced and cannot be disabled
enforcedMFAWithTOTP: TOTP is enforced and cannot be disabled
externalDisabledByConfig: external authentication (using external authentication provider) is disabled
failedUnconfirmedEmail: system requires confirmed email before logging in
internalLoginDisabledByConfig: internal login (username/password) is disabled
internalSignupDisabledByConfig: internal sign-up (username/password) is disabled
invalidCredentials: invalid username and password combination
invalidEmailFormat: invalid email
invalidEmailOTP: invalid code
invalidHandle: invalid handle
invalidTOTP: invalid code
invalidToken: invalid token
notAllowedToConfigureTOTP: not allowed to configure TOTP
notAllowedToImpersonate: not allowed to impersonate this user
notAllowedToRemoveTOTP: not allowed to remove TOTP
passwodResetFailedOldPasswordCheckFailed: failed to change password, old password does not match
passwordChangeFailedForUnknownUser: failed to change password for the unknown user
passwordNotSecure: provided password is not secure; use longer password with more non-alphanumeric character
passwordResetDisabledByConfig: password reset is disabled
profileWithoutValidEmail: external authentication provider returned profile without valid email
unconfiguredTOTP: TOTP not configured
@@ -0,0 +1,12 @@
errors:
invalidID: invalid ID
notAllowedToCreate: not allowed to create auth clients
notAllowedToDelete: not allowed to delete this auth client
notAllowedToRead: not allowed to read this auth client
notAllowedToSearch: not allowed to search or list auth clients
notAllowedToUndelete: not allowed to undelete this auth client
notAllowedToUpdate: not allowed to update this auth client
notFound: auth client not found
unableToChangeDefaultClientHandle: unable to change the handle of the default auth client
unableToDeleteDefaultClient: unable to delete the default auth client
unableToDisableDefaultClient: unable to disable the default auth client
@@ -0,0 +1,13 @@
errors:
alreadyExists: queue by that name already exists
invalidConsumer: invalid consumer
invalidID: invalid ID
notAllowedToCreate: not allowed to create a queue
notAllowedToDelete: not allowed to delete this queue
notAllowedToRead: not allowed to read this queue
notAllowedToReadFrom: not allowed to read messages from this queue
notAllowedToSearch: not allowed to search or list queues
notAllowedToUndelete: not allowed to undelete this queue
notAllowedToUpdate: not allowed to update this queue
notAllowedToWriteTo: not allowed to add messages to this queue
notFound: queue not found
@@ -0,0 +1,6 @@
errors:
invalidID: invalid ID
notAllowedToAssign: not allowed to assign reminders to other users
notAllowedToDismiss: not allowed to dismiss reminders of other users
notAllowedToRead: not allowed to read reminders of other users
notFound: reminder not found
@@ -0,0 +1,11 @@
errors:
invalidID: invalid ID
notAllowedToCreate: not allowed to create reports
notAllowedToDelete: not allowed to delete this report
notAllowedToListReports: not allowed to list reports
notAllowedToRead: not allowed to read this report
notAllowedToRun: not allowed to run this report
notAllowedToSearch: not allowed to list or search reports
notAllowedToUndelete: not allowed to undelete this report
notAllowedToUpdate: not allowed to update this report
notFound: report not found
@@ -0,0 +1,15 @@
errors:
handleNotUnique: role handle not unique
invalidHandle: invalid handle
invalidID: invalid ID
nameNotUnique: role name not unique
notAllowedToArchive: not allowed to archive this role
notAllowedToCreate: not allowed to create roles
notAllowedToDelete: not allowed to delete this role
notAllowedToManageMembers: not allowed to manage role members
notAllowedToRead: not allowed to read this role
notAllowedToSearch: not allowed to search or list roles
notAllowedToUnarchive: not allowed to unarchive this role
notAllowedToUndelete: not allowed to undelete this role
notAllowedToUpdate: not allowed to update this role
notFound: role not found
@@ -0,0 +1,17 @@
errors:
badSinkParamEncoding: bad encoding of sink parameters
contentLengthExceedsMaxAllowedSize: content length exceeds max size limit
failedToCreateEvent: failed to create sink event from request
failedToProcess: failed to process request
failedToRespond: failed to respond to request
failedToSign: 'could not sign request params: {err}'
invalidContentType: invalid content-type header
invalidHttpMethod: invalid HTTP method
invalidPath: invalid path
invalidSignature: invalid signature
invalidSignatureParam: invalid sink signature parameter
invalidSinkRequestUrlParams: invalid sink request url params
misplacedSignature: signature misplaced
missingSignature: missing sink signature parameter
processingError: sink request process error
signatureExpired: signature expired
@@ -0,0 +1,2 @@
errors:
notAllowedToReadStatistics: not allowed to read statistics
@@ -0,0 +1,12 @@
errors:
cannotRenderPartial: cannot render partial templates
invalidHandle: invalid handle
invalidID: invalid ID
notAllowedToCreate: not allowed to create templates
notAllowedToDelete: not allowed to delete this template
notAllowedToRead: not allowed to read this template
notAllowedToRender: not allowed to render this template
notAllowedToSearch: not allowed to search or list templates
notAllowedToUndelete: not allowed to undelete this template
notAllowedToUpdate: not allowed to update this template
notFound: template not found
@@ -0,0 +1,20 @@
errors:
emailNotUnique: email not unique
handleNotUnique: handle not unique
invalidEmail: Invalid email! {{resource}}
invalidHandle: invalid handle
invalidID: invalid ID
notAllowedToCreate: not allowed to create users
notAllowedToCreateSystem: not allowed to create system users
notAllowedToDelete: not allowed to delete this user
notAllowedToListUsers: not allowed to list users
notAllowedToRead: not allowed to read this user
notAllowedToSearch: not allowed to list or search users
notAllowedToSuspend: not allowed to suspend this user
notAllowedToUndelete: not allowed to undelete this user
notAllowedToUnsuspend: not allowed to unsuspend this user
notAllowedToUpdate: not allowed to update this user
notAllowedToUpdateSystem: not allowed to update system users
notFound: user not found
passwordNotSecure: provided password is not secure; use longer password with more non-alphanumeric character
usernameNotUnique: username not unique
@@ -0,0 +1,271 @@
automation:
add: Add script
edit:
asyncHelp: Do not wait for results and ignore errors. Incompatible with critical flag.
asyncLabel: Run this script asynchronously
codeTabLabel: Code
criticalHelp: Wait until this script is executed. In case of errors, abort execution of other scripts and before* trigger
criticalLabel: Critical script
delete: Delete script
enabledHelp: Disabled scripts will be ignored
enabledLabel: Enabled
mailAutomationTriggers:
addMatcher: Add condition
addTrigger: Add trigger
delete: Delete trigger
deleteTrigger: Delete
enable: Enable trigger
matchAll: Must match all conditions
matcher:
fields:
bcc: BCC
cc: CC
from: From
placeholder: Mail header field
replyTo: Reply To
subject: Subject
to: To
match: Value to match
operators:
equal-ci: Match full
placeholder: Operator
prefix-ci: Match prefix
regex: Regex
suffix-ci: Match suffix
user: Existing user
tabLabel: Mail triggers
nameLabel: Name
namePlaceholder: Automation script name
runAsCurrentUser: Run as "{{ user }}"
runAsHelp: Script runner
scheduledTriggers:
tabLabel: Scheduled
securityLabel: Security
settingsTabLabel: Settings
timeoutHelp: How much time do we wait before aborting the script? Value in milliseconds (1000ms = 1s). It defaults (when 0) to 2s with 30s as maximum. Consult with your administrator for exact numbers and limitations.
timeoutLabel: Script execution timeout
timeoutPlaceholder: "1500"
title: Automation script
userPickerPlaceholder: Select user
import: Import automation script(s)
list:
column:
label:
async: Async.
critical: Critical
enabled: Enabled
runAs: Run As
runInUA: In browser
unnamed: (Unnamed script)
manage: Manage automation scripts ({{count}})
manage-id-permissions: Manage permissions for this script
manage-wc-permissions: Manage permissions for all scripts
newLabel: Create a new script
newPlaceholder: Script name
testing:
load: Load
parametersHeadline: 'Parameters & payload:'
resultsHeadline: 'Results:'
testInBrowser: Test in Browser
testInCorredor: Test in Corredor
warning: ""
title: List of automation script
general:
notFound: 'Not found'
label:
"no": "No"
submit: Submit
"yes": "Yes"
logout: Logout
noAccess: You do not have permissions to access Admin panel
pagination:
next: Next
prev: Prev
navigation:
adminPanel: Admin panel
automation: Automation
chart: Charts
configuration: Configuration
help:
documentation: Documentation
feedback: Send feedback
forum: Help
version: 'Version:'
module: Modules
more: More
namespace: Namespaces
noPageTitle: No page title
page: Pages
publicPages: Public pages
userSettings:
changePassword: Change password
loggedInAs: Logged in as {{user}}
logout: Logout
profile: Profile
permission:
automationWorkflow:
all: all workflows
operations:
delete:
description: 'Default: deny'
specific: Delete this workflow
title: Delete any workflow
execute:
description: 'Default: deny'
specific: Execute this workflow
title: Execute any workflow
read:
description: 'Default: deny'
specific: Read this workflow
title: Read any workflow
sessionsManage:
description: 'Default: deny'
specific: Manage sessions for this workflow
title: Manage all sessions
triggersManage:
description: 'Default: deny'
specific: Manage triggers for this workflow
title: Manage all triggers
undelete:
description: 'Default: deny'
specific: Undelete this workflow
title: Undelete any workflow
update:
description: 'Default: deny'
specific: Update this workflow
title: Update any workflow
specific: workflow "{{target}}"
base:
compose: Compose
system: System
resetBack: Reset back to "{{current}}"
saveChanges: Save changes
setFor: Set permissions for {{target}}
systemApplication:
all: all applications
operations:
delete:
description: 'Default: deny'
specific: Delete {{target}}
title: Delete any application
read:
description: 'Default: deny'
specific: Read {{target}}
title: Read any application
update:
description: 'Default: deny'
specific: Update {{target}}
title: Update any application
specific: application "{{target}}"
systemApigwRoute:
all: all routes
operations:
delete:
description: 'Default: deny'
specific: Delete {{target}}
title: Delete any route
read:
description: 'Default: deny'
specific: Read {{target}}
title: Read any route
update:
description: 'Default: deny'
specific: Update {{target}}
title: Update any route
specific: route "{{target}}"
systemAuthClient:
all: all auth clients
operations:
authorize:
description: 'User can authorize (use) this client. Default: deny'
specific: Authorize client "{{target}}
title: Authorize any client
delete:
description: 'Default: deny'
specific: Delete client "{{target}}
title: Delete any client
read:
description: 'Default: deny'
specific: Read client "{{target}}
title: Read any client
update:
description: 'Default: deny'
specific: Update client "{{target}}
title: Update any client
specific: auth client "{{target}}"
systemRole:
all: all roles
operations:
delete:
description: 'Default: deny'
specific: Delete {{target}}
title: Delete any role
membersManage:
description: 'Default: deny'
specific: Manage members for {{target}}
title: Manage members for any role
read:
description: 'Default: deny'
specific: Read {{target}}
title: Read any role
update:
description: 'Default: deny'
specific: Update {{target}}
title: Update any role
specific: role "{{target}}"
systemTemplate:
all: all templates
operations:
delete:
description: 'Default: deny'
specific: Delete {{target}}
title: Delete any template
read:
description: 'Default: deny'
specific: Read {{target}}
title: Read any template
render:
description: 'Default: deny'
specific: Render {{target}}
title: Render any template
update:
description: 'Default: deny'
specific: Update {{target}}
title: Update any template
specific: template "{{target}}"
systemUser:
all: all users
operations:
delete:
description: 'Default: deny'
specific: Delete {{target}}
title: Delete any user
emailUnmask:
description: 'Default: deny'
specific: Show email details for {{target}}
title: Show email details for any user
impersonate:
description: 'Default: deny'
specific: Impersonate this user {{target}}
title: Impersonate any user
nameUnmask:
description: 'Default: deny'
specific: Show name details for {{target}}
title: Show name details for any user
read:
description: 'Default: deny'
specific: Read {{target}}
title: Read any user
suspend:
description: 'Default: deny'
specific: Suspend {{target}}
title: Suspend any user
unsuspend:
description: 'Default: deny'
specific: Unsuspend {{target}}
title: Unsuspend any user
update:
description: 'Default: deny'
specific: Update {{target}}
title: Update any user
specific: user "{{target}}"
@@ -0,0 +1,34 @@
list:
rules:
add: Add role
addRole: Add new role
component:
operations:
grant: Grant permissions on automation
sessionsSearch: Search sessions
triggersSearch: Search triggers
workflowCreate: Create new workflow
workflowsSearch: Search workflows
type:
label: Automation
loading: Loading permissions
noRole: No role selected
notAllowed: Not allowed to set permissions
submit: Submit
tip1: Click on permission/role cell to allow a specific operation
tip2: Use Alt-Click to set explicit deny on operation
title: List of rules
workflow:
operations:
delete: Delete workflow
execute: Execute workflow
read: Read workflow
sessionsManage: Manage workflow sessions
triggersManage: Manage workflow triggers
undelete: Undelete workflow
update: Update workflow
type:
label: Workflow
title: Automation permissions
navItem:
label: Permissions
@@ -0,0 +1,18 @@
list:
columns:
updatedAt: Last update
filter:
absoluteTime: Show absolute time
incScriptsWithErrors: Errors ({{ count }})
incScriptsWithIterator: Iterator ({{ count }})
incScriptsWithSecurity: Security ({{ count }})
incScriptsWithTriggers: Triggers ({{ count }})
searchQuery: Search query
flags:
iterator: Iterator
security: Security
triggers: Triggers
labelMissing: <label missing>
title: Corredor Scripts
navItem:
label: Corredor Scripts
@@ -0,0 +1,53 @@
editor:
info:
completedAt: Completed at
createdAt: Created at
createdByUserID: Created by - ID
createdByUserName: Created by - Name
delete: Delete
deletedAt: Deleted at
error: Error
eventType: Event type
id: ID
resourceType: Resource type
status: Status
title: Basic information
workflowID: WorkflowID
title: Session
list:
columns:
actions: ""
createdAt: Created At
eventType: Event type
sessionID: SessionID
status: Status
workflowID: WorkflowID
filterForm:
all:
label: All
completed:
label: Completed
excluded:
label: Without
exclusive:
label: Only
failed:
label: Failed
inProgress:
label: completed sessions
inclusive:
label: Including
prompted:
label: Prompted
sessions:
label: sessions
started:
label: Started
suspended:
label: Suspended
loading: Loading sessions
numFound: '{{count}} session found'
numFound_plural: '{{count}} sessions found'
title: Sessions
navItem:
label: Sessions
@@ -0,0 +1,52 @@
editor:
info:
createdAt: Created at
delete: Delete
deletedAt: Deleted at
enabled: Enabled
handle: Handle
id: ID
name: Name
openBuilder: Open builder
title: Basic information
undelete: Undelete
updatedAt: Updated at
new: New
permissions: Permissions
title:
create: Create workflow
edit: Edit workflow
triggers:
and: and
columns:
constraints: Constraints
eventType: Event
resourceType: Resource
title: Triggers
list:
columns:
actions: ""
createdAt: Created
enabled: Enabled
handle: Name
filterForm:
deleted:
label: deleted workflows
excluded:
label: Without
exclusive:
label: Only
inclusive:
label: Including
query:
label: Filter workflows list
placeholder: Filter workflows by name
loading: Loading workflows
new: New
numFound: '{{count}} workflow found'
numFound_plural: '{{count}} workflows found'
permissions: Permissions
title: Workflows
yaml: YAML
navItem:
label: Workflows
@@ -0,0 +1,2 @@
navGroup:
label: Automation
@@ -0,0 +1,8 @@
list:
columns:
events: Triggered on events
label: Label
name: Name
title: Compose Automation
navItem:
label: Automation
@@ -0,0 +1,73 @@
list:
rules:
add: Add role
addRole: Add new role
chart:
operations:
delete: Delete any chart
read: Read any chart
update: Update any chart
type:
label: Charts
component:
operations:
grant: Grant permissions on compose service
namespaceCreate: Create namespaces
namespacesSearch: List and search namespaces
settingsManage: Manage all settings
settingsRead: Access all settings
type:
label: Compose service
loading: Loading permissions
module:
operations:
delete: Delete any module
read: Read any module
recordCreate: Create record under any module
recordsSearch: List and search records under any module
update: Update any module
type:
label: Modules
moduleField:
operations:
recordValueRead: Read any module field
recordValueUpdate: Update any module field
type:
label: Module fields
namespace:
operations:
chartCreate: Create charts under any namespace
chartsSearch: List and search charts under any namespace
delete: Delete any namespace
manage: Manage any namespace
moduleCreate: Create modules under any namespace
modulesSearch: List and search modules under any namespace
pageCreate: Create pages under any namespace
pagesSearch: List and search pages under any namespace
read: Access any namespace
update: Update any namespace
type:
label: Namespaces
noRole: No role selected
notAllowed: Not allowed to set permissions
page:
operations:
delete: Delete any page
read: Read any page
update: Update any page
type:
label: Pages
record:
operations:
delete: Delete any record
read: Read any record
update: Update any record
type:
label: Records
submit: Submit
tip1: Click on permission/role cell to allow a specific operation
tip2: Use Alt-Click to set explicit deny on operation
title: List of rules
title: Compose permissions
navItem:
label: Permissions
@@ -0,0 +1,13 @@
editor:
basic:
attachments:
max-size: Max size (MB)
page: Page attachments
record: Record attachments
type:
description: 'MIME types, separated with ",". Example: "text/plain,text/csv"'
whitelist: File type whitelist
title: Basic
title: Compose settings
navItem:
label: Settings
@@ -0,0 +1,2 @@
navGroup:
label: Compose
@@ -0,0 +1,20 @@
applications:
applications: Application(s)
deleted: Deleted
title: Active application(s)
total: Total
navItem:
label: Dashboard
roles:
archived: Archived
deleted: Deleted
roles: Role(s)
title: Active role(s)
total: Total
title: Dashboard
users:
deleted: Deleted
suspended: Suspended
title: Active user(s)
total: Total
users: User(s)
@@ -0,0 +1,66 @@
editor:
generate:
body: '{{ userLabel }} is sending you an invitation for Corteza Federated Network. To start sharing data between organizations, go to the admin panel of your Corteza application, click on “Federation” and select “Pair Federation Network” on top right corner. Copy the link below and await confirmation from another administrator.'
description: To add your organization to a federated network send an email invite or share the link below with an administrator of another organization.
hello: Hello,
invitation: Invitation to Federated Network
kindRegards: Kind regards, Corteza team.
notGenerated: Link not generated
sendEmail: Send Email
subject: 'Subject:'
generateUri: Generate Federation Link
info:
createdAt: Created at
delete: Delete
deletedAt: Deleted at
email: Admin Email
enabled: Enabled
name: Server name
status: Status
tags:
label: Tags
placeholder: +Add
title: Basic information
undelete: Undelete
updatedAt: Updated at
url: Server URL
title:
create: Create Federated Node
edit: Edit Federated Node
list:
columns:
actions: ""
createdAt: Created
enabled: Enabled
name: Name
status: Status
tags: ""
filterForm:
query:
label: Filter servers list
placeholder: Filter servers by name
loading: Loading servers
new: New
numFound: '{{count}} server found'
numFound_plural: '{{count}} servers found'
pair:
confirm: Confirm
label: Pair Federation Node
networkEstablished: Federated network will be established after the final confirmation from the administrator of another Corteza Federation Node.
note: 'Note:'
status:
confirmPending:
description: |-
{{ email }} accepted the invitation to join “{{ name }}” Federated Network.
Click on “Confirm” to start sharing the data.
descriptionNoMail: |-
Admin of “{{ name }}” accepted the invitation to join the Federated Network.
Click on “Confirm” to start sharing the data
none:
description: To pair your organization with a federated network, paste the generated URL of another organization below.
pending:
description: Pairing successful, pending final confirmation by administrator
title: Federated Networks
yaml: YAML
navItem:
label: Nodes
@@ -0,0 +1,44 @@
list:
rules:
add: Add role
addRole: Add new role
component:
operations:
grant: Grant permissions on federation service
nodeCreate: Create nodes
nodesSearch: List or create nodes
pair: Pair nodes
settingsManage: Manage all settings
settingsRead: Access all settings
type:
label: Federation service
exposedModule:
operations:
manage: Manage any module
type:
label: Modules
loading: Loading permissions
noRole: No role selected
node:
operations:
delete: Delete any node
manage: Manage any node
moduleCreate: Create modules
pair: Pair nodes
read: Access any node
update: Update any node
type:
label: Nodes
notAllowed: Not allowed to set permissions
sharedModule:
operations:
map: Map any module
type:
label: Modules
submit: Submit
tip1: Click on permission/role cell to allow a specific operation
tip2: Use Alt-Click to set explicit deny on operation
title: List of rules
title: Federation permissions
navItem:
label: Permissions
@@ -0,0 +1,2 @@
navGroup:
label: Federation
@@ -0,0 +1,47 @@
list:
columns:
action: Action
actor: User
description: Description
requestOrigin: Origin
resource: Resource
severity: Severity
timestamp: Timestamp
details:
id: 'ID'
header: 'Details'
timestamp: 'Timestamp'
requestOrigin: 'Request Origin'
requestID: 'Request ID'
actorIPAddr: 'Actor/User'
actor: 'User'
actorID: 'User ID'
severity: 'Severity'
resource: 'Resource'
action: 'Action'
headerAdditional: 'Additional information'
description: 'Description'
error: 'Error'
severity:
emergency: 'Emergency'
alert: 'Alert'
critical: 'Critical'
error: 'Error'
warning: 'Warning'
notice: 'Notice'
info: 'Info'
debug: 'Debug'
filter:
action: Action
actor: User ID
choose-date: Choose a date
from: Starting from
no-time: No time selected
resource: Resource
search: Search
to: Ending at
today: Today
loadOlder: Load older actions
title: Action log
navItem:
label: Action log
@@ -0,0 +1,92 @@
navItem:
label: 'API Gateway'
list:
title: 'API Gateway'
new: 'New'
permissions: 'Permissions'
yaml: 'YAML'
loading: 'Loading routes'
numFound: '{{count}} route found'
numFound_plural: '{{count}} routes found'
filterForm:
query:
label: 'Filter API Gateway list'
placeholder: 'Filter routes by name'
excluded:
label: 'Without'
inclusive:
label: 'Including'
exclusive:
label: 'Only'
deleted:
label: 'Deleted routes'
columns:
endpoint: 'Endpoint'
createdAt: 'Created'
enabled: 'Enabled'
actions: ''
editor:
title: 'Edit route'
new: 'New'
permissions: 'Permissions'
info:
title: 'Basic information'
id: 'ID'
endpoint: 'Endpoint'
method: 'Method'
enabled: 'Enabled'
delete: 'Delete'
undelete: 'Undelete'
deletedAt: 'Deleted at'
updatedAt: 'Updated at'
createdAt: 'Created at'
validEndpoint: 'Invalid endpoint format'
filters:
title: 'Filter list'
modal:
title: 'Query parameters verifier'
ok: 'Save & Close'
statusActive: 'Active'
statusDisabled: 'Disabled'
step_title:
prefilter: 'Prefiltering'
processer: 'Processing'
postfilter: 'Postfiltering'
list:
remove: 'Remove'
filters: 'Filters'
status: 'Status'
actions: 'Actions'
active: 'Active'
noFiltersMsg: 'Please add a filter!'
labels:
expr: 'Expression'
location: 'Location'
workflow: 'Workflow'
status: 'HTTP Status'
add: 'Add'
addFilter: 'Add filter'
params: 'Params'
filterListEmpty: 'Filter list is empty!'
@@ -0,0 +1,60 @@
editor:
info:
createdAt: Created at
delete: Delete
deletedAt: Deleted at
enabled: Enabled
id: ID
name: Name
title: Basic information
undelete: Undelete
updatedAt: Updated at
new: New
permissions: Permissions
title:
create: Create application
edit: Edit application
unify:
config:
description: Application configuration (JSON)
label: Configuration
listed: Listed
logo:
description: Logo used in the application selector
label: Logo
placeholder: Choose a logo or drop it here...
name:
description: Name used in the application selector
label: Name
pinned: Pinned
title: Unify app selector
url:
description: Application URL
label: URL
list:
columns:
actions: ""
createdAt: Created
enabled: Enabled
name: Name
filterForm:
deleted:
label: deleted applications
excluded:
label: Without
exclusive:
label: Only
inclusive:
label: Including
query:
label: Filter applications list
placeholder: Filter applications by name
loading: Loading applications
new: New
numFound: '{{count}} application found'
numFound_plural: '{{count}} applications found'
permissions: Permissions
title: Applications
yaml: YAML
navItem:
label: Applications
@@ -0,0 +1,85 @@
editor:
info:
add: Add
api: Allow client access to Corteza API on behalf of user
choose-date: Choose a date
createdAt: Created at
delete: Delete
deletedAt: Deleted at
enabled:
disabledFootnote: Unable to disable the default client
label: Enabled
expiresAt:
description: If not defined the client has no expiration date
label: Expires at
grant:
authorization_code: Will be used to authenticate users (grant type = authorization_code)
client_credentials: Will be used to authenticate machines (grant type = client_credentials)
handle:
disabledFootnote: Unable to change the handle of the default auth client
label: Handle
name: Name
no-time: No time selected
profile: Allow client access to user's profile
redirectURI: Redirect URI's
remove: Remove
searchRoles: Search roles
secret: Secret
security:
forbiddenRoles:
description: Roles from this list will be removed from security context when user authorizes this client
label: Forbidden roles ({{count}})
forcedRoles:
description: Roles from this list will be always added to security context when user authorizes this client
label: Forced roles ({{count}})
impersonateUser:
description: When authenticating with client credentials, act in the name of the impersonated user
label: Impersonate user
permittedRoles:
description: Only roles in this list will be added into security context when user authorizes this client
label: Permitted roles ({{count}})
title: Basic information
trusted:
description: When client is trusted users do not see authorization step
label: Trusted
undelete: Undelete
unnamed: Unnamed role
updatedAt: Updated at
uri: URI
validFrom:
description: If not defined the client is valid until expiration
label: Valid from
new: New
permissions: Permissions
title:
create: Create client
edit: Edit client
list:
columns:
actions: ""
createdAt: Created
enabled: Enabled
handle: Handle
meta:
name: Name
filterForm:
deleted:
label: deleted clients
excluded:
label: Without
exclusive:
label: Only
inclusive:
label: Including
query:
label: Filter clients list
placeholder: Filter clients
loading: Loading clients
new: New
numFound: '{{count}} clients found'
numFound_plural: '{{count}} clients found'
permissions: Permissions
title: Auth Clients
yaml: YAML
navItem:
label: Auth Clients
@@ -0,0 +1,118 @@
list:
rules:
add: Add role
addRole: Add new role
application:
operations:
delete: Delete any application
read: Read any application
update: Update any application
type:
label: Applications
authClient:
operations:
authorize: Authorize any client
delete: Delete any client
read: Read any client
update: Update any client
type:
label: Auth clients
component:
operations:
actionLogRead: Access action log
applicationCreate: Create new application
applicationFlagGlobal: Can pin application for everyone
applicationFlagSelf: Can pin application for themselves
applicationsSearch: List and search applications
authClientCreate: Create new auth client
authClientsSearch: List and search auth clients
apigwRouteCreate: Create new route
apigwRoutesSearch: List and search routes
apigwFilterCreate: Create new filter
apigwFiltersSearch: List and search filters
grant: Grant permission on system service
queueCreate: Create new messaging queue
queuesSearch: List and search messaging queues
reminderAssign: Allow reminder assignment
roleCreate: Create new role
rolesSearch: List and search roles
settingsManage: Manage all settings
settingsRead: Access all settings
templateCreate: Create new template
templatesSearch: List and search templates
userCreate: Create new user
usersSearch: List and search users
type:
label: System service
loading: Loading permissions
noRole: No role selected
notAllowed: Not allowed to set permissions
queue:
operations:
delete: Delete any queue
queueRead: Read messages from queue
queueWrite: Write messages to queue
read: Read any queue
update: Update any queue
type:
label: Messaging queues
role:
operations:
delete: Delete any role
membersManage: Manage members for any role
read: Read any role
update: Update any role
type:
label: Roles
submit: Submit
apigwRoute:
type:
label: 'API gateway Routes'
operations:
read: 'Read any route'
update: 'Update any route'
delete: 'Delete any route'
apigwFilter:
type:
label: 'API gateway filters'
operations:
read: 'Read any filters'
update: 'Update any filters'
delete: 'Delete any filters'
template:
operations:
delete: Delete any template
read: Read any template
render: Render any template
update: Update any template
type:
label: Templates
tip1: Click on permission/role cell to allow a specific operation
tip2: Use Alt-Click to set explicit deny on operation
title: List of rules
user:
operations:
delete: Delete any user
emailUnmask: Show email details
impersonate: Impersonate any user
nameUnmask: Show name details
read: Read any user
suspend: Suspend any user
unsuspend: Unsuspend any user
update: Update any user
type:
label: Users
report:
operations:
read: Read any report
update: Update any report
delete: Delete any report
run: Run any report
type:
label: Reports
title: System permissions
navItem:
label: Permissions
@@ -0,0 +1,42 @@
editor:
info:
consumer: Consumer
createdAt: Created at
delete: Delete
deletedAt: Deleted at
dispatch_events: Dispatch events
dispatch_events_desc: Dispatch events notifies the eventbus of queue message changes (new, processed, ...)
name: Queue name
poll_delay: Polling changes delay
poll_delay_empty: 'Poll delay will not be used; to enable, use duration format (ie: 1h / 1m15s / 1h90s)'
poll_delay_set: Poll delay will be used; if empty, it will not be used.
title: Basic information
undelete: Undelete
updatedAt: Updated at
new: New
title:
edit: Edit queue
new: Add a queue
list:
columns:
actions: Actions
consumer: Consumer
createdAt: Created At
queue: Queue
filterForm:
deleted:
label: deleted queues
excluded:
label: Without
exclusive:
label: Only
handle:
label: Filter queues list
placeholder: Filter queues by name
inclusive:
label: Including
loading: Loading messaging queues
new: New
title: Messaging queues
navItem:
label: Messaging Queues
@@ -0,0 +1,55 @@
editor:
info:
archive: Archive
archivedAt: Archived at
createdAt: Created at
delete: Delete
deletedAt: Deleted at
handle: Handle
name: Role name
title: Basic information
unarchive: Unarchive
undelete: Undelete
updatedAt: Updated at
members:
add: Add
count: Members ({{count}})
remove: Remove
searchUsers: Search users
title: Role members
unnamed: Unnamed user
new: New
permissions: Permissions
title:
create: Create role
edit: Edit role
list:
columns:
actions: ""
createdAt: Created
enabled: Enabled
handle: Handle
name: Name
filterForm:
archived:
label: archived roles
deleted:
label: deleted roles
excluded:
label: Without
exclusive:
label: Only
inclusive:
label: Including
query:
label: Filter roles list
placeholder: Filter roles by name
loading: Loading roles
new: New
numFound: '{{count}} role found'
numFound_plural: '{{count}} roles found'
permissions: Permissions
title: Roles
yaml: YAML
navItem:
label: Roles
@@ -0,0 +1,71 @@
editor:
auth:
internal:
enabled: Internal authentication enabled
password-reset:
enabled: Password reset enabled
signup:
email-confirmation-required: Signup email confirmation required
enabled: Signup enabled
split-credentials-check:
description: 'Split login into two steps: collect the email input first and show the input for the password on the 2nd screen. Automatically forward user to external identity provider when user does not have his password set and there is only one IdP present'
label: Enable split-credentials check
title: Internal
mail:
from-address: Sender's address
from-name: Sender's name
title: Authentication email sender mail
validate-email: Please enter valid email address.
mfa:
TOTP:
enabled: Allow users to use time based one-time-password (using mobile application)
enforced: Force users to use time based one-time-password (using mobile application)
issuer:
description: Issuer name will be send to authenticator app when user configures it.
label: Issuer
emailOTP:
enabled: Allow users to use one-time-password over email
enforced: Force users to use one-time-password over email
expires:
description: How long will password be valid before it expires.
label: Valid for
title: Multi-factor authentication
title: Authentication
url: URL
external:
addOidcProvider: Add OIDC provider
certificate: Certificate
clientKey: Client key
clientSecret: Secret
enabled: Enable external authentication
facebook: Facebook
github: GitHub
google: Google
handle: Handle
issuer: OIDC Issuer URL
issuerHint: Where to find the /.well-known/openid-configuration (without the /.well-known/openid-configuration part)
issuerPlaceholder: https://issuer.tld
linkedin: LinkedIn
oidc: OpenID Connect
providerEnabled: Enable
saml:
cert: Certificate public key
cert-key: Certificate private key
desc:
cert: Content will be minimized
cert-key: Content will be minimized
idp:
ident-handle: Handle field coming from idp
ident-identifier: Determines by which field do we match, usually email
ident-name: Name field coming from idp
idp:
ident-handle: Identity payload handle
ident-identifier: Identity payload default identifier
ident-name: Identity payload name
title: Identity provider
url: URL
title: SAML
title: External Authentication Providers
title: System settings
navItem:
label: Settings
@@ -0,0 +1,2 @@
navItem:
label: Stats
@@ -0,0 +1,72 @@
editor:
content:
editor:
unsupported: Unsupported editor
partial: Partial template
preview:
html: Preview HTML
pdf: Preview PDF
title: Preview output
title: Template content
toolbox:
partials: Partials
samples:
defaultHTML: Default HTML
label: Samples
snippets:
funcCall: Call a function
interpolate: Interpolate value
iterator: Iterate over a set
label: Snippets
title: Toolbox
info:
contentType:
text_html: HTML
text_plain: Plain text
createdAt: Created at
delete: Delete
deletedAt: Deleted at
handle: Handle
meta:
description: Description
short: Short name
partial: Partial template
partialDescription: Partial templates may be used inside other templates such as headers and footers. Partial templates may not be used on their own.
title: Basic information
type: Template type
undelete: Undelete
updatedAt: Updated at
new: New
permissions: Permissions
title:
create: Create template
edit: Edit template
list:
columns:
actions: ""
createdAt: Created
handle: Handle
language: Language
meta:
short: Short name
filterForm:
deleted:
label: deleted templates
excluded:
label: Without
exclusive:
label: Only
handle:
label: Filter templates list
placeholder: Filter templates by handle
inclusive:
label: Including
loading: Loading templates
new: New
numFound: '{{count}} template found'
numFound_plural: '{{count}} templates found'
permissions: Permissions
title: Templates
yaml: YAML
navItem:
label: Templates
@@ -0,0 +1,93 @@
editor:
info:
confirmEmail: Confirm email address
createdAt: Created at
delete: Delete
deletedAt: Deleted at
email: Email
handle: Handle
name: Full name
revokeAllSession: Revoke all active session
suspend: Suspend
suspendedAt: Suspended at
title: Basic information
undelete: Undelete
unsuspend: Unsuspend
updatedAt: Updated at
mfa:
TOTP:
disabled:
text: User did not configure TOTP protection.
enabled:
text: User configured TOTP protection auth mobile app.
remove:
label: Remove
emailOTP:
disable:
label: Disable
disabled:
text: |-
Email OTP protection is disabled for this user.
Email with the security code on each login will not be sent.
enable:
label: Enable
enabled:
text: |-
Email OTP protection is enabled for this user.
User will receive email with the security code on each login.
title: Multi-factor authentication
new: New
notifications:
membershipOK: Membership successfully updated
passwordOK: Password successfully changed
title: User updated
userInfoOK: User info successfully updated
password:
confirm: Confirm password
length: The passwords must be at least {{length}} characters long!
missmatch: The passwords must match!
new: New password
title: Password
removePassword: Remove password
permissions: Permissions
roles:
add: Add
count: Roles ({{count}})
remove: Remove
searchRoles: Search roles
title: Role membership
unnamed: Unnamed role
title:
create: Create user
edit: Edit user
list:
columns:
actions: ""
createdAt: Created
email: Email
enabled: Enabled
handle: Handle
name: Name
filterForm:
deleted:
label: deleted users
excluded:
label: Without
exclusive:
label: Only
inclusive:
label: Including
query:
label: Filter users list
placeholder: Filter users by name, email
suspended:
label: suspended users
loading: Loading users
new: New
numFound: '{{count}} user found'
numFound_plural: '{{count}} users found'
permissions: Permissions
title: Users
yaml: YAML
navItem:
label: Users
@@ -0,0 +1,2 @@
navGroup:
label: System
@@ -0,0 +1,27 @@
navItem:
label: 'Settings'
editor:
title: 'User Interface Settings'
mainLogo:
title: 'Main logo'
uploader:
instructions: 'Click or drop main logo here to upload'
uploading: 'Uploading main logo'
iconLogo:
title: 'Icon logo'
uploader:
instructions: 'Click or drop icon logo image here to upload'
uploading: 'Uploading icon logo'
favicon:
title: 'Favicon'
uploader:
instructions: 'Click or drop favicon file here to upload'
uploading: 'Uploading favicon'
@@ -0,0 +1,2 @@
navGroup:
label: User interface
@@ -0,0 +1,337 @@
automation:
addPlaceholderLabel: Add placeholder (dummy button)
availableScriptsAndWorkflow: Available scripts and workflows ({{count}})
badge:
script: script
workflow: workflow
buttonLabel: Label
buttonVariant: Variant
configuredButtons: Configured buttons
dangerButton: Danger
darkButton: Dark
dummyButtonLabel: Dummy
editButton: Edit
editTitle:
script: Edit automation script button
workflow: Edit workflow button
label: Automation
lightButton: Light
noDescription: No description
noLabel: Unlabeled
noScript: There is no script or workflow configured for this button
noScripts: There are no manual scripts compatible with this page block
primaryButton: Primary
removeAll: Remove all
searchPlaceholder: Filter available scripts by label, script name and description
secondaryButton: Secondary
stepID: 'stepID: {{stepID}}'
successButton: Success
warningButton: Warning
calendar:
addEventsSource: Add events source
calendarHeader: Calendar header
feedLabel: Configure events source
feedPlaceholder: Select a feed source
hideHeader: Hide calendar header
hideNavigation: Hide prev/next button
hideTitle: Hide title text
hideToday: Hide today button
label: Calendar
recordFeed:
colorLabel: Event color
eventAllDay: Show as all-day-events
eventEndFieldLabel: Event end
eventEndFieldPlaceholder: (No field, event will last 1 hour)
eventStartFieldLabel: Event start
eventStartFieldPlaceholder: (No field)
moduleLabel: Select module
modulePlaceholder: (No module)
noMultiFields: Multi-value fields are currently not supported
optionLabel: Records
prefilterLabel: Prefilter events
prefilterPlaceholder: field1 = 1 AND field2 = 232
titleLabel: Title
titlePlaceholder: (No field)
reminderFeed:
colorLabel: Event color
optionLabel: Reminders
today: Today
view:
dayGridMonth: Month
default: Default view
enabled: Enabled views
footnote: Make sure default is one of the available views
listMonth: Agenda
timeGridDay: Day
timeGridWeek: Week
viewLabel: $t(block.calendar.label)
chart:
add: New Chart
addFunnel: Funnel chart
addGauge: Gauge chart
addGeneric: Generic chart
configure:
label: Configure chart
reportLabel: Report {{l}}
reportsLabel: Reports
display: 'Chart to display inside this block:'
edit: Edit chart
label: Chart
pick: Pick a chart
preview:
chartId: Chart preview (ID {{0}})
content:
label: Content
file:
label: File
preview:
label: File block
general:
changeBlock: Change existing block
descriptionLabel: $t(general.label.description)
descriptionPlaceholder: Block description
headerStyle: Block header style (color)
module: Module
style:
danger: Danger variant
default: Dark variant
primary: Primary variant
secondary: Secondary variant
success: Success variant
warning: Warning variant
title: Add new block
titleLabel: $t(general.label.title)
titlePlaceholder: Block title
iframe:
label: IFrame
pickURLField: Pick an URL field
srcDesc: Used as a fallback when set in combination with record field.
srcFieldDesc: Only available on record pages and on modules with existing "url" field kind
srcFieldLabel: Field (URL) from record to use for the iframe
srcLabel: URL to show in the iframe
metric:
defaultMetricLabel: Unnamed metric
edit:
bucketLabel: Bucket size
bucketPlaceholder: Select a bucket size
dateFormat: Date format
dimensionFieldLabel: Field
dimensionFieldPlaceholder: Dimension field
dimensionLabel: Dimension
filterFootnote: Simplified SQL condition (WHERE ...) syntax is supported. Variables like {{0}}, {{1}} and {{2}} are evaluated (when available)
filterLabel: Filter
labelLabel: Label
labelPlaceholder: Label
metricFieldLabel: Field
metricFieldPlaceholder: Dimension field
metricLabel: Metric
moduleLabel: Module
modulePlaceholder: Pick a module
numberFormat: Number format
operationAvg: Avg
operationCountd: Count
operationLabel: Aggregation operation
operationMax: Max
operationMin: Min
operationPlaceholder: Aggregation operation
operationStd: Std
operationSum: Sum
prefixLabel: Prefix
refreshData: Refresh data
suffixLabel: Suffix
tabTitle: Metric
transformFunctionDescription: v - current value; label - current value's label
transformFunctionLabel: Transform value
editStyle:
backgroundColor: Background color
color: Text color
fontSize: Font size in pixels
labelLabel: Label style
valueLabel: Value style
label: Metric
record:
confirmDelete: Are you sure you want to delete this record?
deleteRecord: Delete record
label: Record
preview:
blockNoRecord: Can not render this block without a record
fieldsFromModule: Single record block, displaying fields ({{0}}) from module {{1}}
untitled: Untitled
recordDeleted: This record was deleted
recordList:
addRecord: Add
cancelSelection: Cancel
editFields: Editable module fields
export:
all: Export all records
allow: Allow records export
csv: CSV Export
dateRange: 'Select date range:'
filter:
createdAt: Record created
custom: Custom
lastMonth: Last month
lastWeek: Last week
thisMonth: This month
thisWeek: This week
today: Today
updatedAt: Record updated
inRange: Set date range
includeQuery: Filter by search query
json: JSON Export
limitations: 'CSV export limitation: only the first value in the multi value fields will be exported'
query: Search query
rangeBy: 'Set range by:'
recordCount: '{{count}} records ready for export'
selectFields: 'Select fields you want to export:'
selection: Selected records
specifyTimezone: Export to timezone
timezonePlaceholder: Select timezone
federated: Federated
fields: Module fields
filter:
addField: Add new filter field
addFilter: + Add filter
byValue: Filter records based on field value
conditions:
and: AND
or: OR
deletedRecords: Deleted records
field: Filter field
fieldPlaceholder: Pick a field
fieldValue: Field value
fieldValuePlaceholder: Input field filter
including: Including
label: Filter
note: 'Note: If Field value is undefined, the filter will look for records where that field value is undefined.'
only: Only
operators:
contains: Contains
equal: Equal
greaterThan: Greater than
lessThan: Less than
notEqual: Not equal
title: Record list filter
update: Update filter
where: Where
without: Without
hideRecordCloneButton: Hide clone record button
hideRecordEditButton: Hide edit record button
hideRecordPermissionsButton: Hide record permissions button
hideRecordReminderButton: Hide record reminder button
hideRecordViewButton: Hide view record button
import:
dropzoneFileAdded: '{{name}} was uploaded and is ready for import ({{count}} record)'
dropzoneFileAdded_plural: '{{name}} was uploaded and is ready for import ({{count}} records)'
dropzoneLabel: Click or drop file here to upload (.csv or JSON)
failed: 'Something went wrong during the import. Please try again: {{failReason}}'
fileColumns: File columns
hasRequiredFileFields: This module has required file upload fields that are not yet supported via the importer
matchFields: 'Match imported columns with existing ones:'
moduleFields: Module fields
onError: 'If any record fails to import:'
onErrorFail: Cancel import
onErrorSkip: Skip record
pickModuleField: Pick a module field
progressRatio: '{{completed}} / {{entryCount}} rows'
report:
count: Number of records
detectedErrors: Detected errors
error: Error
failedEntries: Failed source entries
failedEntriesLine: Entry
failedEntriesLines: Entries from to (inclusive)
failedRecords: Failed records
finishedAt: Finished At
importedRecords: Imported records
startedAt: Started At
title: Record import error report
totalRecords: Total records
success: Import successful.
to: Import to {{modulename}}
uploadFile: Upload the file you want to import (.csv or JSON format)
label: Record list
moduleFootnote: Modules without a {{0}} can only be used in a record list as an inline editor
pagination:
next: Next
prev: Previous
showing: '{{from}} - {{to}} of {{count}} records'
single: One record
single_plural: '{{count}} records'
positionField:
footnote: Records will be sorted based on this field
label: Record sort field
preview:
addRecordButton: Add record button
bePaged: '{{0}} be paged.'
isDisabled: '{{0}} is disabled.'
isEnabled: '{{0}} is enabled.'
isHidden: '{{0}} is hidden.'
isShown: '{{0}} is shown'
moduleNotSelected: Block with table of records, module not selected.
recordFromModule: 'Showing records from {{0}} module with columns: {{1}}'
recordsPerPage: '{{0}} records are shown per page.'
resultsCan: Results can
resultsCant: Results can not
resultsPrefiltered: 'Results are prefiltered:'
searchInput: Search inputbox
sorting: Sorting
tableHeader: Table header
usersSearchThrough: Users search through the records.
usersSee: Users see {{0}}.
withPresortedRecords: with presorted ({{0}}) records.
record:
draggable: Can drag & drop records to order them
fullPageNavigation: Full page navigation
hideAddButton: Hide add record button
hidePaging: Hide paging
inlineEditor: Inline editor
inlineEditorAllow: Allow inline record editing
inlineEditorFootnote: Only one inline editor with the same module can be present the same page
newLabel: New records
noPermission: No permission to read record
perPage: Records per page
prefilterFootnote: Simplified SQL condition (WHERE ...) syntax is supported. Variables like {{0}}, {{1}} and {{2}} are evaluated (when available)
prefilterHideSearch: Hide search box
prefilterLabel: Prefilter records
prefilterPlaceholder: field1 = 1 AND field2 = 232
presortFootnote: Simplified SQL condition (ORDER BY ...) syntax is supported.
presortHideSort: Hide sorting
presortLabel: Presort records
presortPlaceholder: field1 DESC, field2 ASC
showTotalCount: Show total record count
recordPage: record page
refField:
footnote: Field that links records with the parent record
label: Parent field
selectable: Enable record selection
selected: '{{count}} of {{total}} records selected'
recordOrganizer:
descriptionField:
footnote: Field value will be used as record description
label: Description field
group:
footnote: Value that will be set to the key field. This does not affect the filtering. Make sure to specify the prefilter where needed.
label: Key value
groupField:
footnote: Field whose value will change when a record is moved into the record organizer
label: Key field
label: Record organizer
labelField:
footnote: Field value will be used as record label
label: Label field
noRecords: No records in module linked with record organizer. Drag and drop records here.
notConfigured: Record organizer is not configured correctly.
positionField:
footnote: Records will be sorted based on this field
label: Record sort field
preview:
label: 'Record Organizer block for module {{0}}. Label field {{1}}, Description field {{2}}. Value setting field: {{3}}, Sorted by position field: {{4}}.'
moduleNotSelected: Record Organizer module not selected.
socialFeed:
label: Twitter feed
noInput: No input for displaying social feed...
preview:
socialFeed: Twitterblo feed
twitterProfileField: Field that contains Twitter Profile URL for a record
twitterProfileLabel: Twitter Profile URL for list pages i.e (https://twitter.com/bloomberg)
@@ -0,0 +1,97 @@
colorLabel: '{{count}} colors'
colorScheme: Color scheme
edit:
dimension:
calculateLabelCount: Calculate how many labels can be shown
defaultValueFootnote: Use this value for missing dimension values
defaultValueLabel: Default value
fieldLabel: Field
fieldPlaceholder: Select a dimension field
function:
date: DATE
label: Function
month: MONTH
none: (no grouping / buckets)
placeholder: Select dimension modifier (bucket size)
quarter: QUARTER
week: WEEK
year: YEAR
gaugeSteps: Steps
label: Dimensions (datetime & select fields)
skipMissingValues: Skip missing values
filter:
customize: Customize filter
label: Filters
noFilter: (no filter)
recordsCreatedLastMonth: Records created last month
recordsCreatedLastQuarter: Records created last quarter
recordsCreatedLastYear: Records created last year
recordsCreatedThisMonth: Records created this month
recordsCreatedThisQuarter: Records created this quarter
recordsCreatedThisYear: Records created this year
loadData: Load data
metric:
add: Add metric
fieldLabel: Field
fieldPlaceholder: Select metric field
fillArea: Fill area below the line
fixTooltips: Always show tooltips
function:
avg: AVG
countd: COUNTD
label: Function
max: MAX
min: MIN
placeholder: Select metric aggregate function
std: STD
sum: SUM
fx:
description: n - current dataset value, m - previous dataset value
label: Post processing function
gaugeColor: Color
label: Metric
labelColor: Label color
labelLabel: Label
labelPlaceholder: Total
legend:
bottom: Bottom
left: Left
positionPlaceholder: Legend position
right: Right
top: Top
lineTension:
curvy: Big curvatures
label: Line tension
medium: Medium curvatures
placeholder: Line tension
slight: Small curvatures
straight: Straight lines
output:
bar: Bar
doughnut: Doughnut
label: Output
line: Line
pie: Pie
placeholder: Select metric output
relative: Show relative value
relativePrecision: 'Precision:'
title: Metrics (numeric fields)
modulePick: Pick a module
title: Chart builder
unconfiguredReport: Unconfigured report
yAxis:
axisOnRight: Place axis on the right side
axisScaleFromZero: Always begin axis scale at zero
label: Y-axis
labelLabel: Axis label
labelPlaceholder: Axis label
logarithmicScale: Logarithmic scale
maxLabel: Max value
maxPlaceholder: Maximum value
minLabel: Min value
minPlaceholder: Minimum value
import: 'Import chart(s):'
newLabel: 'Create a new chart:'
newPlaceholder: Chart name
searchPlaceholder: Type here to search all charts in this namespace
title: List of Charts

Some files were not shown because too many files have changed in this diff Show More