diff --git a/.gitignore b/.gitignore
index 5f7961c9bb..a64855e144 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@ venv
*.sublime*
.vscode/
.tox
+.DS_Store
diff --git a/examples/dash/README.rst b/examples/dash/README.rst
new file mode 100644
index 0000000000..fbebbe313e
--- /dev/null
+++ b/examples/dash/README.rst
@@ -0,0 +1,13 @@
+Dash embedded in FAB
+-----------------------
+
+Example of Dash embedded under flask-appbuilder
+
+thanks to @jimmybow (https://github.com/jimmybow/Flask_template_auth_with_Dash) for the inspiration
+
+
+Run it::
+
+ $ export FLASK_APP=app/__init__.py
+ $ flask fab create-admin
+ $ flask run
diff --git a/examples/dash/app/Dashboard/Dash_App1.py b/examples/dash/app/Dashboard/Dash_App1.py
new file mode 100644
index 0000000000..e68d9ac642
--- /dev/null
+++ b/examples/dash/app/Dashboard/Dash_App1.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Jul 8 10:39:33 2018
+
+@author: jimmybow
+"""
+from dash import Dash
+from dash.dependencies import Input, State, Output
+from .Dash_fun import apply_layout_with_auth, load_object, save_object
+import dash_core_components as dcc
+import dash_html_components as html
+
+url_base = "/dash/app1/"
+
+layout = html.Div(
+ [html.Div("This is dash app1"), html.Br(), dcc.Input(id="input_text"), html.Br(), html.Br(), html.Div(id="target")]
+)
+
+
+def Add_Dash(server, appbuilder):
+ app = Dash(server=server, url_base_pathname=url_base)
+ apply_layout_with_auth(app, layout, appbuilder)
+
+ @app.callback(Output("target", "children"), [Input("input_text", "value")])
+ def callback_fun(value):
+ return "your input is {}".format(value)
+
+ return app.server
diff --git a/examples/dash/app/Dashboard/Dash_App2.py b/examples/dash/app/Dashboard/Dash_App2.py
new file mode 100644
index 0000000000..2edb01ea2b
--- /dev/null
+++ b/examples/dash/app/Dashboard/Dash_App2.py
@@ -0,0 +1,41 @@
+from datetime import datetime as dt
+
+from dash import Dash
+
+import dash_core_components as dcc
+import dash_html_components as html
+import pandas_datareader as pdr
+from dash.dependencies import Input
+from dash.dependencies import Output
+from .Dash_fun import apply_layout_with_auth, load_object, save_object
+
+url_base = "/dash/app2/"
+
+layout = html.Div(
+ [
+ html.H1("Stock Tickers"),
+ dcc.Dropdown(
+ id="my-dropdown",
+ options=[
+ {"label": "Coke", "value": "COKE"},
+ {"label": "Tesla", "value": "TSLA"},
+ {"label": "Apple", "value": "AAPL"},
+ ],
+ value="COKE",
+ ),
+ dcc.Graph(id="my-graph"),
+ ],
+ style={"width": "500"},
+)
+
+
+def Add_Dash(server, appbuilder):
+ app = Dash(server=server, url_base_pathname=url_base)
+ apply_layout_with_auth(app, layout, appbuilder)
+
+ @app.callback(Output("my-graph", "figure"), [Input("my-dropdown", "value")])
+ def update_graph(selected_dropdown_value):
+ df = pdr.get_data_yahoo(selected_dropdown_value, start=dt(2017, 1, 1), end=dt.now())
+ return {"data": [{"x": df.index, "y": df.Close}], "layout": {"margin": {"l": 40, "r": 0, "t": 20, "b": 30}}}
+
+ return app.server
diff --git a/examples/dash/app/Dashboard/Dash_fun.py b/examples/dash/app/Dashboard/Dash_fun.py
new file mode 100644
index 0000000000..b188fb0e66
--- /dev/null
+++ b/examples/dash/app/Dashboard/Dash_fun.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Jan 25 22:34:51 2019
+
+@author: jimmybow
+"""
+
+from datetime import datetime, timedelta
+from flask_login import current_user
+from flask import redirect, has_app_context
+import dash_html_components as html
+import dash_core_components as dcc
+import pandas as pd
+import uuid
+import os
+import pickle
+
+
+def save_object(obj, session_id, name):
+ os.makedirs("Dir_Store", exist_ok=True)
+ file = "Dir_Store/{}_{}".format(session_id, name)
+ pickle.dump(obj, open(file, "wb"))
+
+
+def load_object(session_id, name):
+ file = "Dir_Store/{}_{}".format(session_id, name)
+ obj = pickle.load(open(file, "rb"))
+ os.remove(file)
+ return obj
+
+
+def clean_Dir_Store():
+ if os.path.isdir("Dir_Store"):
+ file_list = pd.Series("Dir_Store/" + i for i in os.listdir("Dir_Store"))
+ mt = file_list.apply(lambda x: datetime.fromtimestamp(os.path.getmtime(x))).astype(str)
+ for i in file_list[mt < str(datetime.now() - timedelta(hours=3))]:
+ os.remove(i)
+
+
+def apply_layout_with_auth(app, layout, appbuilder):
+ def serve_layout():
+ if current_user and current_user.is_authenticated:
+ session_id = str(uuid.uuid4())
+ clean_Dir_Store()
+ return html.Div([html.Div(session_id, id="session_id", style={"display": "none"}), layout])
+ loginurl = None
+ if has_app_context():
+ return dcc.Location(pathname=appbuilder.get_url_for_login, id="")
+ return None
+
+ app.config.suppress_callback_exceptions = True
+ app.layout = serve_layout
diff --git a/examples/dash/app/Dashboard/__init__.py b/examples/dash/app/Dashboard/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/examples/dash/app/__init__.py b/examples/dash/app/__init__.py
new file mode 100644
index 0000000000..cb9441b33f
--- /dev/null
+++ b/examples/dash/app/__init__.py
@@ -0,0 +1,21 @@
+import logging
+
+from flask import Flask
+from flask_appbuilder import AppBuilder, SQLA
+from .Dashboard import Dash_App1, Dash_App2
+
+"""
+ Logging configuration
+"""
+logging.basicConfig(format="%(asctime)s:%(levelname)s:%(name)s:%(message)s")
+logging.getLogger().setLevel(logging.DEBUG)
+
+
+app = Flask(__name__)
+app.config.from_object("config")
+db = SQLA(app)
+appbuilder = AppBuilder(app, db.session)
+app = Dash_App1.Add_Dash(app, appbuilder)
+app = Dash_App2.Add_Dash(app, appbuilder)
+
+from . import views # noqa
diff --git a/examples/dash/app/templates/dash.html b/examples/dash/app/templates/dash.html
new file mode 100644
index 0000000000..b54a3521f4
--- /dev/null
+++ b/examples/dash/app/templates/dash.html
@@ -0,0 +1,22 @@
+{% extends "appbuilder/baselayout.html" %}
+{% block head_css %}
+{{ super() }}
+
+{% endblock %}
+{% block content %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/examples/dash/app/views.py b/examples/dash/app/views.py
new file mode 100644
index 0000000000..6735727e30
--- /dev/null
+++ b/examples/dash/app/views.py
@@ -0,0 +1,36 @@
+from flask_appbuilder.baseviews import BaseView
+from flask_appbuilder import expose, has_access
+from .Dashboard import Dash_App1, Dash_App2
+
+from . import appbuilder
+
+
+class MyDashAppCallBack(BaseView):
+ route_base = "/"
+
+ @has_access
+ @expose("/dashboard_callback/")
+ def methoddash(self):
+ print("dash")
+ return self.render_template("dash.html", dash_url=Dash_App1.url_base, appbuilder=appbuilder)
+
+
+appbuilder.add_view_no_menu(MyDashAppCallBack())
+appbuilder.add_link(
+ "Dashboard Callback", href="/dashboard_callback/", icon="fa-list", category="Dash Demo", category_icon="fa-list"
+)
+
+
+class MyDashAppGraph(BaseView):
+ route_base = "/"
+
+ @has_access
+ @expose("/dashboard_graph/")
+ def methoddash(self):
+ return self.render_template("dash.html", dash_url=Dash_App2.url_base, appbuilder=appbuilder)
+
+
+appbuilder.add_view_no_menu(MyDashAppGraph())
+appbuilder.add_link(
+ "Dashboard Graph", href="/dashboard_graph/", icon="fa-list", category="Dash Demo", category_icon="fa-list"
+)
diff --git a/examples/dash/babel/babel.cfg b/examples/dash/babel/babel.cfg
new file mode 100644
index 0000000000..70e23ac634
--- /dev/null
+++ b/examples/dash/babel/babel.cfg
@@ -0,0 +1,3 @@
+[python: **.py]
+[jinja2: **/templates/**.html]
+encoding = utf-8
diff --git a/examples/dash/babel/messages.pot b/examples/dash/babel/messages.pot
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/examples/dash/babel/messages.pot
@@ -0,0 +1 @@
+
diff --git a/examples/dash/config.py b/examples/dash/config.py
new file mode 100644
index 0000000000..c9c9245105
--- /dev/null
+++ b/examples/dash/config.py
@@ -0,0 +1,57 @@
+import os
+
+basedir = os.path.abspath(os.path.dirname(__file__))
+
+CSRF_ENABLED = True
+SECRET_KEY = "\2\1thisismyscretkey\1\2\e\y\y\h"
+
+OPENID_PROVIDERS = [
+ {"name": "Google", "url": "https://www.google.com/accounts/o8/id"},
+ {"name": "Yahoo", "url": "https://me.yahoo.com"},
+ {"name": "AOL", "url": "http://openid.aol.com/"},
+ {"name": "Flickr", "url": "http://www.flickr.com/"},
+ {"name": "MyOpenID", "url": "https://www.myopenid.com"},
+]
+
+SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(basedir, "app.db")
+# SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
+# SQLALCHEMY_DATABASE_URI = 'postgresql://root:password@localhost/myapp'
+BABEL_DEFAULT_LOCALE = "en"
+
+
+# ------------------------------
+# GLOBALS FOR APP Builder
+# ------------------------------
+BABEL_DEFAULT_LOCALE = "en"
+BABEL_DEFAULT_FOLDER = "translations"
+LANGUAGES = {
+ "en": {"flag": "gb", "name": "English"},
+ "pt": {"flag": "pt", "name": "Portuguese"},
+ "es": {"flag": "es", "name": "Spanish"},
+ "de": {"flag": "de", "name": "German"},
+ "zh": {"flag": "cn", "name": "Chinese"},
+ "ru": {"flag": "ru", "name": "Russian"},
+}
+
+
+UPLOAD_FOLDER = basedir + "/app/static/uploads/"
+IMG_UPLOAD_FOLDER = basedir + "/app/static/uploads/"
+IMG_UPLOAD_URL = "/static/uploads/"
+AUTH_TYPE = 1
+AUTH_ROLE_ADMIN = "Admin"
+AUTH_ROLE_PUBLIC = "Public"
+# APP_NAME = "My App Name"
+# APP_ICON = "static/img/logo.jpg"
+APP_THEME = "" # default
+# APP_THEME = "cerulean.css"
+# APP_THEME = "amelia.css"
+# APP_THEME = "cosmo.css"
+# APP_THEME = "cyborg.css"
+# APP_THEME = "flatly.css"
+# APP_THEME = "journal.css"
+# APP_THEME = "readable.css"
+# APP_THEME = "simplex.css"
+# APP_THEME = "slate.css"
+# APP_THEME = "spacelab.css"
+# APP_THEME = "united.css"
+# APP_THEME = "yeti.css"
diff --git a/examples/dash/run.py b/examples/dash/run.py
new file mode 100644
index 0000000000..cd78bc086f
--- /dev/null
+++ b/examples/dash/run.py
@@ -0,0 +1,3 @@
+from app import app
+
+app.run(host="0.0.0.0", port=8080, debug=True)
diff --git a/flask_appbuilder/templates/appbuilder/general/security/login_oauth.html b/flask_appbuilder/templates/appbuilder/general/security/login_oauth.html
index 594820e134..98cfbc0fba 100644
--- a/flask_appbuilder/templates/appbuilder/general/security/login_oauth.html
+++ b/flask_appbuilder/templates/appbuilder/general/security/login_oauth.html
@@ -5,67 +5,66 @@
-
-
-
-
+
+
+
+
-
{{_("Please choose one of the following providers:")}}
-
-
+ {{_("Please choose one of the following providers:")}}
+
+
{% for pr in providers %}
-
-
-
+
+
+
{% endfor %}
-
-
-
+
+
+
+
-{% endblock %}
+{% endblock %}
\ No newline at end of file
diff --git a/flask_appbuilder/templates/appbuilder/general/security/register_oauth.html b/flask_appbuilder/templates/appbuilder/general/security/register_oauth.html
index c01bc931a0..10fc5b4760 100644
--- a/flask_appbuilder/templates/appbuilder/general/security/register_oauth.html
+++ b/flask_appbuilder/templates/appbuilder/general/security/register_oauth.html
@@ -5,23 +5,25 @@
-
-
-
-
+
+
+
+
-
{{_("Sign in using:")}}:
-
-
- {% for pr in providers %}
-
-
-
- {% endfor %}
-
+
{{_("Sign in using:")}}:
+
+
+ {% for pr in providers %}
+
+
+
+ {% endfor %}
+
+
-
-{% endblock %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/flask_appbuilder/translations/it/LC_MESSAGES/messages.mo b/flask_appbuilder/translations/it/LC_MESSAGES/messages.mo
new file mode 100644
index 0000000000..dda0da6144
Binary files /dev/null and b/flask_appbuilder/translations/it/LC_MESSAGES/messages.mo differ
diff --git a/flask_appbuilder/translations/it/LC_MESSAGES/messages.po b/flask_appbuilder/translations/it/LC_MESSAGES/messages.po
new file mode 100644
index 0000000000..8879d1f58a
--- /dev/null
+++ b/flask_appbuilder/translations/it/LC_MESSAGES/messages.po
@@ -0,0 +1,546 @@
+# Italian translations for PROJECT.
+# Copyright (C) 2018 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR
, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2018-04-26 22:56+0100\n"
+"PO-Revision-Date: 2020-03-09 08:51+0100\n"
+"Last-Translator: FULL NAME \n"
+"Language: it\n"
+"Language-Team: it \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: build/lib/flask_appbuilder/const.py:111 flask_appbuilder/const.py:111
+msgid "Access is Denied"
+msgstr "Accesso Negato"
+
+#: build/lib/flask_appbuilder/fields.py:131
+#: build/lib/flask_appbuilder/fields.py:133
+#: build/lib/flask_appbuilder/fields.py:185
+#: build/lib/flask_appbuilder/fields.py:192
+#: build/lib/flask_appbuilder/fields.py:242 flask_appbuilder/fields.py:131
+#: flask_appbuilder/fields.py:133 flask_appbuilder/fields.py:185
+#: flask_appbuilder/fields.py:192 flask_appbuilder/fields.py:242
+msgid "Not a valid choice"
+msgstr "Selezione non valida"
+
+#: build/lib/flask_appbuilder/fieldwidgets.py:153
+#: build/lib/flask_appbuilder/fieldwidgets.py:172
+#: flask_appbuilder/fieldwidgets.py:153 flask_appbuilder/fieldwidgets.py:172
+msgid "Select Value"
+msgstr "Selezione un valore"
+
+#: build/lib/flask_appbuilder/messages.py:9
+#: build/lib/flask_appbuilder/templates/appbuilder/general/charts/chart.html:8
+#: build/lib/flask_appbuilder/templates/appbuilder/general/charts/chart_time.html:10
+#: build/lib/flask_appbuilder/templates/appbuilder/general/charts/jsonchart.html:8
+#: build/lib/flask_appbuilder/templates/appbuilder/general/lib.html:303
+#: build/lib/flask_appbuilder/templates/appbuilder/general/model/list.html:8
+#: flask_appbuilder/messages.py:9
+#: flask_appbuilder/templates/appbuilder/general/charts/chart.html:8
+#: flask_appbuilder/templates/appbuilder/general/charts/chart_time.html:10
+#: flask_appbuilder/templates/appbuilder/general/charts/jsonchart.html:8
+#: flask_appbuilder/templates/appbuilder/general/lib.html:303
+#: flask_appbuilder/templates/appbuilder/general/model/list.html:8
+msgid "Search"
+msgstr "Ricerca"
+
+#: build/lib/flask_appbuilder/messages.py:10
+#: build/lib/flask_appbuilder/templates/appbuilder/general/lib.html:310
+#: examples/quickhowto2/app/templates/widgets/list_override.html:9
+#: flask_appbuilder/messages.py:10
+#: flask_appbuilder/templates/appbuilder/general/lib.html:310
+msgid "Back"
+msgstr "Indietro"
+
+#: build/lib/flask_appbuilder/messages.py:11
+#: build/lib/flask_appbuilder/templates/appbuilder/general/lib.html:263
+#: flask_appbuilder/messages.py:11
+#: flask_appbuilder/templates/appbuilder/general/lib.html:263
+msgid "Save"
+msgstr "Salva"
+
+#: build/lib/flask_appbuilder/messages.py:12 flask_appbuilder/messages.py:12
+msgid "This field is required."
+msgstr "Questo campo è obbligatorio"
+
+#: build/lib/flask_appbuilder/messages.py:13 flask_appbuilder/messages.py:13
+msgid "Not a valid date value"
+msgstr "La data inserita non è valida"
+
+#: build/lib/flask_appbuilder/messages.py:14
+#: build/lib/flask_appbuilder/templates/appbuilder/general/widgets/base_list.html:36
+#: build/lib/flask_appbuilder/templates/appbuilder/general/widgets/list_carousel.html:50
+#: build/lib/flask_appbuilder/templates/appbuilder/general/widgets/list_master.html:17
+#: examples/issue_169/app/templates/widgets/list.html:70
+#: examples/quickhowto2/app/templates/widgets/list.html:70
+#: flask_appbuilder/messages.py:14
+#: flask_appbuilder/templates/appbuilder/general/widgets/base_list.html:36
+#: flask_appbuilder/templates/appbuilder/general/widgets/list_carousel.html:50
+#: flask_appbuilder/templates/appbuilder/general/widgets/list_master.html:17
+msgid "No records found"
+msgstr "Nessun dato trovato"
+
+#: build/lib/flask_appbuilder/upload.py:159
+#: build/lib/flask_appbuilder/upload.py:211 flask_appbuilder/upload.py:159
+#: flask_appbuilder/upload.py:211
+msgid "Invalid file extension"
+msgstr "Estensione file non valida"
+
+#: build/lib/flask_appbuilder/validators.py:31
+#: flask_appbuilder/validators.py:31
+msgid "Already exists."
+msgstr "Già esistente"
+
+ msgid "Group by"
+ msgstr "Raggruppa per"
+
+ msgid "Added Row"
+ msgstr "Riga Aggiunta"
+
+ msgid "Changed Row"
+ msgstr "Riga modificata"
+
+ msgid "Deleted Row"
+ msgstr "Riga Cancellata"
+
+ msgid "Associated data exists, please delete them first"
+ msgstr "Esistono dei dati associati, si prega di cancellarli"
+
+
+ msgid "Integrity error, probably unique constraint"
+ msgstr "Errore di integrità"
+
+ msgid "General Error"
+ msgstr "Errore Generale"
+
+ msgid "Count of"
+ msgstr "Numero di"
+
+ msgid "Sum of"
+ msgstr "Somma di"
+
+ msgid "Avg. of"
+ msgstr "Media di"
+
+ msgid "Contains"
+ msgstr "Contiene"
+
+ msgid "Contains (insensitive)"
+ msgstr "Contiene (case-insensitive)"
+
+ msgid "Not Contains"
+ msgstr "Non contiene"
+
+ msgid "Equal to"
+ msgstr "Uguale a"
+
+ msgid "Not Equal to"
+ msgstr "Non uguale a"
+
+ msgid "Greater than"
+ msgstr "Maggiore di"
+
+ msgid "Smaller than"
+ msgstr "Minore di"
+
+ msgid "Start with"
+ msgstr "Inizia Con"
+
+ msgid "Starts with"
+ msgstr "Inizia Con"
+
+ msgid "Not Starts with"
+ msgstr "Non inizia con"
+
+ msgid "Relation"
+ msgstr "Relazione"
+
+ msgid "Relation as Many"
+ msgstr "Relazione multipla"
+
+ msgid "Ends with"
+ msgstr "Finisce con"
+
+ msgid "Not Ends with"
+ msgstr "Non finisce con"
+
+ msgid "No Relation"
+ msgstr "Nessuna Relazione"
+
+ msgid "OpenID"
+ msgstr "OpenID"
+
+ msgid "User Name"
+ msgstr "Nome Utente"
+
+ msgid "Remember me"
+ msgstr "Ricordami"
+
+ msgid "Password"
+ msgstr "Password"
+
+ msgid "First Name"
+ msgstr "Nome"
+
+ msgid "Write the user first name or names"
+ msgstr "Inserisci il nome o nomi dell'utente"
+
+ msgid "Last Name"
+ msgstr "Cognome"
+
+ msgid "Write the user last name"
+ msgstr "Inserisci il cognome dell'utente"
+
+ msgid ""
+ "Please use a good password policy, "
+ "this application does not check this "
+ "for you"
+ msgstr "Per favore utilizzare un buon criterio di password, questa applicazione non lo verifica"
+
+
+ msgid "Confirm Password"
+ msgstr "Confermare la Password"
+
+ msgid "Please rewrite the password to confirm"
+ msgstr "Reinserire la password per confermarla"
+
+
+ msgid "Passwords must match"
+ msgstr "Le password devono essere uguali"
+
+ msgid "Email"
+ msgstr "Email"
+
+ msgid "List Users"
+ msgstr "Elenco Utenti"
+
+ msgid "Security"
+ msgstr "Sicurezza"
+
+ msgid "List Roles"
+ msgstr "Elenco Ruoli"
+
+ msgid "User's Statistics"
+ msgstr "Statistiche Utente"
+
+ msgid "User Registrations"
+ msgstr "Registrazioni Utente"
+
+ msgid "Base Permissions"
+ msgstr "Permessi di base"
+
+ msgid "Views/Menus"
+ msgstr "Viste/Menu"
+
+ msgid "Permission on Views/Menus"
+ msgstr "Permessi Viste/Menu"
+
+ msgid "Account activation"
+ msgstr "Attivazione account"
+
+ msgid "Registration sent to your email"
+ msgstr "Registrazione inviata per email"
+
+ msgid "Not possible to register you at the moment, try again later"
+ msgstr "Non è possibile registrarsi al momento, riprovare più tardi"
+
+
+ msgid "Registration not found"
+ msgstr "Registrazione non trovata"
+
+ msgid "Fill out the registration form"
+ msgstr "Riempire il modulo di registrazione"
+
+ msgid "List Base Permissions"
+ msgstr "Elenco dei permessi di base"
+
+ msgid "Show Base Permission"
+ msgstr "Visualizza Permesso di base"
+
+ msgid "Add Base Permission"
+ msgstr "Aggiungi permesso di base"
+
+ msgid "Edit Base Permission"
+ msgstr "Modifica permesso di base"
+
+ msgid "Name"
+ msgstr "Nome"
+
+ msgid "List View Menus"
+ msgstr "Elenco delle Viste/Menu"
+
+ msgid "Show View Menu"
+ msgstr "Visualizza Vista/Menu"
+
+ msgid "Add View Menu"
+ msgstr "Aggiungi Vista/Menu"
+
+ msgid "Edit View Menu"
+ msgstr "Modifica Vista/Menu"
+
+ msgid "List Permissions on Views/Menus"
+ msgstr "Elenco dei permessi su Viste/Menu"
+
+ msgid "Show Permission on Views/Menus"
+ msgstr "Visualizza permessi su Viste/Menu"
+
+ msgid "Add Permission on Views/Menus"
+ msgstr "Aggiungi permessi su Viste/Menu"
+
+ msgid "Edit Permission on Views/Menus"
+ msgstr "Modifica permessi su Viste/Menu"
+
+ msgid "Permission"
+ msgstr "Permessi"
+
+ msgid "View/Menu"
+ msgstr "Vista/Menu"
+
+ msgid "Reset Password Form"
+ msgstr "Modulo Reset Password"
+
+ msgid "Password Changed"
+ msgstr "Password Modificata"
+
+ msgid "Edit User Information"
+ msgstr "Modifica le informazioni Utente"
+
+ msgid "User information changed"
+ msgstr "Informazioni utente modificate"
+
+ msgid "Show User"
+ msgstr "Visualizza Utente"
+
+ msgid "Add User"
+ msgstr "Aggiungi Utente"
+
+ msgid "Edit User"
+ msgstr "Modifica Utente"
+
+ msgid "Full Name"
+ msgstr "Nome Completo"
+
+ msgid "Is Active?"
+ msgstr "E' attivo?"
+
+ msgid "Role"
+ msgstr "Ruolo"
+
+ msgid "Last login"
+ msgstr "Ultimo accesso"
+
+ msgid "Login count"
+ msgstr "Numero di accessi"
+
+ msgid "Failed login count"
+ msgstr "Numero di accessi falliti"
+
+ msgid "Created on"
+ msgstr "Creato il"
+
+ msgid "Created by"
+ msgstr "Creato da"
+
+ msgid "Changed on"
+ msgstr "Modificato il"
+
+ msgid "Changed by"
+ msgstr "Modificato da"
+
+ msgid "Username valid for authentication on DB or LDAP, unused for OID auth"
+ msgstr "Nome Utente valido per l'autenticazione DB o LDAP, inutilizzato per OID."
+
+
+ msgid "It's not a good policy to remove a user, just make it inactive"
+ msgstr "Non è consigliato cancellare un Utente, è preferibile disattivarlo"
+
+
+ msgid "The user's email, this will also be used for OID auth"
+ msgstr "L'email dell'Utente, questo sarà usato anche per l'autenticazione OID"
+
+ msgid ""
+ "The user role on the application, "
+ "this will associate with a list of"
+ " permissions"
+ msgstr "Il ruolo dell'Utente, questo sarà associato ad un elenco di permessi"
+
+ msgid "Please rewrite the user's password to confirm"
+ msgstr "Reinserire la password dell'Utente per confermare"
+
+ msgid "User info"
+ msgstr "Informazioni Utente"
+
+ msgid "Personal Info"
+ msgstr "Informazioni Personali"
+
+ msgid "Audit Info"
+ msgstr "Informazioni di Audit"
+
+ msgid "Your user information"
+ msgstr "Informazioni sul vostro Utente"
+
+ msgid "Reset my password"
+ msgstr "Reimposta la mia Password"
+
+ msgid "Reset Password"
+ msgstr "Reimposta Password"
+
+ msgid "User Statistics"
+ msgstr "Statistiche Utente"
+
+ msgid "Show Role"
+ msgstr "Visualizza Ruolo"
+
+ msgid "Add Role"
+ msgstr "Aggiungi Ruolo"
+
+ msgid "Edit Role"
+ msgstr "Modifica Ruolo"
+
+ msgid "Permissions"
+ msgstr "Permessi"
+
+ msgid "Copy Role"
+ msgstr "Copia Ruolo"
+
+ msgid "Copy the selected roles?"
+ msgstr "Copiare i ruoli selezionati?"
+
+ msgid "List of Registration Requests"
+ msgstr "Elenco richieste di registrazione"
+
+ msgid "Show Registration"
+ msgstr "Visualizza Registrazione"
+
+ msgid "Invalid login. Please try again."
+ msgstr "Autenticazione non valida, riprovare."
+
+ msgid "Sign In"
+ msgstr "Autenticazione"
+
+ msgid "Profile"
+ msgstr "Profilo"
+
+ msgid "Logout"
+ msgstr "Esci"
+
+ msgid "Login"
+ msgstr "Entra"
+
+ msgid "Welcome"
+ msgstr "Benvenuto"
+
+ msgid "User confirmation needed"
+ msgstr "Richiesta conferma Utente"
+
+ msgid "Actions"
+ msgstr "Azioni"
+
+ msgid "Page size"
+ msgstr "Dimensione pagina"
+
+ msgid "Order by"
+ msgstr "Ordina per"
+
+ msgid "Record Count"
+ msgstr "Numero di dati"
+
+ msgid "Add a new record"
+ msgstr "Aggiungi dato"
+
+ msgid "Edit record"
+ msgstr "Modifica dato"
+
+ msgid "Show record"
+ msgstr "Visualizza dato"
+
+ msgid "You sure you want to delete this item?"
+ msgstr "Sei sicuro di voler cancellare questo dato??"
+
+ msgid "Delete record"
+ msgstr "Cancella dato"
+
+ msgid "Group by fields"
+ msgstr "Raggruppa per campi"
+
+ msgid "Detail"
+ msgstr "Dettaglio"
+
+ msgid "Your user is activated you can now proceed to login"
+ msgstr "L'utenza è attivata, procedere con l'accesso"
+
+ msgid "Enter your login and password below"
+ msgstr "Inserire nome Utente e password"
+
+ msgid "Username"
+ msgstr "Nome Utente"
+
+ msgid "If you are not already a user, please register"
+ msgstr "Se non siete già utenti siete pregati di registrarvi"
+
+ msgid "Register"
+ msgstr "Registra"
+
+ msgid "Please choose one of the following providers:"
+ msgstr "Per favore selezionare uno dei seguenti provider:"
+
+ msgid "Click on your OpenID provider below"
+ msgstr "Clicca sul provider OpenID"
+
+ msgid "Or enter your OpenID here"
+ msgstr "o inserite la vostra OpenID"
+
+ msgid "Please choose a provider"
+ msgstr "Selezionare un provider"
+
+ msgid "Enter your OpenID Username"
+ msgstr "Inserire nome Utente OpenID"
+
+ msgid "Sign in using:"
+ msgstr "Accedi con"
+
+ msgid "Add Filter"
+ msgstr "Aggiungi Filtro"
+
+ msgid "Emp. Number"
+ msgstr "Imp. Numero"
+
+ msgid "Employee Number"
+ msgstr "Impiegato Numero"
+
+ msgid "Test Field One"
+ msgstr "Campo Prova Uno"
+
+ msgid "List Groups"
+ msgstr "Elenco Gruppi"
+
+ msgid "Manage Groups"
+ msgstr "Gestione Gruppi"
+
+ msgid "List Contacts"
+ msgstr "Elenco Contatti"
+
+ msgid "Contacts Chart"
+ msgstr "Grafico Contatti"
+
+ msgid "Contacts Birth Chart"
+ msgstr "Grafico Compleanno Contatti"
+
+ msgid "Tweet message"
+ msgstr "Messaggio Tweet"
+
+ msgid "My form View"
+ msgstr "La mia vista modulo"
+
+ msgid "Page not found"
+ msgstr "Pagina non trovata"
+