Git Product home page Git Product logo

ever-co / ever-traduora Goto Github PK

View Code? Open in Web Editor NEW
1.9K 42.0 188.0 14.73 MB

Ever® Traduora™ - Open Translation Management Platform

Home Page: https://traduora.co

License: GNU Affero General Public License v3.0

Dockerfile 0.12% TypeScript 85.14% Shell 0.98% JavaScript 0.72% CSS 0.86% HTML 11.71% PHP 0.08% SCSS 0.39%
typescript api webapp angular self-hosted translation teams nodejs localization internationalization

ever-traduora's Introduction

Ever Traduora Platform

Gitpod Ready-to-Code Latest Release GitHub License Docker Pulls Get help on Codementor

💡 What's New

We released Ever Gauzy Teams platform for Work & Project Management.
Please check https://github.com/ever-co/ever-gauzy-teams and make it ⭐ on GitHub!
It's built with React / ReactNative stack and connects to headless Ever Gauzy Platform APIs.

🌟 What is it

Ever® Traduora - Open Translation Management Platform for teams.

Once you setup your project you can import and export your translations to various formats, work together with your team, instantly deliver translation updates over the air, and soon automatically translate your project via third-party integrations.

Traduora Product Screenshot

We want Traduora to become the home for managing your translation workflow, that's why we have made all of the core products open-source with the intention of growing a community and enabling developers to build on top of it as a platform.

