Add translate Setting page
This commit is contained in:
parent
e1069f6bd1
commit
3854a7acf9
|
@ -38,5 +38,21 @@ export default {
|
||||||
'A number of DNS requests to search engines for which Safe Search was enforced': 'Số yêu cầu DNS tới công cụ tìm kiếm đã chuyển thành tìm kiếm an toàn',
|
'A number of DNS requests to search engines for which Safe Search was enforced': 'Số yêu cầu DNS tới công cụ tìm kiếm đã chuyển thành tìm kiếm an toàn',
|
||||||
'Average processing time': 'Thời gian xử lý trung bình',
|
'Average processing time': 'Thời gian xử lý trung bình',
|
||||||
'Average time in milliseconds on processing a DNS request': 'Thời gian trung bình cho một yêu cầu DNS tính bằng mili giây',
|
'Average time in milliseconds on processing a DNS request': 'Thời gian trung bình cho một yêu cầu DNS tính bằng mili giây',
|
||||||
|
// Setting
|
||||||
|
'Block domains using filters and hosts files': 'Chặn tên miền sử dụng các bộ lọc và file hosts',
|
||||||
|
'You can setup blocking rules in the <a href="#filters">Filters</a> settings.': 'Bạn có thể thiết lập quy tắc chặn tại cài đặt <a href="#filters">Bộ lọc</a>.',
|
||||||
|
'Use AdGuard browsing security web service': 'Sử dụng dịch vụ bảo vệ duyệt web AdGuard',
|
||||||
|
'AdGuard Home will check if domain is blacklisted by the browsing security web service. It will use privacy-friendly lookup API to perform the check: only a short prefix of the domain name SHA256 hash is sent to the server.': 'AdGuard Home sẽ kiểm tra tên miền với dịch vụ bảo vệ duyệt web. Tính năng sử dụng một API thân thiện với quyền riêng tư: chỉ một phần ngắn tiền tố mã băm SHA256 được gửi đến máy chủ',
|
||||||
|
'Use AdGuard parental control web service': 'Sử dụng dịch vụ quản lý của phụ huynh AdGuard',
|
||||||
|
'AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.': 'AdGuard Home sẽ kiểm tra nếu tên miền chứa từ khoá người lớn. Tính năng sử dụng API thân thiện với quyền riêng tư tương tự với dịch vụ bảo vệ duyệt web',
|
||||||
|
'Enforce safe search': 'Bắt buộc tìm kiếm an toàn',
|
||||||
|
'AdGuard Home can enforce safe search in the following search engines: Google, Bing, Yandex.': 'AdGuard Home có thể bắt buộc tìm kiếm an toàn với các dịch vụ tìm kiếm: Google, Bing, Yandex.',
|
||||||
|
'No servers specified': 'Không có máy chủ nào được liệt kê',
|
||||||
|
'No settings': 'Không có cài đặt nào',
|
||||||
|
'General settings': 'Cài đặt chung',
|
||||||
|
'Upstream DNS servers': 'Máy chủ DNS tìm kiếm',
|
||||||
|
'If you keep this field empty, AdGuard Home will use <a href="https://1.1.1.1/" target="_blank">Cloudflare DNS</a> as an upstream. Use tls:// prefix for DNS over TLS servers.': 'Nếu bạn để trống mục này, AdGuard Home sẽ sử dụng <a href="https://1.1.1.1/" target="_blank">Cloudflare DNS</a> để tìm kiếm. Sử dụng tiền tố tls:// cho các máy chủ DNS dựa trên TLS.',
|
||||||
|
'Test upstreams': 'Kiểm tra',
|
||||||
|
Apply: 'Áp dụng',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
import { Trans, withNamespaces } from 'react-i18next';
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
export default class Upstream extends Component {
|
class Upstream extends Component {
|
||||||
handleChange = (e) => {
|
handleChange = (e) => {
|
||||||
const { value } = e.currentTarget;
|
const { value } = e.currentTarget;
|
||||||
this.props.handleUpstreamChange(value);
|
this.props.handleUpstreamChange(value);
|
||||||
|
@ -23,11 +24,12 @@ export default class Upstream extends Component {
|
||||||
'btn btn-primary btn-standart mr-2': true,
|
'btn btn-primary btn-standart mr-2': true,
|
||||||
'btn btn-primary btn-standart mr-2 btn-loading': this.props.processingTestUpstream,
|
'btn btn-primary btn-standart mr-2 btn-loading': this.props.processingTestUpstream,
|
||||||
});
|
});
|
||||||
|
const { t } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
title="Upstream DNS servers"
|
title={ t('Upstream DNS servers') }
|
||||||
subtitle="If you keep this field empty, AdGuard Home will use <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> as an upstream. Use tls:// prefix for DNS over TLS servers."
|
subtitle={ t('If you keep this field empty, AdGuard Home will use <a href="https://1.1.1.1/" target="_blank">Cloudflare DNS</a> as an upstream. Use tls:// prefix for DNS over TLS servers.') }
|
||||||
bodyType="card-body box-body--settings"
|
bodyType="card-body box-body--settings"
|
||||||
>
|
>
|
||||||
<div className="row">
|
<div className="row">
|
||||||
|
@ -44,14 +46,14 @@ export default class Upstream extends Component {
|
||||||
type="button"
|
type="button"
|
||||||
onClick={this.handleTest}
|
onClick={this.handleTest}
|
||||||
>
|
>
|
||||||
Test upstreams
|
<Trans>Test upstreams</Trans>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className="btn btn-success btn-standart"
|
className="btn btn-success btn-standart"
|
||||||
type="submit"
|
type="submit"
|
||||||
onClick={this.handleSubmit}
|
onClick={this.handleSubmit}
|
||||||
>
|
>
|
||||||
Apply
|
<Trans>Apply</Trans>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -68,4 +70,7 @@ Upstream.propTypes = {
|
||||||
handleUpstreamChange: PropTypes.func,
|
handleUpstreamChange: PropTypes.func,
|
||||||
handleUpstreamSubmit: PropTypes.func,
|
handleUpstreamSubmit: PropTypes.func,
|
||||||
handleUpstreamTest: PropTypes.func,
|
handleUpstreamTest: PropTypes.func,
|
||||||
|
t: PropTypes.func,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default withNamespaces()(Upstream);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React, { Component, Fragment } from 'react';
|
import React, { Component, Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
import { withNamespaces, Trans } from 'react-i18next';
|
||||||
import Upstream from './Upstream';
|
import Upstream from './Upstream';
|
||||||
import Checkbox from '../ui/Checkbox';
|
import Checkbox from '../ui/Checkbox';
|
||||||
import Loading from '../ui/Loading';
|
import Loading from '../ui/Loading';
|
||||||
|
@ -7,27 +8,27 @@ import PageTitle from '../ui/PageTitle';
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
import './Settings.css';
|
import './Settings.css';
|
||||||
|
|
||||||
export default class Settings extends Component {
|
class Settings extends Component {
|
||||||
settings = {
|
settings = {
|
||||||
filtering: {
|
filtering: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
title: 'Block domains using filters and hosts files',
|
title: this.props.t('Block domains using filters and hosts files'),
|
||||||
subtitle: 'You can setup blocking rules in the <a href="#filters">Filters</a> settings.',
|
subtitle: this.props.t('You can setup blocking rules in the <a href="#filters">Filters</a> settings.'),
|
||||||
},
|
},
|
||||||
safebrowsing: {
|
safebrowsing: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
title: 'Use AdGuard browsing security web service',
|
title: this.props.t('Use AdGuard browsing security web service'),
|
||||||
subtitle: 'AdGuard Home will check if domain is blacklisted by the browsing security web service. It will use privacy-friendly lookup API to perform the check: only a short prefix of the domain name SHA256 hash is sent to the server.',
|
subtitle: this.props.t('AdGuard Home will check if domain is blacklisted by the browsing security web service. It will use privacy-friendly lookup API to perform the check: only a short prefix of the domain name SHA256 hash is sent to the server.'),
|
||||||
},
|
},
|
||||||
parental: {
|
parental: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
title: 'Use AdGuard parental control web service',
|
title: this.props.t('Use AdGuard parental control web service'),
|
||||||
subtitle: 'AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.',
|
subtitle: this.props.t('AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.'),
|
||||||
},
|
},
|
||||||
safesearch: {
|
safesearch: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
title: 'Enforce safe search',
|
title: this.props.t('Enforce safe search'),
|
||||||
subtitle: 'AdGuard Home can enforce safe search in the following search engines: Google, Bing, Yandex.',
|
subtitle: this.props.t('AdGuard Home can enforce safe search in the following search engines: Google, Bing, Yandex.'),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ export default class Settings extends Component {
|
||||||
if (this.props.dashboard.upstreamDns.length > 0) {
|
if (this.props.dashboard.upstreamDns.length > 0) {
|
||||||
this.props.testUpstream(this.props.dashboard.upstreamDns);
|
this.props.testUpstream(this.props.dashboard.upstreamDns);
|
||||||
} else {
|
} else {
|
||||||
this.props.addErrorToast({ error: 'No servers specified' });
|
this.props.addErrorToast({ error: this.props.t('No servers specified') });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -64,22 +65,22 @@ export default class Settings extends Component {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<div>No settings</div>
|
<div><Trans>No settings</Trans></div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { settings } = this.props;
|
const { settings, t } = this.props;
|
||||||
const { upstreamDns } = this.props.dashboard;
|
const { upstreamDns } = this.props.dashboard;
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<PageTitle title="Settings" />
|
<PageTitle title={ t('Settings') } />
|
||||||
{settings.processing && <Loading />}
|
{settings.processing && <Loading />}
|
||||||
{!settings.processing &&
|
{!settings.processing &&
|
||||||
<div className="content">
|
<div className="content">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-md-12">
|
<div className="col-md-12">
|
||||||
<Card title="General settings" bodyType="card-body box-body--settings">
|
<Card title={ t('General settings') } bodyType="card-body box-body--settings">
|
||||||
<div className="form">
|
<div className="form">
|
||||||
{this.renderSettings(settings.settingsList)}
|
{this.renderSettings(settings.settingsList)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -108,4 +109,7 @@ Settings.propTypes = {
|
||||||
handleUpstreamChange: PropTypes.func,
|
handleUpstreamChange: PropTypes.func,
|
||||||
setUpstream: PropTypes.func,
|
setUpstream: PropTypes.func,
|
||||||
upstream: PropTypes.string,
|
upstream: PropTypes.string,
|
||||||
|
t: PropTypes.func,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default withNamespaces()(Settings);
|
||||||
|
|
|
@ -15,10 +15,10 @@ i18n
|
||||||
keySeparator: false, // we use content as keys
|
keySeparator: false, // we use content as keys
|
||||||
interpolation: {
|
interpolation: {
|
||||||
escapeValue: false, // not needed for react!!
|
escapeValue: false, // not needed for react!!
|
||||||
formatSeparator: ',',
|
|
||||||
},
|
},
|
||||||
react: {
|
react: {
|
||||||
wait: true,
|
wait: true,
|
||||||
|
nsMode: 'fallback',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue