-
+
);
}
}
+
+LanguagesPage.propTypes = {
+ intl: intlShape.isRequired,
+};
+
+export default injectIntl(LanguagesPage);
diff --git a/public/app/containers/LanguagesPage/messages.js b/public/app/containers/LanguagesPage/messages.js
new file mode 100644
index 0000000000..cb68409032
--- /dev/null
+++ b/public/app/containers/LanguagesPage/messages.js
@@ -0,0 +1,13 @@
+/*
+ * LanguagesPage Messages
+ *
+ * This contains all the text for the LanguagesPage component.
+ */
+import { defineMessages } from 'react-intl';
+
+export default defineMessages({
+ rightSectionDescription: {
+ id: 'settings-manager.components.LanguagesPage.rightSectionDescription',
+ defaultMessage: 'Configure your languages settings',
+ },
+});
diff --git a/public/app/containers/SecurityPage/index.js b/public/app/containers/SecurityPage/index.js
index b46721f787..bdde2ff11a 100644
--- a/public/app/containers/SecurityPage/index.js
+++ b/public/app/containers/SecurityPage/index.js
@@ -8,27 +8,44 @@ import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
+import { injectIntl, intlShape } from 'react-intl';
+import appMessages from 'containers/App/messages';
+import messages from './messages';
import styles from './styles.scss';
-export default class SecurityPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
+export class SecurityPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
+ const { formatMessage } = this.props.intl;
+
return (
);
}
}
+
+SecurityPage.propTypes = {
+ intl: intlShape.isRequired,
+};
+
+export default injectIntl(SecurityPage);
diff --git a/public/app/containers/SecurityPage/messages.js b/public/app/containers/SecurityPage/messages.js
new file mode 100644
index 0000000000..bb8a897a50
--- /dev/null
+++ b/public/app/containers/SecurityPage/messages.js
@@ -0,0 +1,13 @@
+/*
+ * LanguagesPage Messages
+ *
+ * This contains all the text for the LanguagesPage component.
+ */
+import { defineMessages } from 'react-intl';
+
+export default defineMessages({
+ rightSectionDescription: {
+ id: 'settings-manager.components.SecurityPage.rightSectionDescription',
+ defaultMessage: 'Configure your security settings',
+ },
+});
diff --git a/public/app/containers/ServerPage/index.js b/public/app/containers/ServerPage/index.js
index f75ac97187..98d46be247 100644
--- a/public/app/containers/ServerPage/index.js
+++ b/public/app/containers/ServerPage/index.js
@@ -8,27 +8,44 @@ import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
+import { injectIntl, intlShape } from 'react-intl';
+import appMessages from 'containers/App/messages';
+import messages from './messages';
import styles from './styles.scss';
-export default class ServerPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
+export class ServerPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
+ const { formatMessage } = this.props.intl;
+
return (
);
}
}
+
+ServerPage.propTypes = {
+ intl: intlShape.isRequired,
+};
+
+export default injectIntl(ServerPage);
diff --git a/public/app/containers/ServerPage/messages.js b/public/app/containers/ServerPage/messages.js
new file mode 100644
index 0000000000..d7c7829a0d
--- /dev/null
+++ b/public/app/containers/ServerPage/messages.js
@@ -0,0 +1,13 @@
+/*
+ * LanguagesPage Messages
+ *
+ * This contains all the text for the LanguagesPage component.
+ */
+import { defineMessages } from 'react-intl';
+
+export default defineMessages({
+ rightSectionDescription: {
+ id: 'settings-manager.components.ServerPage.rightSectionDescription',
+ defaultMessage: 'Configure your server settings',
+ },
+});
diff --git a/public/app/i18n.js b/public/app/i18n.js
index 73d1f94a81..9deb722dac 100644
--- a/public/app/i18n.js
+++ b/public/app/i18n.js
@@ -4,17 +4,22 @@
* This will setup the i18n language files and locale data for your plugin.
*
*/
-import { addLocaleData } from 'react-intl';
+// import { addLocaleData } from 'react-intl';
-import enLocaleData from 'react-intl/locale-data/en';
+// import enLocaleData from 'react-intl/locale-data/en';
+// import frLocaleData from 'react-intl/locale-data/fr';
-export const appLocales = [
- 'en',
-];
+// export const appLocales = [
+// 'en',
+// 'fr',
+//
+// ];
import enTranslationMessages from './translations/en.json';
+import frTranslationMessages from './translations/fr.json';
-addLocaleData(enLocaleData);
+// addLocaleData(enLocaleData);
+// addLocaleData(frLocaleData);
const formatTranslationMessages = (messages) => {
const formattedMessages = {};
@@ -27,4 +32,5 @@ const formatTranslationMessages = (messages) => {
export const translationMessages = {
en: formatTranslationMessages(enTranslationMessages),
+ fr: formatTranslationMessages(frTranslationMessages),
};
diff --git a/public/app/styles/main.scss b/public/app/styles/main.scss
index afcdcf8e3d..506854ddc0 100644
--- a/public/app/styles/main.scss
+++ b/public/app/styles/main.scss
@@ -1,2 +1,2 @@
// Import variables
-@import "variables/variables";
+@import 'variables/variables';
diff --git a/public/app/translations/en.json b/public/app/translations/en.json
index fe51488c70..3a6cbdca27 100644
--- a/public/app/translations/en.json
+++ b/public/app/translations/en.json
@@ -1 +1,16 @@
-[]
+[
+ {
+ "id": "app.components.DatabasesPage.header",
+ "defaultMessage": "This is the Databases page of the Settings Manager plugin!",
+ "message": ""
+ },
+ {
+ "id": "app.components.NotFoundPage.pageNotFound",
+ "defaultMessage": "Page not found.",
+ "message": ""
+ },
+ {
+ "id": "settings-manager.components.HomePage.header",
+ "defaultMessage": "This is HomePage components !"
+ }
+]
diff --git a/public/app/translations/fr.json b/public/app/translations/fr.json
new file mode 100644
index 0000000000..52682d72cf
--- /dev/null
+++ b/public/app/translations/fr.json
@@ -0,0 +1,16 @@
+[
+ {
+ "id": "app.components.DatabasesPage.header",
+ "defaultMessage": "This is the Databases page of the Settings Manager plugin!",
+ "message": ""
+ },
+ {
+ "id": "app.components.NotFoundPage.pageNotFound",
+ "defaultMessage": "Page not found.",
+ "message": ""
+ },
+ {
+ "id": "settings-manager.components.HomePage.header",
+ "defaultMessage": "Ceci est la page d'accueil!"
+ }
+]
diff --git a/public/internals/generators/component/es6.js.hbs b/public/internals/generators/component/es6.js.hbs
index f94b3cd6bc..5a8b1ce481 100644
--- a/public/internals/generators/component/es6.js.hbs
+++ b/public/internals/generators/component/es6.js.hbs
@@ -11,7 +11,7 @@ import { FormattedMessage } from 'react-intl';
import messages from './messages';
{{/if}}
{{#if wantCSS}}
-import styles from './styles.scss';
+import styles from './styles.css';
{{/if}}
class {{ properCase name }} extends React.Component { // eslint-disable-line react/prefer-stateless-function
diff --git a/public/internals/generators/component/index.js b/public/internals/generators/component/index.js
index 117240b796..2b522711ce 100644
--- a/public/internals/generators/component/index.js
+++ b/public/internals/generators/component/index.js
@@ -49,12 +49,12 @@ module.exports = {
abortOnFail: true,
}];
- // If they want a CSS file, add styles.scss
+ // If they want a CSS file, add styles.css
if (data.wantCSS) {
actions.push({
type: 'add',
- path: '../../app/components/{{properCase name}}/styles.scss',
- templateFile: './component/styles.scss.hbs',
+ path: '../../app/components/{{properCase name}}/styles.css',
+ templateFile: './component/styles.css.hbs',
abortOnFail: true,
});
}
diff --git a/public/internals/generators/component/stateless.js.hbs b/public/internals/generators/component/stateless.js.hbs
index 2184b2ae2b..7ff8824f8a 100644
--- a/public/internals/generators/component/stateless.js.hbs
+++ b/public/internals/generators/component/stateless.js.hbs
@@ -12,7 +12,7 @@ import messages from './messages';
{{/if}}
{{#if wantCSS}}
-import styles from './styles.scss';
+import styles from './styles.css';
{{/if}}
function {{ properCase name }}() {
diff --git a/public/internals/generators/container/index.js b/public/internals/generators/container/index.js
index cdcbd99fed..44dc4b4c34 100644
--- a/public/internals/generators/container/index.js
+++ b/public/internals/generators/container/index.js
@@ -58,12 +58,12 @@ module.exports = {
abortOnFail: true,
}];
- // If they want a CSS file, add styles.scss
+ // If they want a CSS file, add styles.css
if (data.wantCSS) {
actions.push({
type: 'add',
- path: '../../app/containers/{{properCase name}}/styles.scss',
- templateFile: './container/styles.scss.hbs',
+ path: '../../app/containers/{{properCase name}}/styles.css',
+ templateFile: './container/styles.css.hbs',
abortOnFail: true,
});
}
diff --git a/public/internals/generators/container/index.js.hbs b/public/internals/generators/container/index.js.hbs
index ff40b21d57..420ae1fc0b 100644
--- a/public/internals/generators/container/index.js.hbs
+++ b/public/internals/generators/container/index.js.hbs
@@ -17,7 +17,7 @@ import { FormattedMessage } from 'react-intl';
import messages from './messages';
{{/if}}
{{#if wantCSS}}
-import styles from './styles.scss';
+import styles from './styles.css';
{{/if}}
export class {{ properCase name }} extends React.Component { // eslint-disable-line react/prefer-stateless-function
diff --git a/public/internals/generators/index.js b/public/internals/generators/index.js
index 4fdd4c53ec..4bc7392ce4 100644
--- a/public/internals/generators/index.js
+++ b/public/internals/generators/index.js
@@ -8,11 +8,13 @@ const fs = require('fs');
const componentGenerator = require('./component/index.js');
const containerGenerator = require('./container/index.js');
const routeGenerator = require('./route/index.js');
+const languageGenerator = require('./language/index.js');
module.exports = (plop) => {
plop.setGenerator('component', componentGenerator);
plop.setGenerator('container', containerGenerator);
plop.setGenerator('route', routeGenerator);
+ plop.setGenerator('language', languageGenerator);
plop.addHelper('directory', (comp) => {
try {
fs.accessSync(`app/containers/${comp}`, fs.F_OK);
diff --git a/public/internals/generators/language/add-locale-data.hbs b/public/internals/generators/language/add-locale-data.hbs
new file mode 100644
index 0000000000..80727c73cd
--- /dev/null
+++ b/public/internals/generators/language/add-locale-data.hbs
@@ -0,0 +1 @@
+$1addLocaleData({{language}}LocaleData);
diff --git a/public/internals/generators/language/app-locale.hbs b/public/internals/generators/language/app-locale.hbs
new file mode 100644
index 0000000000..9e99e845f8
--- /dev/null
+++ b/public/internals/generators/language/app-locale.hbs
@@ -0,0 +1,2 @@
+$1
+ '{{language}}',
diff --git a/public/internals/generators/language/format-translation-messages.hbs b/public/internals/generators/language/format-translation-messages.hbs
new file mode 100644
index 0000000000..74c78b4632
--- /dev/null
+++ b/public/internals/generators/language/format-translation-messages.hbs
@@ -0,0 +1 @@
+$1 {{language}}: formatTranslationMessages({{language}}TranslationMessages),
diff --git a/public/internals/generators/language/index.js b/public/internals/generators/language/index.js
new file mode 100644
index 0000000000..83899c61a4
--- /dev/null
+++ b/public/internals/generators/language/index.js
@@ -0,0 +1,80 @@
+/**
+ * Language Generator
+ */
+const exec = require('child_process').exec;
+
+module.exports = {
+ description: 'Add a langauge',
+ prompts: [{
+ type: 'input',
+ name: 'language',
+ message: 'What is the language you want to add i18n support for (e.g. "fr", "de")?',
+ default: 'fr',
+ validate: value => {
+ if ((/.+/).test(value) && value.length === 2) {
+ return true;
+ }
+
+ return '2 character language specifier is required';
+ },
+ }],
+
+ actions: () => {
+ const actions = [];
+ actions.push({
+ type: 'modify',
+ path: '../../app/i18n.js',
+ pattern: /('react-intl\/locale-data\/[a-z]+';\n)(?!.*'react-intl\/locale-data\/[a-z]+';)/g,
+ templateFile: './language/intl-locale-data.hbs',
+ });
+ actions.push({
+ type: 'modify',
+ path: '../../app/i18n.js',
+ pattern: /([\n\s'[a-z]+',)(?!.*[\n\s'[a-z]+',)/g,
+ templateFile: './language/app-locale.hbs',
+ });
+ actions.push({
+ type: 'modify',
+ path: '../../app/i18n.js',
+ pattern: /(from\s'.\/translations\/[a-z]+.json';\n)(?!.*from\s'.\/translations\/[a-z]+.json';)/g,
+ templateFile: './language/translation-messages.hbs',
+ });
+ actions.push({
+ type: 'modify',
+ path: '../../app/i18n.js',
+ pattern: /(addLocaleData\([a-z]+LocaleData\);\n)(?!.*addLocaleData\([a-z]+LocaleData\);)/g,
+ templateFile: './language/add-locale-data.hbs',
+ });
+ actions.push({
+ type: 'modify',
+ path: '../../app/i18n.js',
+ pattern: /([a-z]+:\sformatTranslationMessages\([a-z]+TranslationMessages\),\n)(?!.*[a-z]+:\sformatTranslationMessages\([a-z]+TranslationMessages\),)/g,
+ templateFile: './language/format-translation-messages.hbs',
+ });
+ actions.push({
+ type: 'add',
+ path: '../../app/translations/{{language}}.json',
+ templateFile: './language/translations-json.hbs',
+ abortOnFail: true,
+ });
+ actions.push({
+ type: 'modify',
+ path: '../../app/app.js',
+ pattern: /(System\.import\('intl\/locale-data\/jsonp\/[a-z]+\.js'\),\n)(?!.*System\.import\('intl\/locale-data\/jsonp\/[a-z]+\.js'\),)/g,
+ templateFile: './language/polyfill-intl-locale.hbs',
+ });
+ actions.push(
+ () => {
+ const cmd = 'npm run extract-intl';
+ exec(cmd, (err, result, stderr) => {
+ if (err || stderr) {
+ throw err || stderr;
+ }
+ process.stdout.write(result);
+ });
+ }
+ );
+
+ return actions;
+ },
+};
diff --git a/public/internals/generators/language/intl-locale-data.hbs b/public/internals/generators/language/intl-locale-data.hbs
new file mode 100644
index 0000000000..b790a1333f
--- /dev/null
+++ b/public/internals/generators/language/intl-locale-data.hbs
@@ -0,0 +1 @@
+$1import {{language}}LocaleData from 'react-intl/locale-data/{{language}}';
diff --git a/public/internals/generators/language/polyfill-intl-locale.hbs b/public/internals/generators/language/polyfill-intl-locale.hbs
new file mode 100644
index 0000000000..ea1586e7ed
--- /dev/null
+++ b/public/internals/generators/language/polyfill-intl-locale.hbs
@@ -0,0 +1 @@
+$1 System.import('intl/locale-data/jsonp/{{language}}.js'),
diff --git a/public/internals/generators/language/translation-messages.hbs b/public/internals/generators/language/translation-messages.hbs
new file mode 100644
index 0000000000..0682d22ed0
--- /dev/null
+++ b/public/internals/generators/language/translation-messages.hbs
@@ -0,0 +1 @@
+$1import {{language}}TranslationMessages from './translations/{{language}}.json';
diff --git a/public/internals/generators/language/translations-json.hbs b/public/internals/generators/language/translations-json.hbs
new file mode 100644
index 0000000000..fe51488c70
--- /dev/null
+++ b/public/internals/generators/language/translations-json.hbs
@@ -0,0 +1 @@
+[]
diff --git a/public/package.json b/public/package.json
index 556971bbcf..59db1623c9 100644
--- a/public/package.json
+++ b/public/package.json
@@ -28,10 +28,10 @@
"start:production": "npm run build && npm run start:prod",
"start:prod": "cross-env NODE_ENV=production node server",
"generate": "plop --plopfile internals/generators/index.js",
- "lint": "npm run lint:js && npm run lint:css",
+ "lint": "npm run lint:js && npm run lint:scss",
"lint:eslint": "eslint --ignore-path .gitignore --ignore-pattern internals/scripts",
"lint:js": "npm run lint:eslint -- . ",
- "lint:css": "stylelint ./app/**/*.css",
+ "lint:scss": "stylelint ./app/**/*.scss",
"lint:staged": "lint-staged",
"pretest": "npm run test:clean && npm run lint",
"test:clean": "rimraf ./coverage",
@@ -44,7 +44,7 @@
},
"lint-staged": {
"*.js": "lint:eslint",
- "*.css": "stylelint"
+ "*.scss": "stylelint"
},
"pre-commit": "lint:staged",
"babel": {