kopia lustrzana https://github.com/OpenDroneMap/WebODM
Merged i10n branch
rodzic
0abdb7e64d
commit
b075f24baa
|
@ -18,7 +18,7 @@ RUN wget --no-check-certificate https://deb.nodesource.com/setup_12.x -O /tmp/no
|
||||||
RUN apt-get -qq update && apt-get -qq install -y nodejs
|
RUN apt-get -qq update && apt-get -qq install -y nodejs
|
||||||
|
|
||||||
# Install Python3, GDAL, nginx, letsencrypt, psql
|
# Install Python3, GDAL, nginx, letsencrypt, psql
|
||||||
RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends python3 python3-pip python3-setuptools python3-wheel git g++ python3-dev libpq-dev binutils libproj-dev gdal-bin python3-gdal nginx certbot grass-core gettext-base cron postgresql-client-10
|
RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends python3 python3-pip python3-setuptools python3-wheel git g++ python3-dev libpq-dev binutils libproj-dev gdal-bin python3-gdal nginx certbot grass-core gettext-base cron postgresql-client-10 gettext
|
||||||
RUN update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 && update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
|
RUN update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 && update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
|
||||||
RUN ln -s /usr/bin/pip3 /usr/bin/pip && pip install -U pip
|
RUN ln -s /usr/bin/pip3 /usr/bin/pip && pip install -U pip
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[[paths]]
|
||||||
|
l10n = "locale/{locale}/LC_MESSAGES/**"
|
||||||
|
reference = "locale/*.pot"
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-04-20 20:31+0000\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:15 app/templates/app/dashboard.html:29
|
||||||
|
#: app/templates/app/welcome.html:227
|
||||||
|
msgid "Welcome! ☺"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:16
|
||||||
|
msgid "Add a Processing Node"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:19
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
" \n"
|
||||||
|
"\t\t\t\tTo get started, \"%(add_processing_node)s\". A processing node is a "
|
||||||
|
"computer running an instance of %(nodeodm_link)s or some other software that "
|
||||||
|
"implements this %(api_link)s.\n"
|
||||||
|
"\t\t\t"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:30
|
||||||
|
msgid "Select Images and GCP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:32
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
" To create a map, press the \"%(upload_images)s\" button, or drag and drop "
|
||||||
|
"some images into a project. "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:36
|
||||||
|
msgid "You need at least 5 images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:37
|
||||||
|
#, python-format
|
||||||
|
msgid "Images must overlap by 65%% or more"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:38
|
||||||
|
#, python-format
|
||||||
|
msgid "For great 3D, images must overlap by 83%%"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:39
|
||||||
|
msgid ""
|
||||||
|
"A <a href=\"https://github.com/OpenDroneMap/OpenDroneMap/wiki/Running-"
|
||||||
|
"OpenDroneMap#running-odm-with-ground-control\" target=\"_blank\">GCP file</"
|
||||||
|
"a> is optional, but can increase georeferencing accuracy"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:197
|
||||||
|
msgid "Hello"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:201
|
||||||
|
msgid "Logout"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:224
|
||||||
|
msgid "Dashboard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:273
|
||||||
|
msgid "Administration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:276
|
||||||
|
msgid "Accounts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:279
|
||||||
|
msgid "Groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:282
|
||||||
|
msgid "Brand"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:285
|
||||||
|
msgid "Theme"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:288
|
||||||
|
msgid "Plugins"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:291
|
||||||
|
msgid "Application"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:11
|
||||||
|
msgid "Hostname"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:15
|
||||||
|
msgid "Port"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:19
|
||||||
|
msgid "API Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:23
|
||||||
|
msgid "ODM Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:27
|
||||||
|
msgid "Queue Count"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:31
|
||||||
|
msgid "Max Images Limit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:35
|
||||||
|
msgid "Label"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:39
|
||||||
|
msgid "Last Refreshed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:40
|
||||||
|
msgid "ago"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:43
|
||||||
|
msgid "Options (JSON)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:49
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:50
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/welcome.html:224
|
||||||
|
msgid "Uh oh! Could you please check the errors below?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/welcome.html:237
|
||||||
|
msgid "Create Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/views/app.py:33
|
||||||
|
msgid "First Project"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/views/app.py:43 app/views/public.py:25
|
||||||
|
msgid "Map"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/views/app.py:70
|
||||||
|
msgid "3D Model Display"
|
||||||
|
msgstr ""
|
|
@ -0,0 +1,26 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-04-20 20:32+0000\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: plugins/lightning/public/Dashboard.jsx:38
|
||||||
|
msgid "Loading dashboard..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: plugins/lightning/public/Dashboard.jsx:150
|
||||||
|
msgid "Logout"
|
||||||
|
msgstr ""
|
|
@ -0,0 +1,178 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-04-20 20:31+0000\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:15 app/templates/app/dashboard.html:29
|
||||||
|
#: app/templates/app/welcome.html:227
|
||||||
|
msgid "Welcome! ☺"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:16
|
||||||
|
msgid "Add a Processing Node"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:19
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
" \n"
|
||||||
|
"\t\t\t\tTo get started, \"%(add_processing_node)s\". A processing node is a "
|
||||||
|
"computer running an instance of %(nodeodm_link)s or some other software that "
|
||||||
|
"implements this %(api_link)s.\n"
|
||||||
|
"\t\t\t"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:30
|
||||||
|
msgid "Select Images and GCP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:32
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
" To create a map, press the \"%(upload_images)s\" button, or drag and drop "
|
||||||
|
"some images into a project. "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:36
|
||||||
|
msgid "You need at least 5 images"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:37
|
||||||
|
#, python-format
|
||||||
|
msgid "Images must overlap by 65%% or more"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:38
|
||||||
|
#, python-format
|
||||||
|
msgid "For great 3D, images must overlap by 83%%"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/dashboard.html:39
|
||||||
|
msgid ""
|
||||||
|
"A <a href=\"https://github.com/OpenDroneMap/OpenDroneMap/wiki/Running-"
|
||||||
|
"OpenDroneMap#running-odm-with-ground-control\" target=\"_blank\">GCP file</"
|
||||||
|
"a> is optional, but can increase georeferencing accuracy"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:197
|
||||||
|
msgid "Hello"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:201
|
||||||
|
msgid "Logout"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:224
|
||||||
|
msgid "Dashboard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:273
|
||||||
|
msgid "Administration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:276
|
||||||
|
msgid "Accounts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:279
|
||||||
|
msgid "Groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:282
|
||||||
|
msgid "Brand"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:285
|
||||||
|
msgid "Theme"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:288
|
||||||
|
msgid "Plugins"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/logged_in_base.html:291
|
||||||
|
msgid "Application"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:11
|
||||||
|
msgid "Hostname"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:15
|
||||||
|
msgid "Port"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:19
|
||||||
|
msgid "API Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:23
|
||||||
|
msgid "ODM Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:27
|
||||||
|
msgid "Queue Count"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:31
|
||||||
|
msgid "Max Images Limit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:35
|
||||||
|
msgid "Label"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:39
|
||||||
|
msgid "Last Refreshed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:40
|
||||||
|
msgid "ago"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:43
|
||||||
|
msgid "Options (JSON)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:49
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/processing_node.html:50
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/welcome.html:224
|
||||||
|
msgid "Uh oh! Could you please check the errors below?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/templates/app/welcome.html:237
|
||||||
|
msgid "Create Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/views/app.py:33
|
||||||
|
msgid "First Project"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/views/app.py:43 app/views/public.py:25
|
||||||
|
msgid "Map"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/views/app.py:70
|
||||||
|
msgid "3D Model Display"
|
||||||
|
msgstr ""
|
|
@ -0,0 +1,27 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-04-20 20:32+0000\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: plugins/lightning/public/Dashboard.jsx:38
|
||||||
|
msgid "Loading dashboard..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: plugins/lightning/public/Dashboard.jsx:150
|
||||||
|
msgid "Logout"
|
||||||
|
msgstr ""
|
|
@ -3,6 +3,7 @@ import ErrorMessage from 'webodm/components/ErrorMessage';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import './Dashboard.scss';
|
import './Dashboard.scss';
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
|
import _ from 'gettext';
|
||||||
|
|
||||||
export default class Dashboard extends React.Component {
|
export default class Dashboard extends React.Component {
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
|
@ -34,7 +35,7 @@ export default class Dashboard extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
loadDashboard = () => {
|
loadDashboard = () => {
|
||||||
this.setState({loading: true, loadingMessage: "Loading dashboard..."});
|
this.setState({loading: true, loadingMessage: _("Loading dashboard...")});
|
||||||
|
|
||||||
$.get(this.apiUrl('/r/user')).done(json => {
|
$.get(this.apiUrl('/r/user')).done(json => {
|
||||||
if (json.balance !== undefined){
|
if (json.balance !== undefined){
|
||||||
|
@ -154,7 +155,7 @@ export default class Dashboard extends React.Component {
|
||||||
<div className="buttons text-right">
|
<div className="buttons text-right">
|
||||||
<hr/>
|
<hr/>
|
||||||
<button className="btn btn-sm btn-primary logout" onClick={this.handeLogout}>
|
<button className="btn btn-sm btn-primary logout" onClick={this.handeLogout}>
|
||||||
<i className="fa fa-power-off"></i> Logout
|
<i className="fa fa-power-off"></i> {_("Logout")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div> : ""}
|
</div> : ""}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
for lang in it
|
||||||
|
do
|
||||||
|
django-admin makemessages --keep-pot --locale=$lang --ignore=app/templates/app/admin/* --ignore=app/templates/app/registration/*
|
||||||
|
django-admin makemessages --keep-pot --locale=$lang -d djangojs --extension jsx
|
||||||
|
done
|
||||||
|
django-admin compilemessages
|
|
@ -88,7 +88,8 @@ module.exports = {
|
||||||
"SystemJS": "SystemJS",
|
"SystemJS": "SystemJS",
|
||||||
"THREE": "THREE",
|
"THREE": "THREE",
|
||||||
"React": "React",
|
"React": "React",
|
||||||
"ReactDOM": "ReactDOM"
|
"ReactDOM": "ReactDOM",
|
||||||
|
"gettext": "gettext"
|
||||||
},
|
},
|
||||||
|
|
||||||
watchOptions: {
|
watchOptions: {
|
||||||
|
|
Ładowanie…
Reference in New Issue