mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-08-27 19:20:04 +00:00
Add formatjs/intl locale support
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -14,6 +14,7 @@ frontend/build
|
||||
frontend/yarn-error.log
|
||||
frontend/yarn.lock
|
||||
frontend/.npmrc
|
||||
frontend/src/locale/lang
|
||||
test/cypress/fixtures/example.json
|
||||
.vscode
|
||||
docker-build
|
||||
|
@@ -1,56 +1,69 @@
|
||||
version: '2'
|
||||
version: "2"
|
||||
|
||||
tasks:
|
||||
default:
|
||||
cmds:
|
||||
- task: run
|
||||
default:
|
||||
cmds:
|
||||
- task: run
|
||||
|
||||
run:
|
||||
desc: Build and run
|
||||
sources:
|
||||
- internal/**/*.go
|
||||
- cmd/**/*.go
|
||||
cmds:
|
||||
- task: build
|
||||
- cmd: echo -e "==> Running..."
|
||||
silent: true
|
||||
- cmd: ../dist/bin/server
|
||||
ignore_error: true
|
||||
silent: true
|
||||
env:
|
||||
LOG_LEVEL: debug
|
||||
run:
|
||||
desc: Build and run
|
||||
sources:
|
||||
- internal/**/*.go
|
||||
- cmd/**/*.go
|
||||
- ../frontend/src/locale/src/*.json
|
||||
cmds:
|
||||
- task: locale
|
||||
- task: build
|
||||
- cmd: echo -e "==> Running..."
|
||||
silent: true
|
||||
- cmd: ../dist/bin/server
|
||||
ignore_error: true
|
||||
silent: true
|
||||
env:
|
||||
LOG_LEVEL: debug
|
||||
|
||||
build:
|
||||
desc: Build the server
|
||||
cmds:
|
||||
- cmd: echo -e "==> Building..."
|
||||
silent: true
|
||||
- cmd: rm -f dist/bin/*
|
||||
silent: true
|
||||
- cmd: go build -ldflags="-X main.commit={{.GIT_COMMIT}} -X main.version={{.VERSION}}" -o ../dist/bin/server ./cmd/server/main.go
|
||||
silent: true
|
||||
- task: lint
|
||||
vars:
|
||||
GIT_COMMIT:
|
||||
sh: git log -n 1 --format=%h
|
||||
VERSION:
|
||||
sh: cat ../.version
|
||||
env:
|
||||
GO111MODULE: on
|
||||
CGO_ENABLED: 1
|
||||
build:
|
||||
desc: Build the server
|
||||
cmds:
|
||||
- cmd: echo -e "==> Building..."
|
||||
silent: true
|
||||
- cmd: rm -f dist/bin/*
|
||||
silent: true
|
||||
- cmd: go build -ldflags="-X main.commit={{.GIT_COMMIT}} -X main.version={{.VERSION}}" -o ../dist/bin/server ./cmd/server/main.go
|
||||
silent: true
|
||||
- task: lint
|
||||
vars:
|
||||
GIT_COMMIT:
|
||||
sh: git log -n 1 --format=%h
|
||||
VERSION:
|
||||
sh: cat ../.version
|
||||
env:
|
||||
GO111MODULE: on
|
||||
CGO_ENABLED: 1
|
||||
|
||||
lint:
|
||||
desc: Linting
|
||||
cmds:
|
||||
- cmd: echo -e "==> Linting..."
|
||||
silent: true
|
||||
- cmd: bash scripts/lint.sh
|
||||
silent: true
|
||||
lint:
|
||||
desc: Linting
|
||||
cmds:
|
||||
- cmd: echo -e "==> Linting..."
|
||||
silent: true
|
||||
- cmd: bash scripts/lint.sh
|
||||
silent: true
|
||||
|
||||
test:
|
||||
desc: Testing
|
||||
cmds:
|
||||
- cmd: echo -e "==> Testing..."
|
||||
silent: true
|
||||
- cmd: bash scripts/test.sh
|
||||
silent: true
|
||||
test:
|
||||
desc: Testing
|
||||
cmds:
|
||||
- cmd: echo -e "==> Testing..."
|
||||
silent: true
|
||||
- cmd: bash scripts/test.sh
|
||||
silent: true
|
||||
|
||||
locale:
|
||||
desc: Locale
|
||||
dir: /app/frontend
|
||||
cmds:
|
||||
- cmd: yarn locale-compile
|
||||
silent: true
|
||||
ignore_error: true
|
||||
- cmd: chown -R "$PUID:$PGID" src/locale/lang
|
||||
silent: true
|
||||
ignore_error: true
|
||||
|
@@ -39,9 +39,10 @@
|
||||
"node-sass": "^5.0.0",
|
||||
"prettier": "2.3.2",
|
||||
"query-string": "7.0.1",
|
||||
"react": "17.0.2",
|
||||
"react": "^17.0.2",
|
||||
"react-async": "10.0.1",
|
||||
"react-dom": "17.0.2",
|
||||
"react-intl": "^5.20.6",
|
||||
"react-router-dom": "^5.2.0",
|
||||
"react-scripts": "4.0.3",
|
||||
"rooks": "5.0.2",
|
||||
@@ -60,7 +61,9 @@
|
||||
"eject": "react-scripts eject",
|
||||
"prettier": "prettier \"**/*.+(js|json|yml|css|ts|tsx)\"",
|
||||
"format": "yarn prettier -- --write",
|
||||
"lint:fix": "eslint --fix --ext .ts --ext .tsx ."
|
||||
"lint:fix": "eslint --fix --ext .ts --ext .tsx .",
|
||||
"locale-extract": "formatjs extract 'src/**/*.tsx' --out-file src/locale/src/en.json",
|
||||
"locale-compile": "formatjs compile-folder src/locale/src src/locale/lang --ast"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
@@ -88,5 +91,8 @@
|
||||
"statements": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@formatjs/cli": "^4.2.29"
|
||||
}
|
||||
}
|
||||
|
@@ -2,14 +2,18 @@ import React from "react";
|
||||
|
||||
import Router from "components/Router";
|
||||
import { AuthProvider, HealthProvider } from "context";
|
||||
import { intl } from "locale";
|
||||
import { RawIntlProvider } from "react-intl";
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<HealthProvider>
|
||||
<AuthProvider>
|
||||
<Router />
|
||||
</AuthProvider>
|
||||
</HealthProvider>
|
||||
<RawIntlProvider value={intl}>
|
||||
<HealthProvider>
|
||||
<AuthProvider>
|
||||
<Router />
|
||||
</AuthProvider>
|
||||
</HealthProvider>
|
||||
</RawIntlProvider>
|
||||
);
|
||||
}
|
||||
|
||||
|
37
frontend/src/locale/IntlProvider.tsx
Normal file
37
frontend/src/locale/IntlProvider.tsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import { createIntl, createIntlCache } from "react-intl";
|
||||
|
||||
import langEn from "./lang/en.json";
|
||||
|
||||
// todo
|
||||
/*
|
||||
const messages: Record<string, Record<string, string>> = {
|
||||
"en-US": { selectalanguage: "Select a language" },
|
||||
"pt-BR": { selectalanguage: "Selecione uma linguagem" },
|
||||
};
|
||||
*/
|
||||
// end todo
|
||||
|
||||
const loadMessages = (locale: string) => {
|
||||
switch (locale) {
|
||||
/*
|
||||
case 'fr':
|
||||
return import("./lang/fr.json");
|
||||
*/
|
||||
default:
|
||||
return langEn;
|
||||
}
|
||||
};
|
||||
|
||||
export const initialLocale = "en-US";
|
||||
export const cache = createIntlCache();
|
||||
|
||||
const initialMessages = loadMessages(initialLocale);
|
||||
|
||||
console.log("MESSAGES:", initialMessages);
|
||||
export const intl = createIntl(
|
||||
// @ts-ignore messages file typings are correct
|
||||
{ locale: initialLocale, messages: initialMessages },
|
||||
cache,
|
||||
);
|
||||
|
||||
export const fmt = intl.formatMessage;
|
1
frontend/src/locale/index.ts
Normal file
1
frontend/src/locale/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from "./IntlProvider";
|
20
frontend/src/locale/src/en.json
Normal file
20
frontend/src/locale/src/en.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"setup.create": {
|
||||
"defaultMessage": "Create Account"
|
||||
},
|
||||
"setup.title": {
|
||||
"defaultMessage": "Create your first Account"
|
||||
},
|
||||
"user.email": {
|
||||
"defaultMessage": "Email"
|
||||
},
|
||||
"user.name": {
|
||||
"defaultMessage": "Name"
|
||||
},
|
||||
"user.nickname": {
|
||||
"defaultMessage": "Nickname"
|
||||
},
|
||||
"user.password": {
|
||||
"defaultMessage": "Password"
|
||||
}
|
||||
}
|
@@ -3,6 +3,8 @@ import React, { useEffect, useRef, useState, ChangeEvent } from "react";
|
||||
import { createUser } from "api/npm";
|
||||
import { Alert, Button } from "components";
|
||||
import { useAuthState, useHealthState } from "context";
|
||||
import { fmt } from "locale";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
|
||||
import logo from "../../img/logo-text-vertical-grey.png";
|
||||
|
||||
@@ -81,7 +83,10 @@ function Setup() {
|
||||
onSubmit={onSubmit}>
|
||||
<div className="card-body">
|
||||
<h2 className="card-title text-center mb-4">
|
||||
Create your first Account
|
||||
<FormattedMessage
|
||||
id="setup.title"
|
||||
defaultMessage="Create your first Account"
|
||||
/>
|
||||
</h2>
|
||||
{errorMessage ? (
|
||||
<Alert type="danger" className="text-center">
|
||||
@@ -90,7 +95,9 @@ function Setup() {
|
||||
) : null}
|
||||
|
||||
<div className="mb-3">
|
||||
<label className="form-label">Name</label>
|
||||
<label className="form-label">
|
||||
<FormattedMessage id="user.name" defaultMessage="Name" />
|
||||
</label>
|
||||
<input
|
||||
ref={nameRef}
|
||||
onChange={onChange}
|
||||
@@ -98,24 +105,34 @@ function Setup() {
|
||||
name="name"
|
||||
value={formData.name}
|
||||
disabled={loading}
|
||||
placeholder="Name"
|
||||
placeholder={fmt({ id: "user.name", defaultMessage: "Name" })}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div className="mb-3">
|
||||
<label className="form-label">Nickname</label>
|
||||
<label className="form-label">
|
||||
<FormattedMessage
|
||||
id="user.nickname"
|
||||
defaultMessage="Nickname"
|
||||
/>
|
||||
</label>
|
||||
<input
|
||||
onChange={onChange}
|
||||
className="form-control"
|
||||
name="nickname"
|
||||
value={formData.nickname}
|
||||
disabled={loading}
|
||||
placeholder="Nickname"
|
||||
placeholder={fmt({
|
||||
id: "user.nickname",
|
||||
defaultMessage: "Nickname",
|
||||
})}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div className="mb-3">
|
||||
<label className="form-label">Email</label>
|
||||
<label className="form-label">
|
||||
<FormattedMessage id="user.email" defaultMessage="Email" />
|
||||
</label>
|
||||
<input
|
||||
type="email"
|
||||
onChange={onChange}
|
||||
@@ -123,13 +140,21 @@ function Setup() {
|
||||
name="email"
|
||||
value={formData.email}
|
||||
disabled={loading}
|
||||
placeholder="Email"
|
||||
placeholder={fmt({
|
||||
id: "user.email",
|
||||
defaultMessage: "Email",
|
||||
})}
|
||||
maxLength={150}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div className="mb-3">
|
||||
<label className="form-label">Password</label>
|
||||
<label className="form-label">
|
||||
<FormattedMessage
|
||||
id="user.password"
|
||||
defaultMessage="Password"
|
||||
/>
|
||||
</label>
|
||||
<input
|
||||
type="password"
|
||||
onChange={onChange}
|
||||
@@ -137,7 +162,10 @@ function Setup() {
|
||||
name="password"
|
||||
value={formData.password}
|
||||
disabled={loading}
|
||||
placeholder="Password"
|
||||
placeholder={fmt({
|
||||
id: "user.password",
|
||||
defaultMessage: "Password",
|
||||
})}
|
||||
minLength={8}
|
||||
maxLength={100}
|
||||
autoComplete="off"
|
||||
@@ -146,7 +174,10 @@ function Setup() {
|
||||
</div>
|
||||
<div className="form-footer">
|
||||
<Button color="cyan" loading={loading} className="w-100">
|
||||
Create Account
|
||||
<FormattedMessage
|
||||
id="setup.create"
|
||||
defaultMessage="Create Account"
|
||||
/>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -13,8 +13,12 @@ docker_cmd() {
|
||||
cd "${DIR}/../.." || exit 1
|
||||
echo -e "${BLUE}❯ ${CYAN}Installing Frontend deps ...${RESET}"
|
||||
rm -rf frontend/node_modules
|
||||
|
||||
docker_cmd yarn install
|
||||
|
||||
echo -e "${BLUE}❯ ${CYAN}Compiling locales ...${RESET}"
|
||||
docker_cmd yarn locale-compile
|
||||
docker_cmd chown -R "$(id -u):$(id -g)" /app/frontend/src/locale/lang
|
||||
|
||||
echo -e "${BLUE}❯ ${CYAN}Running eslint ...${RESET}"
|
||||
docker_cmd yarn eslint src
|
||||
docker_cmd yarn eslint -f junit src -o eslint.xml
|
||||
|
Reference in New Issue
Block a user