We are going to also use Traduora from our other open-source platforms (currently https://github.com/ever-co/ever-gauzy and https://github.com/ever-co/ever-demand). You are welcome to check more information about the platforms at our official website - https://ever.co.

✨ Features

For a quick features review, please see our official docs screenshots page.

A short list of platform features:

  • 5-minute setup with Docker, Kubernetes, or from source
  • Find what you are looking for with an instant search
  • Invite your team, everyone can work together on the same project
  • Automate your translation workflow via our REST API
  • Import and export to your favorite formats: JSON flat and nested, CSV, YAML flat and nested, Java Properties, XLIFF 1.2, Gettext (po), Strings, Android Resources (xml).
  • Community-contributed CLI available at https://github.com/iilei/traduora-cli (not official CLI)

For more information check out our official website traduora.co, or our docs at docs.traduora.co.

Any missing feature you'd like to see? File an issue with the feature request to let us know.

📄 Documentation

Please refer to our official Platform Documentation.

📊 Activity

Alt

🚀 Try it out

Traduora can be run just about anywhere, check out our Quickstart for more info.

Also, check out Traduora's Docker Hub page for pre-built images.

Configuration and Deployment

Please check out the configuration and deployment documents for more information on deploying Traduora.

🔗 Frequently Asked Questions

Some questions come up over and over again. Be sure to check out our FAQ first!

💌 Contact Us

🔐 Security

Security is very important to us. Ever® Traduora Platform follows good security practices, but 100% security cannot be guaranteed in any software! Ever® Traduora Platform is provided AS IS without any warranty. Use at your own risk! See more details in the LICENSE.

In a production setup, all client-side to server-side (backend, APIs) communications should be encrypted using HTTPS/SSL (REST APIs).

If you discover any issue regarding security, please disclose the information responsibly by sending an email to mailto:[email protected] or on huntr and not by creating a GitHub issue.

Internationalization

Of course, we'd like Traduora to be available in as many languages as possible. We're setting up a Traduora server for translating Traduora itself, check back soon for more details on how to contribute.

Changelog

You can check our changelog for information about releases.

🛡️ License

See LICENSE.

FOSSA Status

Traduora was created by https://github.com/anthonynsimon (https://anthonynsimon.com) and contributors. In April 2021 it was moved to Ever company for future development.

™️ Trademarks

Ever® is a registered trademark of Ever Co. LTD.
Ever® Demand™, Ever® Gauzy™ and Ever® OpenSaaS™ are all trademarks of Ever Co. LTD. The trademarks may only be used with the written permission of Ever Co. LTD. and may not be used to promote or otherwise market competitive products or services.

All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders.

🍺 Contribute

We think it's great that you'd like to contribute to Traduora.

  • Please give us ⭐ on Github, it helps!
  • You are more than welcome to submit feature requests in the separate repo.
  • Pull requests are always welcome! Please base pull requests against the develop branch and follow the contribution guidelines.

💪 Thanks to our Contributors

See our contributors list in CONTRIBUTORS.md.
You can also view a full list of our contributors tracked by Github.

⭐ Star History

Star History Chart

❤️ Powered By


visitors huntr Circle CI codecov Codacy Badge DeepScan grade Known Vulnerabilities Total alerts Language grade: JavaScript FOSSA Status

ever-traduora's People

Contributors

0xflotus avatar adkif avatar alexdcox avatar anthonynsimon avatar arelstone avatar azlux avatar bai avatar bendz avatar bvenceslas avatar chiragparmar93 avatar clemherreman avatar d3v53c avatar dependabot[bot] avatar evereq avatar iilei avatar jamieslome avatar kidoncio avatar kjellspijker avatar magyarosibotond avatar rahul-rocket avatar rai69 avatar sallaberger avatar snyk-bot avatar vvadymk avatar ynuyasha avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ever-traduora's Issues

Keep History for each action

It would be great if we log every action for each item.

For example,
Who and when is changed the key or value, added, updated it.

Another action might be about restoring it from history.

Thanks.

Similar Translations

Is your feature request related to a problem? Please describe.
New Feature

Describe the solution you'd like
When viewing the terms translated to each language, next to the language could be displayed a label like "4 similar translations on this language". By clicking on it, the row could expand (or a model can be presented) and it could display equal or similar terms.

This would be great for two reasons:

  • It would help to translate similar (or equal terms) and maintain a line of language throughout the project
  • Identify duplicated and unnecessary translations

Automatic git repo sync

Is your feature request related to a problem? Please describe.
Automatic synchronization with versioned projects

Describe the solution you'd like
Ability to connect a project to a git repo on a specific branch (so developers still has to merge the branch). Using webhook, it could automatically fetch updates. When users save new translations in traduora, create a commit and push (either directly or a few minutes after last modification to have grouped commits).

Emojis

Describe the bug
Using a translation file with emojis on their translations, the web app throw an error and don't import any translation.

To Reproduce
Steps to reproduce the behavior:

  1. Use a translation file (I've used a .strings file)
  2. Import the file
  3. An error will be thrown

Expected behavior
The ideal solution is to import the translations and terms with the emojis, however, would be great if the web app could import at least the rest of the strings without throwing an error.

Environment (please complete the following information):

  • Device: Desktop
  • OS: Mac OS
  • Browser safari
  • Version 0.9.0

Apple Strings

Hi, I'm an iOS developer who just found out your project, and congrats for the idea and effort.

Apple Strings: Import & Export
It would be awesome, to import and export terms and translations using Apple Strings (.strings) files without exporting or converting to another file.

For me the current state of the platform is enough to start migrating from the current solutions to yours, the only issue, is the import options are very limited.

I've not done much research regarding this feature, however, I'm interested and available to help contributing to the project as soon as possible.

Sensitive issues with uppercase and lowercase terms (mySQL)

When importing a file, if the term contains case and space, the problem of term import failed will occur due to the problem of mySQL insensitive case and space.

example:

peterGood
petergood

An exception that already exists in the resource will be reported when importing, but in fact this is 2 different terms.

this is a very serious problem, I hope the author can pay attention to it. :(

How to deploy under NGINX subpath

Currently I have this configuration in my nginx.conf file

#configuration for my-domain
location /company {
            location ~ /traduora {
			rewrite                                /traduora/(.*)$ /$1 break;
			proxy_pass                             http://traduora:8080;
			proxy_redirect                         http://traduora:8080/ $scheme://$host/traduora/;
			proxy_set_header Host $host;
			proxy_set_header Upgrade			$http_upgrade;
			proxy_set_header Connection 		"upgrade";
			proxy_set_header Host				$host;
			proxy_set_header X-Real-IP			$remote_addr;
			proxy_set_header X-Forwarded-For	$proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto	$scheme;
			proxy_set_header X-Forwarded-Host	$host;
			proxy_set_header X-Forwarded-Port	$server_port;
			proxy_http_version 1.1;
			proxy_cache_bypass $http_upgrade;
			client_max_body_size 20M;
		}
}

I deployed standard docker image, using this configuration:

mysqldb:
    image: mysql:5.7
    container_name: "mysqldb"
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=tr_dev
      - MYSQL_USER=root
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
    volumes:
      - "/storage/mysql/traduora:/var/lib/mysql"
    networks:
      - apps
      - platforms
  traduora:
    image: traduora/traduora:latest
    container_name: "traduora"
    ports:
      - "8080:8080"
    environment:
      - TR_VIRTUAL_HOST=http://my-domain:10443/company/traduora/
      - TR_DB_HOST=mysqldb
    networks:
      - apps
      - platforms
    depends_on:
      - mysqldb

But I can't make it work. It gives me 404 while trying to load .js resources from app. What can I do?

Should I need to build a custom image from source? What changes do I need to do to make this work?

I tried to edit webapp/src/index.html to add base href and built a custom image, but api did not work (returned 404)

Support term groupping

Is your feature request related to a problem? Please describe.
Thanks the great piece of work, our team are trying to use traduora and we have about 600 terms. Given the situation, we really need someway to figure out which term use for.

so is it possible to support term group, or term tag?

Describe the solution you'd like
In term page, we can add a button called "New group", when it click, it create a new tree, and we can drag the term into group tree. Also, in translation page, we can filter by group.

Define a term to be translate with plurals

Is your feature request related to a problem? Please describe.
It's not possible to translate with plural adaptation.

Describe the solution you'd like
In the translation list it should be possible to add plural forms according to the language.
i.e In french there would be 2 fields : one for 0 and 1 cases and one for > 1 cases
These rules are defined for each language and are immutable.

Describe alternatives you've considered
At the first time maybe it should be easier to just add plural forms whith 2 forms language.

Additional context
The best example I found is the POEditor implementation :
There are tabs for each form of plural existing for this language
image

Unicode character issue

Describe the bug
Translation.value does not support unicode characters. It seems like VARCHAR does not support these special characters by default.

To Reproduce
Steps to reproduce the behavior:

  1. Add a new translation to the project: Hungarian, Romanian or Arabic.
  2. Try to translate a term in one of the mentioned languages.
  3. Enter őúüöá and hit save.
  4. No error on client side, Query error thrown on backend side.
  5. Notice that the value stays on the UI, until the page is refreshed.

Expected behavior
The value should be saved to the database.

Log

[0] { QueryFailedError: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xC5\xB1\xC3\xA9' for column 'value' at row 1
[0]     at new QueryFailedError (/Users/<User>/Documents/open-source/traduora/api/src/error/QueryFailedError.ts:9:9)
[0]     at Query.<anonymous> (/Users/<User>/Documents/open-source/traduora/api/src/driver/mysql/MysqlQueryRunner.ts:163:37)
[0]     at Query.<anonymous> (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/Connection.js:502:10)
[0]     at Query._callback (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/Connection.js:468:16)
[0]     at Query.Sequence.end (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
[0]     at Query.ErrorPacket (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/protocol/sequences/Query.js:90:8)
[0]     at Protocol._parsePacket (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/protocol/Protocol.js:278:23)
[0]     at Parser.write (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/protocol/Parser.js:76:12)
[0]     at Protocol.write (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/protocol/Protocol.js:38:16)
[0]     at Socket.<anonymous> (/Users/<User>/Documents/open-source/traduora/api/node_modules/mysql/lib/Connection.js:91:28)
[0]   message:
[0]    'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: \'\\xC5\\xB1\\xC3\\xA9\' for column \'value\' at row 1',
[0]   code: 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD',
[0]   errno: 1366,
[0]   sqlMessage:
[0]    'Incorrect string value: \'\\xC5\\xB1\\xC3\\xA9\' for column \'value\' at row 1',
[0]   sqlState: 'HY000',
[0]   index: 0,
[0]   sql:
[0]    'INSERT INTO `translation`(`termId`, `projectLocaleId`, `value`, `dateCreated`, `dateModified`) VALUES (\'02016f40-666a-4048-9b73-b5aa45cd3663\', \'b7c304e9-a384-4486-902e-38fdc001115a\', \'űé\', DEFAULT, DEFAULT)',
[0]   name: 'QueryFailedError',
[0]   query:
[0]    'INSERT INTO `translation`(`termId`, `projectLocaleId`, `value`, `dateCreated`, `dateModified`) VALUES (?, ?, ?, DEFAULT, DEFAULT)',
[0]   parameters:
[0]    [ '02016f40-666a-4048-9b73-b5aa45cd3663',
[0]      'b7c304e9-a384-4486-902e-38fdc001115a',
[0]      'űé' ] }
[0] 127.0.0.1 - PATCH /api/v1/projects/744ae9c4-54ee-421d-a135-5e03845ff774/translations/ar_AE HTTP/1.1 500 83 - 282.020 ms

Environment (please complete the following information):

  • Device: Desktop
  • OS: Mac OS 10.14.3
  • Browser: Safari
  • Version: 12.0.3

Additional context
Running bin/start-dev.sh with a mysql/mysql:5.7 container.

API documentation

I'm use zanata with own project, but it slow... I want to replace it with traduora, but it lacks client and api. Do you plan to add it?

Run compose catch error "duplicate column name"

Describe the bug
run docker-compose up, and catch error:

traduora_1  | (node:1) UnhandledPromiseRejectionWarning: QueryFailedError: ER_DUP_FIELDNAME: Duplicate column name 'tosAndPrivacyAcceptedDate'                     
traduora_1  |     at new QueryFailedError (/opt/traduora/node_modules/typeorm/error/QueryFailedError.js:11:28)                                                    traduora_1  |     at Query.<anonymous> (/opt/traduora/node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:169:45)                                                traduora_1  |     at Query.<anonymous> (/opt/traduora/node_modules/mysql/lib/Connection.js:525:10)                                                                 traduora_1  |     at Query._callback (/opt/traduora/node_modules/mysql/lib/Connection.js:491:16)                                                                   traduora_1  |     at Query.Sequence.end (/opt/traduora/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)                                                traduora_1  |     at Query.ErrorPacket (/opt/traduora/node_modules/mysql/lib/protocol/sequences/Query.js:90:8)                                                     traduora_1  |     at Protocol._parsePacket (/opt/traduora/node_modules/mysql/lib/protocol/Protocol.js:291:23)                                                      traduora_1  |     at Parser._parsePacket (/opt/traduora/node_modules/mysql/lib/protocol/Parser.js:433:10)                                                          traduora_1  |     at Parser.write (/opt/traduora/node_modules/mysql/lib/protocol/Parser.js:43:10)                                                                  traduora_1  |     at Protocol.write (/opt/traduora/node_modules/mysql/lib/protocol/Protocol.js:38:16)                                                              traduora_1  | (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)                                                                    traduora_1  | (node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 

To Reproduce
run docker-compose up.

Environment

  • OS: Windows 10
  • Version 0.12.0

Support for PostgreSQL

Is your feature request related to a problem? Please describe.
Our stack is based on PostgreSQL as our primary datastore. We would love to use one of the existing server instances for our Traduora deployment instead of having to provision a MySQL instance just for it.

Describe the solution you'd like
Ideally, since TypeORM supports different database systems, we could find a way to keep Traduora agnostic and let the users pick the database they want.

Describe alternatives you've considered
I could fork the repo and replace MySQL's config with Postgre's one, but it would be hacky and less useful for other users.

I'm willing to try and implement this if there is enough interest from the community and the maintainers.

Upvote & Fund

  • We're using Polar.sh so you can upvote and help fund this issue.
  • We receive the funding once the issue is completed & confirmed by you.
  • Thank you in advance for helping prioritize & fund our backlog.
Fund with Polar

Terms search issue

Describe the bug
I encounter a problem when I search a "Term" (a translation Key)
My keys take this form MY_TRANSLATION_KEY

To Reproduce
Steps to reproduce the behavior:

  1. Go to Terms
  2. Click on the search input
  3. Enter a character (A LETTER ! Numbers oddly seem to work, if the key contains MY_TRANSLATION_3, typing 3 will be found)
  4. No result if I enter MY, even M...

Expected behavior
It should find the key by typing letters

Screenshots
Initial state
image
Searching with 'A' letter
image
Searching with '3' number
image

** Environment: **

  • Device: MSI GP62MVR (7RF Leopard Pro) (I think it does not really matter)
  • OS: Ubuntu 16.10 Yakkety Yak
  • Browser: Chrome
  • Version: Version 77.0.3865.90 (64 bit)

"ER_TOO_LONG_KEY" causes crash when starting container

Hey there! I'm currently setting up Traduora as my first docker application and set up a start command with all important envroinment variables it doesn't work, when I look at the logs of the docker container, there is an error after "Running DB migrations if necessary":

(node:1) UnhandledPromiseRejectionWarning: QueryFailedError: ER_TOO_LONG_KEY: Specified key was too long; max key length is 767 bytes
    at new QueryFailedError (/opt/traduora/node_modules/typeorm/error/QueryFailedError.js:11:28)
    at Query.<anonymous> (/opt/traduora/node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:169:45)
    at Query.<anonymous> (/opt/traduora/node_modules/mysql/lib/Connection.js:525:10)
    at Query._callback (/opt/traduora/node_modules/mysql/lib/Connection.js:491:16)
    at Query.Sequence.end (/opt/traduora/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
    at Query.ErrorPacket (/opt/traduora/node_modules/mysql/lib/protocol/sequences/Query.js:90:8)
    at Protocol._parsePacket (/opt/traduora/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/opt/traduora/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/opt/traduora/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/opt/traduora/node_modules/mysql/lib/protocol/Protocol.js:38:16)
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

So I looked if I could find any issue about this, but there seems to be nobody having this problem. Does anyone know what causes this? I see that something is too long, but I don't know what key is talked about in this error.

Improvement to translations page.

Dear team,

I was curios if it would be possible to add two features to the translations page.

  • Allow the user to navigate to the next term with keyboard (TAB or arrow keys).
  • Add a save all button to avoid forgetting to save a translation.

Kind regards,
Keep up the good work.

Configurable Plans

Is your feature request related to a problem? Please describe.
I can't seem to find how to manage plans, either in the UI or in the API

Describe the solution you'd like
As a system administrator I would like to be able to create and manage plans and quotas, and to assign them to projects

Describe alternatives you've considered
At the moment the default is the open-source plan, which has only 100k strings

Consistent translation export

Is your feature request related to a problem? Please describe.
I have imported our properties files and then exported it again. The terms were exported in quite random way. This makes it hard to track changes between two versions.

Describe the solution you'd like
Ideally the order of terms after export would remain the same as in the imported file. This should apply also for other languages.

Describe alternatives you've considered
As it might be "hard" to manage order of items (also in case when someone add terms via GUI) alphabetical order of terms (in UI and exports) will improve the predictability to the exported files.

why abandoned parrot

hi there,

Nice project I am curious to know why you abandoned parrot, also why did you switch the api to node from go any particular reason

Thank you for this awsome project!

[discussion] expand on OAuth

As #41 is closed and thanks to #44 I am ready to extend the oAuth provider possibilities.

Within this issue I hope to gather feedback regarding the planned implementation.

Configuration

As configuring everything with env-vars tends to get a bit flimsy I would like to implement the config for auth-providers by utilizing a .traduorarc file cosmiconfig

Possibly the cosmiconfig might be merged with config obtained by habitat to let secrets be managed via env vars still. (option 1.a)

Another option would be providing a cosmiconfig example which picks up process.env vars by itself, as it might be a traduora.config.js (option 1.b) - this would obviously add fewer dependencies.

Preparing parsing of traduora.config.js

As I think using cosmiconfig with traduora.config.js would be the most convenient way to set up / add / alter auth providers, the same config could also be utilzed for the rest of traduora config.

For the scope of the merge request I would solely care about [optional] authProviders within the traduora.config.js file.

If you wish I can start with a small merge request by the title Add cosmiconfig utilization or similar so the change set is a bit smaller. The envisioned merge request to Add auth providers (TBD) will be a follow-up then.

For ease of use I'd add a traduora.config.js.example file that defines nothing, just has comments in it providing guidance. traduora.config.js would be a .gitignore´d file, so it comes with no risk of accidental disclosure of confidential information.

Thoughts, @anthonynsimon ?

To add components to the project

many bigger projects are divided into components, that are relatively independent

Components may have life cycle different from each other and translations must follow this life cycle. It woult be useful Traduora be able to create another level - for example "component" that may be managet relatively independently.

  • component own own files may be exported
  • all project component files may be projectexported at once
  • components will be optional; if I want, i may work at project level, or create components and work with them

Being able to change the filename of exported files

Is your feature request related to a problem? Please describe.
When exporting the translation files in traduora, they are currently exported as e.g. de_DE.strings. It would be great if it would be possible to change the default name so that the exported files can directly replace e.g. the files inside the xCode project. It would also be nice to get all files for each language at once in a zip file.

Describe the solution you'd like
In Project settings, add the possibility to change the export filename format. For a xCode Swift project the expected structure is:

  • de.lproj/Localizable.strings
  • de.lproj/Main.strings
  • fr.lproj/Localizable.strings
  • fr.lproj/Main.strings

So also a re-mapping from "de_DE" to "de" as prefix would need to be possible.

Export to Java Properties charset issue

Describe the bug
Exporting to Java properties won't escape accented characters.

To Reproduce
Steps to reproduce the behavior:

  1. Add few translations with accented characters (é, è, ê, ...)
  2. Export as Java properties

Expected behavior
A Java properties file in the ISO-8859-1 charset. (é becomes \u00E9)

Actual behavior
A Java properties file without escaped accented characters. (é is still é)

Screenshots
Screenshot 01

Environment

  • Device: Desktop
  • OS: Arch
  • Browser: Brave; Version 0.60.48 Chromium: 72.0.3626.121 (Official Build) (64-bit)
  • Version: v0.8.7

Additional context
Java Properties JavaDoc: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Properties.html

Multiple columns with translation strings (more than the current 2)

Is your feature request related to a problem? Please describe.
New Feature / Improvement

Describe the solution you'd like
Multiple columns for strings.
Currently, we have only the option to present 2 columns in the UI, it would be great to add more.
This would allow the comparison and edition of the strings for multiple languages at the same time.

Display project's translation rate

Is your feature request related to a problem? Please describe.
No, just a way to have a better view of the project translation progress.

Describe the solution you'd like
It could be displayed on multiple components:

  • On the left sidebar, near the project title. This would represent the global translation rate, all locales together (number of translations / number of terms * number of locales)
  • On the translations view, on each locale card. This would represent the number of translated terms / number of terms
  • On the terms view, on each term card. This would represent the number of translated locales for this term / number of locales

I unfortunately don't manage to setup my environment to work on it...
Thanks!

Invalidate translations

Is your feature request related to a problem? Please describe.
When working in teams we often face the problem of notifying translators when the base localization changes. With the current setup when a translation is updated (or changed via import) someone has to go through all the locales and clear the content of the changes terms.
This is not scalable when multiple things change.

Describe the solution you'd like
Introduce a new field to the term column which gets invalidated (valid = false) when a value of a locale is updated (import only?). This validity can be double checked by the translators. The key might be more useful on the translation because each translations might have to be verified one by one.

Describe alternatives you've considered
Check out how PhraseApp does this.

Additional context

  • N/A

Teams / Organizations

Is your feature request related to a problem? Please describe.
Managing users on a team or organization level (instead of project level) could refine user and billing management for teams. The cloud version of Traduora could also benefit from this.

Describe the solution you'd like
I'd change the hierarchy as follows:

class Team {
  members: [TeamMember]
  projects: [Project]
  ...
}

class TeamMember {
  role: Role
  user: User
  ...
}

Add OAuth

Is your feature request related to a problem? Please describe.

  • Individual passwords for a variety of services lead many people to chose weak / same passwords over and over again.

Describe the solution you'd like
As administrator I would like the possibility to activate "login with "
with options like

  • keycloak (opinionated preference)
  • github
  • facebook
  • paypal
  • linkedin
  • bitbucket

And as a new user who is onboarding I would like to be able to register using one of the options besides the existing option (email)

Describe alternatives you've considered
As OAuth seems to be a widely adopted standard, no other options considered

Additional context
Personally I would be using keycloak if possible.

System wide user management

With the current setup user and resource management can get out of hand by letting anyone sign up and create projects. Disabling registration will also forbid new users to join.
Another issue I have is to list all users and projects created on the platform.

A solution would be to introduce global user and role management:

  • member: see own and participating projects
  • admin: see all projects
  • superadmin: see and manage users.
    Roles and permissions should be clarified.

While the global user management might be a good idea for the self-hosted it might not suite the cloud version.

To better suite the cloud version the concept of teams could be a good idea and have the same user management mentioned above.

One other alternative would be to keep the current user model and create a invitations table to store non registered email addresses when added to a project.
A new user should be able to accept invites via email and see all pending invites when signed up.

I'd be more than happy to help!

raise ER_TRUNCATED_WRONG_VALUE_FOR_FIELD when CHINESE value insert

Describe the bug
i install traduora through Docker on my ubuntu VM,
when i insert a chinese value for a term,
raise error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD

DETAIL

traduora_1  | { QueryFailedError: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xE6\xA0\x87\xE9\xA2\x98' for column 'value' at row 1
traduora_1  |     at new QueryFailedError (/opt/traduora/node_modules/typeorm/error/QueryFailedError.js:28:28)
traduora_1  |     at Query.<anonymous> (/opt/traduora/node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:227:45)
traduora_1  |     at Query.<anonymous> (/opt/traduora/node_modules/mysql/lib/Connection.js:502:10)
traduora_1  |     at Query._callback (/opt/traduora/node_modules/mysql/lib/Connection.js:468:16)
traduora_1  |     at Query.Sequence.end (/opt/traduora/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
traduora_1  |     at Query.ErrorPacket (/opt/traduora/node_modules/mysql/lib/protocol/sequences/Query.js:90:8)
traduora_1  |     at Protocol._parsePacket (/opt/traduora/node_modules/mysql/lib/protocol/Protocol.js:278:23)
traduora_1  |     at Parser.write (/opt/traduora/node_modules/mysql/lib/protocol/Parser.js:76:12)
traduora_1  |     at Protocol.write (/opt/traduora/node_modules/mysql/lib/protocol/Protocol.js:38:16)
traduora_1  |     at Socket.<anonymous> (/opt/traduora/node_modules/mysql/lib/Connection.js:91:28)
traduora_1  |   message:
traduora_1  |    'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: \'\\xE6\\xA0\\x87\\xE9\\xA2\\x98\' for column \'value\' at row 1',
traduora_1  |   code: 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD',
traduora_1  |   errno: 1366,
traduora_1  |   sqlMessage:
traduora_1  |    'Incorrect string value: \'\\xE6\\xA0\\x87\\xE9\\xA2\\x98\' for column \'value\' at row 1',
traduora_1  |   sqlState: 'HY000',
traduora_1  |   index: 0,
traduora_1  |   sql:
traduora_1  |    'UPDATE `translation` SET `value` = \'标题\', `dateModified` = CURRENT_TIMESTAMP WHERE `termId` = \'4e9a56c9-6a9d-4b16-9805-27c0ac9bdde5\' AND `projectLocaleId` = \'63525e09-b321-4752-9abf-b4a8b415c74d\'',
traduora_1  |   name: 'QueryFailedError',
traduora_1  |   query:
traduora_1  |    'UPDATE `translation` SET `value` = ?, `dateModified` = CURRENT_TIMESTAMP WHERE `termId` = ? AND `projectLocaleId` = ?',
traduora_1  |   parameters:
traduora_1  |    [ '标题',
traduora_1  |      '4e9a56c9-6a9d-4b16-9805-27c0ac9bdde5',
traduora_1  |      '63525e09-b321-4752-9abf-b4a8b415c74d' ] }

Bulk import/export

Describe the solution you'd like

Import:

  • Add excel file supports. Structure can be like this:
    image

Export:

  • Add Multi-file export. Like this:

image

The exported file can be zip file. There are multiple folders in the ZIP file, the folder is named (e.g: zh-CN), and translation files in different languages can be placed in different folders.

  • Add export file format(xml & xaml)

Support for longer terms

Is your feature request related to a problem? Please describe.
I am currently trying to translate a application. There are tons of larger term e.g. email templates or pdf templates which have to be translated.
At the moment I cant import them into traduora as the terms are to long for the DB field.
From what I found out is that the value field in the terms table cant grow in size because of the index which is required for the unique.

Describe the solution you'd like
Maybe a hash can be generated from the term value which is then used for the unique. With this solution we might be able to have larger terms.

Support for Oracle Databases

Is your feature request related to a problem? Please describe.
We have several large systems that use Oracle databases. We'd like to only run Oracle instances in our server, however, Traduora seems a quite interesting system to start using.

Describe the solution you'd like
Would it be ever possible to make Traduora support Oracle databases?

Additional context
Since it uses TypeOrm, I guess the effort would be only to optimize the Entities and migrations to support Oracle.

No repository for "User" was found.

Describe the bug
On app start, I receive this error.

To Reproduce
Steps to reproduce the behavior:

  1. Follow steps in installation from the source instruction
  2. Run app

Expected behavior
App will run

** Environment (please complete the following information):**

  • Device: Desktop
  • OS: MacOS 10.13.6

Additional context
[Nest] 1501 - 2019-3-12 17:38:27 [NestFactory] Starting Nest application...
[Nest] 1501 - 2019-3-12 17:38:27 [InstanceLoader] PassportModule dependencies initialized +101ms
[Nest] 1501 - 2019-3-12 17:38:27 [InstanceLoader] TypeOrmModule dependencies initialized +0ms
[Nest] 1501 - 2019-3-12 17:38:27 [InstanceLoader] JwtModule dependencies initialized +0ms
[Nest] 1501 - 2019-3-12 17:38:28 [InstanceLoader] TypeOrmCoreModule dependencies initialized +70ms
[Nest] 1501 - 2019-3-12 17:38:28 [ExceptionHandler] No repository for "User" was found. Looks like this entity is not registered in current "default" connection? +1ms
RepositoryNotFoundError: No repository for "User" was found. Looks like this entity is not registered in current "default" connection?
at new RepositoryNotFoundError (/Users/mac/Projects/traduora/dist/node_modules/typeorm/error/RepositoryNotFoundError.js:20:28)

View over all translations of selected term

Currently only view over translations is possible - i.e. i can select only a locale and view / change all terms in the selected language.

It would be useful to be able to select a term and show / change all its translations at once (i.e. to be able to change all language variants of selected key on a single page)

Also it would be useful to be able to add new key on such page - it will be add to all languages and default values (or no values) will be shown.

A resource with this value already exists. Please use a different one

Im trying to import a .po file but im getting an error (screenshot attachment)
"A resource with this value already exists. Please use a different one."

Im using po edit to generate the po file from source

And here is some contents of the .po file im trying to importing:

msgid ""
msgstr ""
"Project-Id-Version:Test\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-24 11:17+0300\n"
"PO-Revision-Date: 2019-10-24 11:18+0300\n"
"Last-Translator: Chris [email protected]\n"
"Language-Team: Test [email protected]\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-KeywordsList: T_;_;gettext;gettext_noop\n"
"X-Poedit-Basepath: ../../..\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Generator: Poedit 2.1.1\n"
"X-Poedit-SearchPath-0: .\n"
"X-Poedit-SearchPath-1: includes\n"

#: 404.php:12 404.php:50
msgid ""
"Μπορεί να έχετε πληκτρολογήσει εσφαλμένα τη διεύθυνση URL Ή η σελίδα έχει "
"καταργηθεί"
msgstr "You may have entered the URL incorrectly OR the page has been removed"

#: agency-list.php:9
msgid "Λίστα Μεσιτών, Μεσιτικά Γραφεία"
msgstr "List of Realtors, Real Estate Agents"

#: agency-list.php:14
msgid "Βρείτε μεσιτικό γραφείο στην περιοχή σας"
msgstr "Find a real estate agency in your area"

#: agency-list.php:148 includes/slider.php:163 index.php:264 index.php:594
#: results.php:1181 results.php:1326
msgid "Βρέθηκαν"
msgstr "found"

#: agency-list.php:148
msgid "ενεργά γραφεία"
msgstr "Description"

#: agency-list.php:256 results.php:1192
#, fuzzy
#| msgid "Επιλέξτε Υποκατηγορία"
msgid "Ακίνητα ανα κατηγορία"
msgstr "Category"

#: agency-list.php:286 property.php:1105 results.php:1222
#, fuzzy
#| msgid "Μονοκατοικία"
msgid "Κατοικίες"
msgstr "Detached house"

#: agency-list.php:287 property.php:1106 results.php:1223
#, fuzzy
#| msgid "Επαγγελματικό"
msgid "Επαγγελματικοί Χώροι"
msgstr "Rooms"

err

Present terms requiring translation

Is your feature request related to a problem? Please describe.
New Feature.
Quickly understand what languages have terms without translation (and how many)

Describe the solution you'd like
In the menu "Translations", when viewing the list of the languages, next to the language label (on the right), could be displayed something like "25 terms requiring translation".
image

This would help users quickly understand where they should focus their attention.

Mark translations that need further work/revision

Is your feature request related to a problem? Please describe.
New feature improvement

Describe the solution you'd like
Flag translations that require further work/revision so that users can quickly understand and filter by strings that may require further attention or revision from him or other users within the project.
Users would be able to filter by these strings
These strings would be highlighted in another color (orange for example) or with a warning signal.
When selecting a project, users would understand how many strings are requiring work/revision.

Maximum term length is 255 characters

Is your feature request related to a problem? Please describe.
This project really look awesome but I won't be able to use it without the add of the JSON with plaintext keys format support. Using the JSON flat format doesn't work for me as I get a 500 Internal Server Error.

Describe the solution you'd like
Support translation files formatted like this one:

{
    "Project": "Projekt",
    "Name of the project.": "Name des Projekts",
    "Empty! No entries added yet.": "Leer! Es sind noch keine Einträge vorhanden.",
    "Ok.": "Ok."
}

Describe alternatives you've considered
Rewrite all of my templates 😂 I'm well aware this format isn't the most appropriate one but it's the one I use since 4 years on my project.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.