Compare commits
14 Commits
develop
...
l10n_local
Author | SHA1 | Date |
---|---|---|
|
3f3a602f57 | 2 years ago |
|
fae7e0e88c | 2 years ago |
|
fb72be0b6b | 2 years ago |
|
0a05ee87cf | 2 years ago |
|
bfdd6086d6 | 2 years ago |
|
3444a0f7b1 | 2 years ago |
|
e4edbd2735 | 2 years ago |
|
9c9333a07d | 2 years ago |
|
5f8aca8d51 | 2 years ago |
|
8fdc8b1e79 | 2 years ago |
|
3d741015fd | 2 years ago |
|
cf1f46fa5e | 2 years ago |
|
8497c3f60b | 2 years ago |
|
1c8b9d0728 | 2 years ago |
17 changed files with 1745 additions and 59 deletions
@ -0,0 +1,55 @@ |
|||||||
|
name: Translation job |
||||||
|
|
||||||
|
on: |
||||||
|
push: |
||||||
|
paths: |
||||||
|
- 'web/i18n/strings.json' |
||||||
|
- 'web/**/*.tsx' |
||||||
|
- 'web/**/*.js' |
||||||
|
- 'crowdin.yml' |
||||||
|
- '.github/workflows/translations.yml' |
||||||
|
- 'web/i18next-parser.config.mjs' |
||||||
|
|
||||||
|
concurrency: |
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} |
||||||
|
cancel-in-progress: true |
||||||
|
|
||||||
|
jobs: |
||||||
|
generate-translations: |
||||||
|
defaults: |
||||||
|
run: |
||||||
|
working-directory: ./web |
||||||
|
|
||||||
|
runs-on: ubuntu-latest |
||||||
|
|
||||||
|
steps: |
||||||
|
- uses: actions/checkout@v4 |
||||||
|
|
||||||
|
- name: Install dependencies |
||||||
|
if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' }} |
||||||
|
run: npm install |
||||||
|
|
||||||
|
- name: Generate translation files |
||||||
|
run: npm run translate |
||||||
|
|
||||||
|
- name: Commit changes |
||||||
|
uses: EndBug/add-and-commit@v9 |
||||||
|
with: |
||||||
|
author_name: Owncast |
||||||
|
author_email: owncast@owncast.online |
||||||
|
message: 'Commit updated translations' |
||||||
|
add: 'web/i18n/**' |
||||||
|
env: |
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
||||||
|
|
||||||
|
- name: Crowdin action |
||||||
|
uses: crowdin/github-action@v1 |
||||||
|
with: |
||||||
|
upload_sources: true |
||||||
|
download_translations: true |
||||||
|
localization_branch_name: translations |
||||||
|
config: crowdin.yml |
||||||
|
env: |
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
||||||
|
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} |
||||||
|
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} |
@ -0,0 +1,10 @@ |
|||||||
|
'pull_request_title': 'Translations update' |
||||||
|
'pull_request_labels': ['crowdin', 'i18n'] |
||||||
|
'commit_message': 'Updated translations' |
||||||
|
|
||||||
|
files: |
||||||
|
- source: /web/i18n/strings.json |
||||||
|
translation: /web/i18n/%two_letters_code%.json |
||||||
|
|
||||||
|
project_id_env: CROWDIN_PROJECT_ID |
||||||
|
api_token_env: CROWDIN_PERSONAL_TOKEN |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"Notify": "Notify", |
||||||
|
"Powered by Owncast": "Powered by Owncast", |
||||||
|
"Documentation": "Documentation", |
||||||
|
"Contribute": "Contribute", |
||||||
|
"Source": "Source", |
||||||
|
"Skip to player": "Skip to player", |
||||||
|
"Skip to offline message": "Skip to offline message", |
||||||
|
"Skip to page content": "Skip to page content", |
||||||
|
"Skip to footer": "Skip to footer", |
||||||
|
"Chat is offline": "Chat is offline", |
||||||
|
"Stay updated!": "Stay updated!", |
||||||
|
"Click and never miss future streams!": "Click and never miss future streams!", |
||||||
|
"This stream is offline": "This stream is offline.", |
||||||
|
"the next time goes live": "the next time goes live", |
||||||
|
"Follow": "Follow", |
||||||
|
"on the Fediverse to see the next time goes live": "on the Fediverse to see the next time goes live", |
||||||
|
"Last live ago": "Last live ago" |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"Notify": "Notify", |
||||||
|
"Powered by Owncast": "Powered by Owncast", |
||||||
|
"Documentation": "Documentation", |
||||||
|
"Contribute": "Contribute", |
||||||
|
"Source": "Source", |
||||||
|
"Skip to player": "Skip to player", |
||||||
|
"Skip to offline message": "Skip to offline message", |
||||||
|
"Skip to page content": "Skip to page content", |
||||||
|
"Skip to footer": "Skip to footer", |
||||||
|
"Chat is offline": "Chat is offline", |
||||||
|
"Stay updated!": "Stay updated!", |
||||||
|
"Click and never miss future streams!": "Click and never miss future streams!", |
||||||
|
"This stream is offline": "This stream is offline.", |
||||||
|
"the next time goes live": "the next time goes live", |
||||||
|
"Follow": "Follow", |
||||||
|
"on the Fediverse to see the next time goes live": "on the Fediverse to see the next time goes live", |
||||||
|
"Last live ago": "Last live ago" |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"Notify": "Notify", |
||||||
|
"Powered by Owncast": "Powered by Owncast", |
||||||
|
"Documentation": "Documentation", |
||||||
|
"Contribute": "Contribute", |
||||||
|
"Source": "Source", |
||||||
|
"Skip to player": "Skip to player", |
||||||
|
"Skip to offline message": "Skip to offline message", |
||||||
|
"Skip to page content": "Skip to page content", |
||||||
|
"Skip to footer": "Skip to footer", |
||||||
|
"Chat is offline": "Chat is offline", |
||||||
|
"Stay updated!": "Stay updated!", |
||||||
|
"Click and never miss future streams!": "Click and never miss future streams!", |
||||||
|
"This stream is offline": "This stream is offline.", |
||||||
|
"the next time goes live": "the next time goes live", |
||||||
|
"Follow": "Follow", |
||||||
|
"on the Fediverse to see the next time goes live": "on the Fediverse to see the next time goes live", |
||||||
|
"Last live ago": "Last live ago" |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"Notify": "Notify", |
||||||
|
"Powered by Owncast": "Powered by Owncast", |
||||||
|
"Documentation": "Documentation", |
||||||
|
"Contribute": "Contribute", |
||||||
|
"Source": "Source", |
||||||
|
"Skip to player": "Skip to player", |
||||||
|
"Skip to offline message": "Skip to offline message", |
||||||
|
"Skip to page content": "Skip to page content", |
||||||
|
"Skip to footer": "Skip to footer", |
||||||
|
"Chat is offline": "Chat is offline", |
||||||
|
"Stay updated!": "Stay updated!", |
||||||
|
"Click and never miss future streams!": "Click and never miss future streams!", |
||||||
|
"This stream is offline": "This stream is offline.", |
||||||
|
"the next time goes live": "the next time goes live", |
||||||
|
"Follow": "Follow", |
||||||
|
"on the Fediverse to see the next time goes live": "on the Fediverse to see the next time goes live", |
||||||
|
"Last live ago": "Last live ago" |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
const en = require('./en.json'); |
||||||
|
const es = require('./es.json'); |
||||||
|
const de = require('./de.json'); |
||||||
|
const fr = require('./fr.json'); |
||||||
|
|
||||||
|
const i18n = { |
||||||
|
translations: { |
||||||
|
en, |
||||||
|
es, |
||||||
|
de, |
||||||
|
fr, |
||||||
|
}, |
||||||
|
defaultLang: 'en', |
||||||
|
useBrowserDefault: true, |
||||||
|
// optional property, will default to "query" if not set
|
||||||
|
languageDataStore: 'query' || 'localStorage', |
||||||
|
}; |
||||||
|
|
||||||
|
module.exports = i18n; |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"Notify": "Notify", |
||||||
|
"Powered by Owncast": "Powered by Owncast", |
||||||
|
"Documentation": "Documentation", |
||||||
|
"Contribute": "Contribute", |
||||||
|
"Source": "Source", |
||||||
|
"Skip to player": "Skip to player", |
||||||
|
"Skip to offline message": "Skip to offline message", |
||||||
|
"Skip to page content": "Skip to page content", |
||||||
|
"Skip to footer": "Skip to footer", |
||||||
|
"Chat is offline": "Chat is offline", |
||||||
|
"Stay updated!": "Stay updated!", |
||||||
|
"Click and never miss future streams!": "Click and never miss future streams!", |
||||||
|
"This stream is offline": "This stream is offline.", |
||||||
|
"the next time goes live": "the next time goes live", |
||||||
|
"Follow": "Follow", |
||||||
|
"on the Fediverse to see the next time goes live": "on the Fediverse to see the next time goes live", |
||||||
|
"Last live ago": "Last live ago" |
||||||
|
} |
@ -0,0 +1,113 @@ |
|||||||
|
// i18next-parser.config.js
|
||||||
|
|
||||||
|
export default { |
||||||
|
contextSeparator: '_', |
||||||
|
// Key separator used in your translation keys
|
||||||
|
|
||||||
|
createOldCatalogs: true, |
||||||
|
// Save the \_old files
|
||||||
|
|
||||||
|
defaultNamespace: 'translation', |
||||||
|
// Default namespace used in your i18next config
|
||||||
|
|
||||||
|
defaultValue: function (locale, namespace, key, value) { |
||||||
|
return `${key}`; |
||||||
|
}, // Default value to give to keys with no value
|
||||||
|
// You may also specify a function accepting the locale, namespace, key, and value as arguments
|
||||||
|
|
||||||
|
indentation: 2, |
||||||
|
// Indentation of the catalog files
|
||||||
|
|
||||||
|
keepRemoved: false, |
||||||
|
// Keep keys from the catalog that are no longer in code
|
||||||
|
// You may either specify a boolean to keep or discard all removed keys.
|
||||||
|
// You may also specify an array of patterns: the keys from the catalog that are no long in the code but match one of the patterns will be kept.
|
||||||
|
// The patterns are applied to the full key including the namespace, the parent keys and the separators.
|
||||||
|
|
||||||
|
keySeparator: '.', |
||||||
|
// Key separator used in your translation keys
|
||||||
|
// If you want to use plain english keys, separators such as `.` and `:` will conflict. You might want to set `keySeparator: false` and `namespaceSeparator: false`. That way, `t('Status: Loading...')` will not think that there are a namespace and three separator dots for instance.
|
||||||
|
|
||||||
|
// see below for more details
|
||||||
|
lexers: { |
||||||
|
hbs: ['HandlebarsLexer'], |
||||||
|
handlebars: ['HandlebarsLexer'], |
||||||
|
|
||||||
|
htm: ['HTMLLexer'], |
||||||
|
html: ['HTMLLexer'], |
||||||
|
|
||||||
|
mjs: ['JavascriptLexer'], |
||||||
|
js: ['JavascriptLexer'], // if you're writing jsx inside .js files, change this to JsxLexer
|
||||||
|
ts: ['JavascriptLexer'], |
||||||
|
jsx: ['JsxLexer'], |
||||||
|
tsx: ['JsxLexer'], |
||||||
|
|
||||||
|
default: ['JavascriptLexer'], |
||||||
|
}, |
||||||
|
|
||||||
|
lineEnding: 'auto', |
||||||
|
// Control the line ending. See options at https://github.com/ryanve/eol
|
||||||
|
|
||||||
|
locales: ['en'], |
||||||
|
// An array of the locales in your applications
|
||||||
|
|
||||||
|
namespaceSeparator: ':', |
||||||
|
// Namespace separator used in your translation keys
|
||||||
|
// If you want to use plain english keys, separators such as `.` and `:` will conflict. You might want to set `keySeparator: false` and `namespaceSeparator: false`. That way, `t('Status: Loading...')` will not think that there are a namespace and three separator dots for instance.
|
||||||
|
|
||||||
|
output: 'i18n/strings.json', |
||||||
|
// Supports $LOCALE and $NAMESPACE injection
|
||||||
|
// Supports JSON (.json) and YAML (.yml) file formats
|
||||||
|
// Where to write the locale files relative to process.cwd()
|
||||||
|
|
||||||
|
pluralSeparator: '_', |
||||||
|
// Plural separator used in your translation keys
|
||||||
|
// If you want to use plain english keys, separators such as `_` might conflict. You might want to set `pluralSeparator` to a different string that does not occur in your keys.
|
||||||
|
// If you don't want to generate keys for plurals (for example, in case you are using ICU format), set `pluralSeparator: false`.
|
||||||
|
|
||||||
|
input: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'], |
||||||
|
// An array of globs that describe where to look for source files
|
||||||
|
// relative to the location of the configuration file
|
||||||
|
|
||||||
|
sort: false, |
||||||
|
// Whether or not to sort the catalog. Can also be a [compareFunction](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#parameters)
|
||||||
|
|
||||||
|
verbose: false, |
||||||
|
// Display info about the parsing including some stats
|
||||||
|
|
||||||
|
failOnWarnings: false, |
||||||
|
// Exit with an exit code of 1 on warnings
|
||||||
|
|
||||||
|
failOnUpdate: false, |
||||||
|
// Exit with an exit code of 1 when translations are updated (for CI purpose)
|
||||||
|
|
||||||
|
customValueTemplate: null, |
||||||
|
// If you wish to customize the value output the value as an object, you can set your own format.
|
||||||
|
// ${defaultValue} is the default value you set in your translation function.
|
||||||
|
// Any other custom property will be automatically extracted.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// {
|
||||||
|
// message: "${defaultValue}",
|
||||||
|
// description: "${maxLength}", // t('my-key', {maxLength: 150})
|
||||||
|
// }
|
||||||
|
|
||||||
|
resetDefaultValueLocale: null, |
||||||
|
// The locale to compare with default values to determine whether a default value has been changed.
|
||||||
|
// If this is set and a default value differs from a translation in the specified locale, all entries
|
||||||
|
// for that key across locales are reset to the default value, and existing translations are moved to
|
||||||
|
// the `_old` file.
|
||||||
|
|
||||||
|
// i18nextOptions: { returnDetails: true, lng: '$LOCALE' },
|
||||||
|
// If you wish to customize options in internally used i18next instance, you can define an object with any
|
||||||
|
// configuration property supported by i18next (https://www.i18next.com/overview/configuration-options).
|
||||||
|
// { compatibilityJSON: 'v3' } can be used to generate v3 compatible plurals.
|
||||||
|
|
||||||
|
yamlOptions: null, |
||||||
|
// If you wish to customize options for yaml output, you can define an object here.
|
||||||
|
// Configuration options are here (https://github.com/nodeca/js-yaml#dump-object---options-).
|
||||||
|
// Example:
|
||||||
|
// {
|
||||||
|
// lineWidth: -1,
|
||||||
|
// }
|
||||||
|
}; |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue