Skip to content

Commit

Permalink
feat: Add translations / i18n
Browse files Browse the repository at this point in the history
  • Loading branch information
gmaclennan committed Oct 4, 2019
1 parent a7e17aa commit e87d62b
Show file tree
Hide file tree
Showing 11 changed files with 304 additions and 9 deletions.
14 changes: 9 additions & 5 deletions .storybook/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,20 @@ import theme from '../src/renderer/theme'
import '../static/css/base.css'

const messages = {
en: {},
es: {},
pt: {}
en: require('../translations/en.json'),
es: require('../translations/es.json'),
pt: require('../translations/pt.json')
}

const MyIntlProvider = props => {
return <IntlProvider {...props} messages={messages[props.locale]} />
}

addParameters({
i18n: {
provider: IntlProvider,
provider: MyIntlProvider,
providerProps: {
messages
textComponent: React.Fragment
},
supportedLocales: ['en', 'es', 'pt'],
providerLocaleKey: 'locale'
Expand Down
66 changes: 66 additions & 0 deletions bin/build-translations.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env node

const glob = require('glob')
const util = require('util')
const mkdirp = require('mkdirp')
const rimraf = require('rimraf')
const path = require('path')
const fs = require('fs')

const readFile = util.promisify(fs.readFile)
const writeFile = util.promisify(fs.writeFile)
const mkdirpPromise = util.promisify(mkdirp)

async function readJson (file) {
return JSON.parse(await readFile(file))
}

async function writeJson (file, data) {
await mkdirpPromise(path.dirname(file))
await writeFile(file, JSON.stringify(data, null, 2))
}

mkdirp.sync('translations')
rimraf.sync('translations/*')

// "shared" strings are included in translations for all components
glob('messages/renderer/*.json', async function (er, files) {
for (var file of files) {
const msgs = await readJson(file)
const translations = Object.keys(msgs).reduce((acc, key) => {
acc[key] = msgs[key].message
return acc
}, {})
await writeJson(
path.join('translations', path.basename(file)),
translations
)
}
// const allMsgs = await Promise.all(
// files.map(async file => {
// const msgs = await readJson(file)
// return [file, msgs]
// })
// )
// await Promise.all(
// allMsgs.map(async ([file, msgs]) => {
// const sharedMsgs = await readJson(
// 'messages/shared/' + path.basename(file)
// )
// const translations = {}
// Object.keys(msgs).forEach(key => {
// // For production message ids are hashed, so we need to hash the ids of
// // translations too
// const hashedKey = murmurHash(key)
// translations[hashedKey] = msgs[key].message
// })
// // Merge shared translations into the translations for each component
// Object.keys(sharedMsgs).forEach(key => {
// const hashedKey = murmurHash(key)
// translations[hashedKey] = sharedMsgs[key].message
// })
// const output = file.replace(/^messages/, 'translations')
// await writeJson(output, translations)
// })
// )
})
Empty file modified bin/mock.js
100644 → 100755
Empty file.
Empty file modified bin/release_latest.js
100644 → 100755
Empty file.
42 changes: 42 additions & 0 deletions locales/en.json → messages/renderer/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,48 @@
"renderer.components.MapEditor.feedback-contribute-button": {
"message": "Feedback & Contribute"
},
"renderer.components.MapFilter.FilterPanel.filterHeader": {
"message": "Filter by…"
},
"renderer.components.MapFilter.Loading.loading": {
"description": "Displayed whilst observations and presets load",
"message": "Loading…"
},
"renderer.components.MapFilter.MapExportDialog.cancel": {
"description": "cancel button",
"message": "Cancel"
},
"renderer.components.MapFilter.MapExportDialog.descriptionLabel": {
"description": "Label for field to enter map description",
"message": "Map Description"
},
"renderer.components.MapFilter.MapExportDialog.save": {
"description": "Save button",
"message": "Save"
},
"renderer.components.MapFilter.MapExportDialog.styleLabel": {
"description": "Label for field to enter custom map style",
"message": "Map Style"
},
"renderer.components.MapFilter.MapExportDialog.termsHint": {
"description": "Helper text explaining terms and conditions field",
"message": "Add terms & limitations about how this data can be used"
},
"renderer.components.MapFilter.MapExportDialog.termsLabel": {
"description": "Label for field to enter terms and conditions",
"message": "Terms & Limitations"
},
"renderer.components.MapFilter.MapExportDialog.title": {
"description": "Title for webmaps export dialog",
"message": "Export a map to share online"
},
"renderer.components.MapFilter.MapExportDialog.titleLabel": {
"description": "Label for field to enter map title",
"message": "Map Title"
},
"renderer.components.MapFilter.Toolbar.exportButton": {
"message": "Export data"
},
"renderer.components.SyncView.Searching.searchingHint": {
"description": "Hint on sync screen when searching on wifi for devices",
"message": "Make sure devices are turned on and connected to the same wifi network"
Expand Down
48 changes: 45 additions & 3 deletions locales/es.json → messages/renderer/es.json
Original file line number Diff line number Diff line change
@@ -1,19 +1,61 @@
{
"renderer.components.HomeNew.mapeditor": {
"description": "MapEditor tab label",
"message": ""
"message": "Territorio"
},
"renderer.components.HomeNew.mapfilter": {
"description": "MapFilter tab label",
"message": ""
"message": "Observaciones"
},
"renderer.components.HomeNew.sync": {
"description": "Synchronize tab label",
"message": ""
"message": "Síncronizar"
},
"renderer.components.MapEditor.feedback-contribute-button": {
"message": ""
},
"renderer.components.MapFilter.FilterPanel.filterHeader": {
"message": "Filtrar datos…"
},
"renderer.components.MapFilter.Loading.loading": {
"description": "Displayed whilst observations and presets load",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.cancel": {
"description": "cancel button",
"message": "Cancelar"
},
"renderer.components.MapFilter.MapExportDialog.descriptionLabel": {
"description": "Label for field to enter map description",
"message": "Descripción de este mapa"
},
"renderer.components.MapFilter.MapExportDialog.save": {
"description": "Save button",
"message": "Guardar"
},
"renderer.components.MapFilter.MapExportDialog.styleLabel": {
"description": "Label for field to enter custom map style",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.termsHint": {
"description": "Helper text explaining terms and conditions field",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.termsLabel": {
"description": "Label for field to enter terms and conditions",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.title": {
"description": "Title for webmaps export dialog",
"message": "Exportar un mapa para compartir en el internet"
},
"renderer.components.MapFilter.MapExportDialog.titleLabel": {
"description": "Label for field to enter map title",
"message": "Título de este mapa"
},
"renderer.components.MapFilter.Toolbar.exportButton": {
"message": ""
},
"renderer.components.SyncView.Searching.searchingHint": {
"description": "Hint on sync screen when searching on wifi for devices",
"message": ""
Expand Down
42 changes: 42 additions & 0 deletions locales/pt.json → messages/renderer/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,48 @@
"renderer.components.MapEditor.feedback-contribute-button": {
"message": ""
},
"renderer.components.MapFilter.FilterPanel.filterHeader": {
"message": ""
},
"renderer.components.MapFilter.Loading.loading": {
"description": "Displayed whilst observations and presets load",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.cancel": {
"description": "cancel button",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.descriptionLabel": {
"description": "Label for field to enter map description",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.save": {
"description": "Save button",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.styleLabel": {
"description": "Label for field to enter custom map style",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.termsHint": {
"description": "Helper text explaining terms and conditions field",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.termsLabel": {
"description": "Label for field to enter terms and conditions",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.title": {
"description": "Title for webmaps export dialog",
"message": ""
},
"renderer.components.MapFilter.MapExportDialog.titleLabel": {
"description": "Label for field to enter map title",
"message": ""
},
"renderer.components.MapFilter.Toolbar.exportButton": {
"message": ""
},
"renderer.components.SyncView.Searching.searchingHint": {
"description": "Hint on sync screen when searching on wifi for devices",
"message": ""
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
"gh-release": "gh-release",
"storybook": "start-storybook -p 6006 --ci",
"build-storybook": "build-storybook",
"extract-messages": "extract-messages --locales=es,en,pt --output locales --descriptions 'src/**/*.js'"
"extract-messages": "extract-messages --locales=es,en,pt --output messages/renderer --descriptions 'src/**/*.js'"
},
"license": "GPL-3.0",
"repository": {
Expand Down
33 changes: 33 additions & 0 deletions translations/en.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"renderer.components.HomeNew.mapeditor": "Territory",
"renderer.components.HomeNew.mapfilter": "Observations",
"renderer.components.HomeNew.sync": "Synchronize",
"renderer.components.MapEditor.feedback-contribute-button": "Feedback & Contribute",
"renderer.components.MapFilter.FilterPanel.filterHeader": "Filter by…",
"renderer.components.MapFilter.Loading.loading": "Loading…",
"renderer.components.MapFilter.MapExportDialog.cancel": "Cancel",
"renderer.components.MapFilter.MapExportDialog.descriptionLabel": "Map Description",
"renderer.components.MapFilter.MapExportDialog.save": "Save",
"renderer.components.MapFilter.MapExportDialog.styleLabel": "Map Style",
"renderer.components.MapFilter.MapExportDialog.termsHint": "Add terms & limitations about how this data can be used",
"renderer.components.MapFilter.MapExportDialog.termsLabel": "Terms & Limitations",
"renderer.components.MapFilter.MapExportDialog.title": "Export a map to share online",
"renderer.components.MapFilter.MapExportDialog.titleLabel": "Map Title",
"renderer.components.MapFilter.Toolbar.exportButton": "Export data",
"renderer.components.SyncView.Searching.searchingHint": "Make sure devices are turned on and connected to the same wifi network",
"renderer.components.SyncView.Searching.searchingTitle": "Searching…",
"renderer.components.SyncView.SyncAppBar.newSyncfile": "Create new syncfile…",
"renderer.components.SyncView.SyncAppBar.selectSyncfile": "Sync from a file…",
"renderer.components.SyncView.SyncAppBar.subtitle": "via Wi-Fi",
"renderer.components.SyncView.SyncAppBar.title": "Available Devices",
"renderer.components.SyncView.SyncButton.complete": "Complete",
"renderer.components.SyncView.SyncButton.retry": "Retry",
"renderer.components.SyncView.SyncButton.starting": "Starting…",
"renderer.components.SyncView.SyncButton.sync": "Synchronize",
"renderer.components.SyncView.SyncTarget.database": "Database: {sofar} / {total}",
"renderer.components.SyncView.SyncTarget.errorMsg": "Syncronization Error",
"renderer.components.SyncView.SyncTarget.lastSync": "Last synchronized:",
"renderer.components.SyncView.SyncTarget.media": "Photos: {sofar} / {total}",
"renderer.components.dialogs.LatLon.button-submit": "Submit",
"renderer.components.dialogs.LatLon.dialog-enter-latlon-coordinates": "Enter Coordinates"
}
33 changes: 33 additions & 0 deletions translations/es.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"renderer.components.HomeNew.mapeditor": "Territorio",
"renderer.components.HomeNew.mapfilter": "Observaciones",
"renderer.components.HomeNew.sync": "Síncronizar",
"renderer.components.MapEditor.feedback-contribute-button": "",
"renderer.components.MapFilter.FilterPanel.filterHeader": "Filtrar datos…",
"renderer.components.MapFilter.Loading.loading": "",
"renderer.components.MapFilter.MapExportDialog.cancel": "Cancelar",
"renderer.components.MapFilter.MapExportDialog.descriptionLabel": "Descripción de este mapa",
"renderer.components.MapFilter.MapExportDialog.save": "Guardar",
"renderer.components.MapFilter.MapExportDialog.styleLabel": "",
"renderer.components.MapFilter.MapExportDialog.termsHint": "",
"renderer.components.MapFilter.MapExportDialog.termsLabel": "",
"renderer.components.MapFilter.MapExportDialog.title": "Exportar un mapa para compartir en el internet",
"renderer.components.MapFilter.MapExportDialog.titleLabel": "Título de este mapa",
"renderer.components.MapFilter.Toolbar.exportButton": "",
"renderer.components.SyncView.Searching.searchingHint": "",
"renderer.components.SyncView.Searching.searchingTitle": "",
"renderer.components.SyncView.SyncAppBar.newSyncfile": "",
"renderer.components.SyncView.SyncAppBar.selectSyncfile": "",
"renderer.components.SyncView.SyncAppBar.subtitle": "",
"renderer.components.SyncView.SyncAppBar.title": "",
"renderer.components.SyncView.SyncButton.complete": "",
"renderer.components.SyncView.SyncButton.retry": "",
"renderer.components.SyncView.SyncButton.starting": "",
"renderer.components.SyncView.SyncButton.sync": "",
"renderer.components.SyncView.SyncTarget.database": "",
"renderer.components.SyncView.SyncTarget.errorMsg": "",
"renderer.components.SyncView.SyncTarget.lastSync": "",
"renderer.components.SyncView.SyncTarget.media": "",
"renderer.components.dialogs.LatLon.button-submit": "",
"renderer.components.dialogs.LatLon.dialog-enter-latlon-coordinates": ""
}
33 changes: 33 additions & 0 deletions translations/pt.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"renderer.components.HomeNew.mapeditor": "",
"renderer.components.HomeNew.mapfilter": "",
"renderer.components.HomeNew.sync": "",
"renderer.components.MapEditor.feedback-contribute-button": "",
"renderer.components.MapFilter.FilterPanel.filterHeader": "",
"renderer.components.MapFilter.Loading.loading": "",
"renderer.components.MapFilter.MapExportDialog.cancel": "",
"renderer.components.MapFilter.MapExportDialog.descriptionLabel": "",
"renderer.components.MapFilter.MapExportDialog.save": "",
"renderer.components.MapFilter.MapExportDialog.styleLabel": "",
"renderer.components.MapFilter.MapExportDialog.termsHint": "",
"renderer.components.MapFilter.MapExportDialog.termsLabel": "",
"renderer.components.MapFilter.MapExportDialog.title": "",
"renderer.components.MapFilter.MapExportDialog.titleLabel": "",
"renderer.components.MapFilter.Toolbar.exportButton": "",
"renderer.components.SyncView.Searching.searchingHint": "",
"renderer.components.SyncView.Searching.searchingTitle": "",
"renderer.components.SyncView.SyncAppBar.newSyncfile": "",
"renderer.components.SyncView.SyncAppBar.selectSyncfile": "",
"renderer.components.SyncView.SyncAppBar.subtitle": "",
"renderer.components.SyncView.SyncAppBar.title": "",
"renderer.components.SyncView.SyncButton.complete": "",
"renderer.components.SyncView.SyncButton.retry": "",
"renderer.components.SyncView.SyncButton.starting": "",
"renderer.components.SyncView.SyncButton.sync": "",
"renderer.components.SyncView.SyncTarget.database": "",
"renderer.components.SyncView.SyncTarget.errorMsg": "",
"renderer.components.SyncView.SyncTarget.lastSync": "",
"renderer.components.SyncView.SyncTarget.media": "",
"renderer.components.dialogs.LatLon.button-submit": "",
"renderer.components.dialogs.LatLon.dialog-enter-latlon-coordinates": ""
}

0 comments on commit e87d62b

Please sign in to comment.