Commits

Martín Mulone committed 9c54687

The welcome app from web2py

Comments (0)

Files changed (63)

+Write something about this app.
+Developed with web2py.
+The web2py welcome app is licensed under public domain 
+(except for the css and js files that it includes, which have their own third party licenses).
+
+You can modify this license when you add your own code.
Empty file added.
Binary file added.

controllers/appadmin.py

+# -*- coding: utf-8 -*-
+
+# ##########################################################
+# ## make sure administrator is on localhost
+# ###########################################################
+
+import os
+import socket
+import datetime
+import copy
+import gluon.contenttype
+import gluon.fileutils
+
+# ## critical --- make a copy of the environment
+
+global_env = copy.copy(globals())
+global_env['datetime'] = datetime
+
+http_host = request.env.http_host.split(':')[0]
+remote_addr = request.env.remote_addr
+try:
+    hosts = (http_host, socket.gethostname(),
+             socket.gethostbyname(http_host),
+             '::1','127.0.0.1','::ffff:127.0.0.1')
+except:
+    hosts = (http_host, )
+
+if request.env.http_x_forwarded_for or request.env.wsgi_url_scheme\
+     in ['https', 'HTTPS']:
+    session.secure()
+elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
+    raise HTTP(200, T('appadmin is disabled because insecure channel'))
+
+if (request.application=='admin' and not session.authorized) or \
+        (request.application!='admin' and not gluon.fileutils.check_credentials(request)):
+    redirect(URL('admin', 'default', 'index'))
+
+ignore_rw = True
+response.view = 'appadmin.html'
+response.menu = [[T('design'), False, URL('admin', 'default', 'design',
+                 args=[request.application])], [T('db'), False,
+                 URL('index')], [T('state'), False,
+                 URL('state')], [T('cache'), False,
+                 URL('ccache')]]
+
+# ##########################################################
+# ## auxiliary functions
+# ###########################################################
+
+
+def get_databases(request):
+    dbs = {}
+    for (key, value) in global_env.items():
+        cond = False
+        try:
+            cond = isinstance(value, GQLDB)
+        except:
+            cond = isinstance(value, SQLDB)
+        if cond:
+            dbs[key] = value
+    return dbs
+
+
+databases = get_databases(None)
+
+
+def eval_in_global_env(text):
+    exec ('_ret=%s' % text, {}, global_env)
+    return global_env['_ret']
+
+
+def get_database(request):
+    if request.args and request.args[0] in databases:
+        return eval_in_global_env(request.args[0])
+    else:
+        session.flash = T('invalid request')
+        redirect(URL('index'))
+
+
+def get_table(request):
+    db = get_database(request)
+    if len(request.args) > 1 and request.args[1] in db.tables:
+        return (db, request.args[1])
+    else:
+        session.flash = T('invalid request')
+        redirect(URL('index'))
+
+
+def get_query(request):
+    try:
+        return eval_in_global_env(request.vars.query)
+    except Exception:
+        return None
+
+
+def query_by_table_type(tablename,db,request=request):
+    keyed = hasattr(db[tablename],'_primarykey')
+    if keyed:
+        firstkey = db[tablename][db[tablename]._primarykey[0]]
+        cond = '>0'
+        if firstkey.type in ['string', 'text']:
+            cond = '!=""'
+        qry = '%s.%s.%s%s' % (request.args[0], request.args[1], firstkey.name, cond)
+    else:
+        qry = '%s.%s.id>0' % tuple(request.args[:2])
+    return qry
+
+
+
+# ##########################################################
+# ## list all databases and tables
+# ###########################################################
+
+
+def index():
+    return dict(databases=databases)
+
+
+# ##########################################################
+# ## insert a new record
+# ###########################################################
+
+
+def insert():
+    (db, table) = get_table(request)
+    form = SQLFORM(db[table], ignore_rw=ignore_rw)
+    if form.accepts(request.vars, session):
+        response.flash = T('new record inserted')
+    return dict(form=form,table=db[table])
+
+
+# ##########################################################
+# ## list all records in table and insert new record
+# ###########################################################
+
+
+def download():
+    import os
+    db = get_database(request)
+    return response.download(request,db)
+
+def csv():
+    import gluon.contenttype
+    response.headers['Content-Type'] = \
+        gluon.contenttype.contenttype('.csv')
+    db = get_database(request)
+    query = get_query(request)
+    if not query:
+        return None
+    response.headers['Content-disposition'] = 'attachment; filename=%s_%s.csv'\
+         % tuple(request.vars.query.split('.')[:2])
+    return str(db(query).select())
+
+
+def import_csv(table, file):
+    table.import_from_csv_file(file)
+
+def select():
+    import re
+    db = get_database(request)
+    dbname = request.args[0]
+    regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)')
+    if len(request.args)>1 and hasattr(db[request.args[1]],'_primarykey'):
+        regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)')
+    if request.vars.query:
+        match = regex.match(request.vars.query)
+        if match:
+            request.vars.query = '%s.%s.%s==%s' % (request.args[0],
+                    match.group('table'), match.group('field'),
+                    match.group('value'))
+    else:
+        request.vars.query = session.last_query
+    query = get_query(request)
+    if request.vars.start:
+        start = int(request.vars.start)
+    else:
+        start = 0
+    nrows = 0
+    stop = start + 100
+    table = None
+    rows = []
+    orderby = request.vars.orderby
+    if orderby:
+        orderby = dbname + '.' + orderby
+        if orderby == session.last_orderby:
+            if orderby[0] == '~':
+                orderby = orderby[1:]
+            else:
+                orderby = '~' + orderby
+    session.last_orderby = orderby
+    session.last_query = request.vars.query
+    form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
+                _name='query', _value=request.vars.query or '',
+                requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR(T('Update:'),
+                INPUT(_name='update_check', _type='checkbox',
+                value=False), INPUT(_style='width:400px',
+                _name='update_fields', _value=request.vars.update_fields
+                 or '')), TR(T('Delete:'), INPUT(_name='delete_check',
+                _class='delete', _type='checkbox', value=False), ''),
+                TR('', '', INPUT(_type='submit', _value='submit'))),
+                _action=URL(r=request,args=request.args))
+    if request.vars.csvfile != None:
+        try:
+            import_csv(db[request.vars.table],
+                       request.vars.csvfile.file)
+            response.flash = T('data uploaded')
+        except Exception, e:
+            response.flash = DIV(T('unable to parse csv file'),PRE(str(e)))
+    if form.accepts(request.vars, formname=None):
+#         regex = re.compile(request.args[0] + '\.(?P<table>\w+)\.id\>0')
+        regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+')
+
+        match = regex.match(form.vars.query.strip())
+        if match:
+            table = match.group('table')
+        try:
+            nrows = db(query).count()
+            if form.vars.update_check and form.vars.update_fields:
+                db(query).update(**eval_in_global_env('dict(%s)'
+                                  % form.vars.update_fields))
+                response.flash = T('%s rows updated', nrows)
+            elif form.vars.delete_check:
+                db(query).delete()
+                response.flash = T('%s rows deleted', nrows)
+            nrows = db(query).count()
+            if orderby:
+                rows = db(query).select(limitby=(start, stop),
+                        orderby=eval_in_global_env(orderby))
+            else:
+                rows = db(query).select(limitby=(start, stop))
+        except Exception, e:
+            (rows, nrows) = ([], 0)
+            response.flash = DIV(T('Invalid Query'),PRE(str(e)))
+    return dict(
+        form=form,
+        table=table,
+        start=start,
+        stop=stop,
+        nrows=nrows,
+        rows=rows,
+        query=request.vars.query,
+        )
+
+
+# ##########################################################
+# ## edit delete one record
+# ###########################################################
+
+
+def update():
+    (db, table) = get_table(request)
+    keyed = hasattr(db[table],'_primarykey')
+    record = None
+    if keyed:
+        key = [f for f in request.vars if f in db[table]._primarykey]
+        if key:
+            record = db(db[table][key[0]] == request.vars[key[0]]).select().first()
+    else:
+        record = db(db[table].id == request.args(2)).select().first()
+
+    if not record:
+        qry = query_by_table_type(table, db)
+        session.flash = T('record does not exist')
+        redirect(URL('select', args=request.args[:1],
+                     vars=dict(query=qry)))
+
+    if keyed:
+        for k in db[table]._primarykey:
+            db[table][k].writable=False
+
+    form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'),
+                   ignore_rw=ignore_rw and not keyed,
+                   linkto=URL('select',
+                   args=request.args[:1]), upload=URL(r=request,
+                   f='download', args=request.args[:1]))
+
+    if form.accepts(request.vars, session):
+        session.flash = T('done!')
+        qry = query_by_table_type(table, db)
+        redirect(URL('select', args=request.args[:1],
+                 vars=dict(query=qry)))
+    return dict(form=form,table=db[table])
+
+
+# ##########################################################
+# ## get global variables
+# ###########################################################
+
+
+def state():
+    return dict()
+
+def ccache():
+    form = FORM(
+        P(TAG.BUTTON("Clear CACHE?", _type="submit", _name="yes", _value="yes")),
+        P(TAG.BUTTON("Clear RAM", _type="submit", _name="ram", _value="ram")),
+        P(TAG.BUTTON("Clear DISK", _type="submit", _name="disk", _value="disk")),
+    )
+
+    if form.accepts(request.vars, session):
+        clear_ram = False
+        clear_disk = False
+        session.flash = ""
+        if request.vars.yes:
+            clear_ram = clear_disk = True
+        if request.vars.ram:
+            clear_ram = True
+        if request.vars.disk:
+            clear_disk = True
+
+        if clear_ram:
+            cache.ram.clear()
+            session.flash += "Ram Cleared "
+        if clear_disk:
+            cache.disk.clear()
+            session.flash += "Disk Cleared"
+
+        redirect(URL(r=request))
+
+    try:
+        from guppy import hpy; hp=hpy()
+    except ImportError:
+        hp = False
+
+    import shelve, os, copy, time, math
+    from gluon import portalocker
+
+    ram = {
+        'bytes': 0,
+        'objects': 0,
+        'hits': 0,
+        'misses': 0,
+        'ratio': 0,
+        'oldest': time.time()
+    }
+    disk = copy.copy(ram)
+    total = copy.copy(ram)
+
+    for key, value in cache.ram.storage.items():
+        if isinstance(value, dict):
+            ram['hits'] = value['hit_total'] - value['misses']
+            ram['misses'] = value['misses']
+            try:
+                ram['ratio'] = ram['hits'] * 100 / value['hit_total']
+            except (KeyError, ZeroDivisionError):
+                ram['ratio'] = 0
+        else:
+            if hp:
+                ram['bytes'] += hp.iso(value[1]).size
+                ram['objects'] += hp.iso(value[1]).count
+
+                if value[0] < ram['oldest']:
+                    ram['oldest'] = value[0]
+
+    locker = open(os.path.join(request.folder,
+                                        'cache/cache.lock'), 'a')
+    portalocker.lock(locker, portalocker.LOCK_EX)
+    disk_storage = shelve.open(os.path.join(request.folder, 'cache/cache.shelve'))
+    try:
+        for key, value in disk_storage.items():
+            if isinstance(value, dict):
+                disk['hits'] = value['hit_total'] - value['misses']
+                disk['misses'] = value['misses']
+                try:
+                    disk['ratio'] = disk['hits'] * 100 / value['hit_total']
+                except (KeyError, ZeroDivisionError):
+                    disk['ratio'] = 0
+            else:
+                if hp:
+                    disk['bytes'] += hp.iso(value[1]).size
+                    disk['objects'] += hp.iso(value[1]).count
+                    if value[0] < disk['oldest']:
+                        disk['oldest'] = value[0]
+    finally:
+        portalocker.unlock(locker)
+        locker.close()
+        disk_storage.close()
+
+    total['bytes'] = ram['bytes'] + disk['bytes']
+    total['objects'] = ram['objects'] + disk['objects']
+    total['hits'] = ram['hits'] + disk['hits']
+    total['misses'] = ram['misses'] + disk['misses']
+    try:
+        total['ratio'] = total['hits'] * 100 / (total['hits'] + total['misses'])
+    except (KeyError, ZeroDivisionError):
+        total['ratio'] = 0
+
+    if disk['oldest'] < ram['oldest']:
+        total['oldest'] = disk['oldest']
+    else:
+        total['oldest'] = ram['oldest']
+
+    def GetInHMS(seconds):
+        hours = math.floor(seconds / 3600)
+        seconds -= hours * 3600
+        minutes = math.floor(seconds / 60)
+        seconds -= minutes * 60
+        seconds = math.floor(seconds)
+
+        return (hours, minutes, seconds)
+
+    ram['oldest'] = GetInHMS(time.time() - ram['oldest'])
+    disk['oldest'] = GetInHMS(time.time() - disk['oldest'])
+    total['oldest'] = GetInHMS(time.time() - total['oldest'])
+
+    return dict(form=form, total=total,
+                ram=ram, disk=disk)
+

controllers/default.py

+# -*- coding: utf-8 -*-
+# this file is released under public domain and you can use without limitations
+
+#########################################################################
+## This is a samples controller
+## - index is the default action of any application
+## - user is required for authentication and authorization
+## - download is for downloading files uploaded in the db (does streaming)
+## - call exposes all registered services (none by default)
+#########################################################################
+
+def index():
+    """
+    example action using the internationalization operator T and flash
+    rendered by views/default/index.html or views/generic.html
+    """
+    return dict(message=T('Hello World'))
+
+def user():
+    """
+    exposes:
+    http://..../[app]/default/user/login
+    http://..../[app]/default/user/logout
+    http://..../[app]/default/user/register
+    http://..../[app]/default/user/profile
+    http://..../[app]/default/user/retrieve_password
+    http://..../[app]/default/user/change_password
+    use @auth.requires_login()
+        @auth.requires_membership('group name')
+        @auth.requires_permission('read','table name',record_id)
+    to decorate functions that need access control
+    """
+    return dict(form=auth())
+
+
+def download():
+    """
+    allows downloading of uploaded files
+    http://..../[app]/default/download/[filename]
+    """
+    return response.download(request,db)
+
+
+def call():
+    """
+    exposes services. for example:
+    http://..../[app]/default/call/jsonrpc
+    decorate with @services.jsonrpc the functions to expose
+    supports xml, json, xmlrpc, jsonrpc, amfrpc, rss, csv
+    """
+    return service()
+
+
+@auth.requires_signature()
+def data():
+    """
+    http://..../[app]/default/data/tables
+    http://..../[app]/default/data/create/[table]
+    http://..../[app]/default/data/read/[table]/[id]
+    http://..../[app]/default/data/update/[table]/[id]
+    http://..../[app]/default/data/delete/[table]/[id]
+    http://..../[app]/default/data/select/[table]
+    http://..../[app]/default/data/search/[table]
+    but URLs bust be signed, i.e. linked with
+      A('table',_href=URL('data/tables',user_signature=True))
+    or with the signed load operator
+      LOAD('default','data.load',args='tables',ajax=True,user_signature=True)
+    """
+    return dict(form=crud())
+#crontab

languages/cs-cz.py

+# cs-cz.py pro web2py
+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" je voliteľný výraz ako "field1=\'newvalue\'". Nemôžete upravovať alebo zmazať výsledky JOINu',
+'%Y-%m-%d': '%d.%m.%Y',
+'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
+'%s rows deleted': '%s zmazaných záznamů',
+'%s rows updated': '%s upravených záznamů',
+'Administrative interface': 'pro administrátorské rozhranie kliknite sem',
+'Are you sure you want to delete this object?': 'Opravdu chceš odstranit tento objekt?',
+'Available databases and tables': 'Dostupné databáze a tabuľky',
+'Cannot be empty': 'Nemůže být prázdné',
+'Change password': 'Změna hesla',
+'Check to delete': 'Označit ke smazání',
+'Check to delete:': 'Check to delete:',
+'Client IP': 'Client IP',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Aktuální požadavek',
+'Current response': 'Aktuální odpověď',
+'Current session': 'Aktuální session',
+'DB Model': 'DB Model',
+'Database': 'Databáze',
+'Delete:': 'Smazat:',
+'Description': 'Popis',
+'Documentation': 'Dokumentáce',
+'E-mail': 'E-mail',
+'Edit': 'Upravit',
+'Edit Profile': 'Upravit profil',
+'Edit current record': 'Upravit aktuální záznam',
+'First name': 'Křestní jméno',
+'Group %(group_id)s created': 'Skupina %(group_id)s vytvořena',
+'Group ID': 'ID skupiny',
+'Hello World': 'Ahoj světe',
+'Import/Export': 'Import/Export',
+'Index': 'Index',
+'Internal State': 'Vnitřní stav',
+'Invalid Query': 'Neplatná dotaz',
+'Invalid email': 'Neplatný email',
+'Invalid password': 'Nesprávné heslo',
+'Last name': 'Příjmení',
+'Layout': 'Layout',
+'Logged in': 'Přihlášení úspěšné',
+'Logged out': 'Odhlášení úspěšné',
+'Login': 'Login',
+'Lost Password': 'Ztracené heslo?',
+'Menu Model': 'Menu Model',
+'Name': 'Jméno',
+'New Record': 'Nový záznam',
+'New password': 'Nové heslo',
+'No databases in this application': 'V této aplikáci nejsou databáze',
+'Object or table name': 'Objekt či tabulka',
+'Old password': 'Staré heslo',
+'Online examples': 'pro online příklady klikněte sem',
+'Origin': 'Púvod',
+'Password': 'Heslo',
+"Password fields don't match": 'Hesla se neshodují',
+'Powered by': 'Powered by',
+'Query:': 'Dotaz:',
+'Readme': 'Nápověda',
+'Record ID': 'ID záznamu',
+'Register': 'Zaregistrovat se',
+'Registration identifier': 'Registrační identifikátor',
+'Registration key': 'Registrační kľíč',
+'Remember me (for 30 days)': 'Zapamatuj si mne (na 30 dní)',
+'Reset Password key': 'Nastavit registrační kľíč',
+'Retrieve username': 'Retrieve username',
+'Role': 'Role',
+'Rows in table': 'řádků v tabulce',
+'Rows selected': 'označených řádků',
+'Stylesheet': 'CSS',
+'Submit': 'Odeslat',
+'Sure you want to delete this object?': 'Opravdu chceš smazat tento objekt?',
+'Table name': 'Název tabulky',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" je podmínka jako "db.table1.field1==\'value\'". Něco jako "db.table1.field1==db.table2.field2" má za výsledek SQL JOIN.',
+'The output of the file is a dictionary that was rendered by the view': 'Výstup zo souboru je slovník, ktorý byl zobrazený ve view',
+'This is a copy of the scaffolding application': 'Toto je kopie skeletu aplikace',
+'Timestamp': 'Časové razítko',
+'Update:': 'Upravit:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Použijte (...)&(...) pro AND, (...)|(...) pro OR a ~(...) pro NOT na poskládaní komplexnejších dotazů.',
+'User %(id)s Logged-in': 'Uživatel %(id)s prihlásen',
+'User %(id)s Logged-out': 'Uživatel %(id)s odhlášen',
+'User %(id)s Password changed': 'Uživatel %(id)s zmenil heslo',
+'User %(id)s Profile updated': 'Uživatel %(id)s upravil profil',
+'User %(id)s Registered': 'Uživatel %(id)s se zaregistroval',
+'User %(id)s Username retrieved': 'User %(id)s Username retrieved',
+'User ID': 'ID uživatele',
+'Username': 'Nick',
+'Verify Password': 'Zopakuj heslo',
+'View': 'Zobrazit',
+'Welcome': 'Vítej',
+'Welcome to web2py': 'Vitejte ve web2py',
+'Which called the function': 'Ktorý zavolal funkci',
+'You are successfully running web2py': 'Úspešně jste spustili web2py',
+'You can modify this application and adapt it to your needs': 'Můžete upravit tuto aplikáci a prispôsobit ji svojim potřebám',
+'You visited the url': 'Navštívili jste URL',
+'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojení',
+'cache': 'cache',
+'customize me!': 'uprav mě!',
+'data uploaded': 'data nahrána',
+'database': 'databáze',
+'database %s select': 'databáze %s výber',
+'db': 'db',
+'design': 'návrh',
+'done!': 'hotovo!',
+'enter a number between %(min)g and %(max)g': 'zadej číslo mezi %(min)g a %(max)g',
+'enter an integer between %(min)g and %(max)g': 'zadej celé číslo mezi %(min)g a %(max)g',
+'export as csv file': 'exportovat do csv souboru',
+'forgot username?': 'neznáš svúj nick?',
+'insert new': 'vložit nový záznam ',
+'insert new %s': 'vložit nový  záznam %s',
+'invalid request': 'Neplatný požadavek',
+'located in the file': 'v souboru ',
+'login': 'prihlásit',
+'logout': 'odhlásit',
+'lost password?': 'neznáš heslo?',
+'new record inserted': 'nový záznam byl vložen',
+'next 100 rows': 'dalších 100 řádků',
+'or import from csv file': 'a nebo naimportovat z csv souboru',
+'password': 'heslo',
+'previous 100 rows': 'předchádzajících 100 řádků',
+'profile': 'profil',
+'record': 'záznam',
+'record does not exist': 'záznam neexistuje',
+'record id': 'id záznamu',
+'register': 'registrovat',
+'selected': 'označených',
+'state': 'stav',
+'table': 'tabulka',
+'unable to parse csv file': 'nedá sa zpracovat csv soubor',
+}

languages/es-es.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"actualice" es una expresión opcional como "campo1=\'nuevo_valor\'". No se puede actualizar o eliminar resultados de un JOIN',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'%s rows deleted': '%s filas eliminadas',
+'%s rows updated': '%s filas actualizadas',
+'(something like "it-it")': '(algo como "it-it")',
+'A new version of web2py is available': 'Hay una nueva versión de web2py disponible',
+'A new version of web2py is available: %s': 'Hay una nueva versión de web2py disponible: %s',
+'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
+'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
+'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
+'About': 'Acerca de',
+'About application': 'Acerca de la aplicación',
+'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
+'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
+'Administrator Password:': 'Contraseña del Administrador:',
+'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
+'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
+'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
+'Authentication': 'Autenticación',
+'Available databases and tables': 'Bases de datos y tablas disponibles',
+'Cannot be empty': 'No puede estar vacío',
+'Cannot compile: there are errors in your app.        Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
+'Change Password': 'Cambie Contraseña',
+'Check to delete': 'Marque para eliminar',
+'Client IP': 'IP del Cliente',
+'Controller': 'Controlador',
+'Controllers': 'Controladores',
+'Copyright': 'Derechos de autor',
+'Create new application': 'Cree una nueva aplicación',
+'Current request': 'Solicitud en curso',
+'Current response': 'Respuesta en curso',
+'Current session': 'Sesión en curso',
+'DB Model': 'Modelo "db"',
+'DESIGN': 'DISEÑO',
+'Database': 'Base de datos',
+'Date and Time': 'Fecha y Hora',
+'Delete': 'Elimine',
+'Delete:': 'Elimine:',
+'Deploy on Google App Engine': 'Instale en Google App Engine',
+'Description': 'Descripción',
+'Design for': 'Diseño para',
+'E-mail': 'Correo electrónico',
+'EDIT': 'EDITAR',
+'Edit': 'Editar',
+'Edit Profile': 'Editar Perfil',
+'Edit This App': 'Edite esta App',
+'Edit application': 'Editar aplicación',
+'Edit current record': 'Edite el registro actual',
+'Editing file': 'Editando archivo',
+'Editing file "%s"': 'Editando archivo "%s"',
+'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
+'First name': 'Nombre',
+'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
+'Group ID': 'ID de Grupo',
+'Hello World': 'Hola Mundo',
+'Import/Export': 'Importar/Exportar',
+'Index': 'Indice',
+'Installed applications': 'Aplicaciones instaladas',
+'Internal State': 'Estado Interno',
+'Invalid Query': 'Consulta inválida',
+'Invalid action': 'Acción inválida',
+'Invalid email': 'Correo inválido',
+'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
+'Languages': 'Lenguajes',
+'Last name': 'Apellido',
+'Last saved on:': 'Guardado en:',
+'Layout': 'Diseño de página',
+'License for': 'Licencia para',
+'Login': 'Inicio de sesión',
+'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
+'Logout': 'Fin de sesión',
+'Lost Password': 'Contraseña perdida',
+'Main Menu': 'Menú principal',
+'Menu Model': 'Modelo "menu"',
+'Models': 'Modelos',
+'Modules': 'Módulos',
+'NO': 'NO',
+'Name': 'Nombre',
+'New Record': 'Registro nuevo',
+'No databases in this application': 'No hay bases de datos en esta aplicación',
+'Origin': 'Origen',
+'Original/Translation': 'Original/Traducción',
+'Password': 'Contraseña',
+'Peeking at file': 'Visualizando archivo',
+'Powered by': 'Este sitio usa',
+'Query:': 'Consulta:',
+'Record ID': 'ID de Registro',
+'Register': 'Registrese',
+'Registration key': 'Contraseña de Registro',
+'Reset Password key': 'Reset Password key',
+'Resolve Conflict file': 'archivo Resolución de Conflicto',
+'Role': 'Rol',
+'Rows in table': 'Filas en la tabla',
+'Rows selected': 'Filas seleccionadas',
+'Saved file hash:': 'Hash del archivo guardado:',
+'Static files': 'Archivos estáticos',
+'Stylesheet': 'Hoja de estilo',
+'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
+'Table name': 'Nombre de la tabla',
+'Testing application': 'Probando aplicación',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
+'The output of the file is a dictionary that was rendered by the view': 'La salida del archivo es un diccionario escenificado por la vista',
+'There are no controllers': 'No hay controladores',
+'There are no models': 'No hay modelos',
+'There are no modules': 'No hay módulos',
+'There are no static files': 'No hay archivos estáticos',
+'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
+'There are no views': 'No hay vistas',
+'This is a copy of the scaffolding application': 'Esta es una copia de la aplicación de andamiaje',
+'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
+'Ticket': 'Tiquete',
+'Timestamp': 'Timestamp',
+'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
+'Unable to download': 'No es posible la descarga',
+'Unable to download app': 'No es posible descarga la aplicación',
+'Update:': 'Actualice:',
+'Upload existing application': 'Suba esta aplicación',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
+'User ID': 'ID de Usuario',
+'View': 'Vista',
+'Views': 'Vistas',
+'Welcome': 'Welcome',
+'Welcome %s': 'Bienvenido %s',
+'Welcome to web2py': 'Bienvenido a web2py',
+'Which called the function': 'La cual llamó la función',
+'YES': 'SI',
+'You are successfully running web2py': 'Usted está ejecutando web2py exitosamente',
+'You can modify this application and adapt it to your needs': 'Usted puede modificar esta aplicación y adaptarla a sus necesidades',
+'You visited the url': 'Usted visitó la url',
+'about': 'acerca de',
+'additional code for your application': 'código adicional para su aplicación',
+'admin disabled because no admin password': ' por falta de contraseña',
+'admin disabled because not supported on google app engine': 'admin deshabilitado, no es soportado en GAE',
+'admin disabled because unable to access password file': 'admin deshabilitado, imposible acceder al archivo con la contraseña',
+'and rename it (required):': 'y renombrela (requerido):',
+'and rename it:': ' y renombrelo:',
+'appadmin': 'appadmin',
+'appadmin is disabled because insecure channel': 'admin deshabilitado, el canal no es seguro',
+'application "%s" uninstalled': 'aplicación "%s" desinstalada',
+'application compiled': 'aplicación compilada',
+'application is compiled and cannot be designed': 'la aplicación está compilada y no puede ser modificada',
+'cache': 'cache',
+'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
+'cannot create file': 'no es posible crear archivo',
+'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
+'change password': 'cambie contraseña',
+'check all': 'marcar todos',
+'clean': 'limpiar',
+'Online examples': 'Ejemplos en línea',
+'Administrative interface': 'Interfaz administrativa',
+'click to check for upgrades': 'haga clic para buscar actualizaciones',
+'compile': 'compilar',
+'compiled application removed': 'aplicación compilada removida',
+'controllers': 'controladores',
+'create file with filename:': 'cree archivo con nombre:',
+'create new application:': 'nombre de la nueva aplicación:',
+'crontab': 'crontab',
+'currently saved or': 'actualmente guardado o',
+'customize me!': 'Adaptame!',
+'data uploaded': 'datos subidos',
+'database': 'base de datos',
+'database %s select': 'selección en base de datos %s',
+'database administration': 'administración base de datos',
+'db': 'db',
+'defines tables': 'define tablas',
+'delete': 'eliminar',
+'delete all checked': 'eliminar marcados',
+'design': 'modificar',
+'Documentation': 'Documentación',
+'done!': 'listo!',
+'edit': 'editar',
+'edit controller': 'editar controlador',
+'edit profile': 'editar perfil',
+'errors': 'errores',
+'export as csv file': 'exportar como archivo CSV',
+'exposes': 'expone',
+'extends': 'extiende',
+'failed to reload module': 'recarga del módulo ha fallado',
+'file "%(filename)s" created': 'archivo "%(filename)s" creado',
+'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
+'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
+'file "%(filename)s" was not deleted': 'archivo "%(filename)s" no fué eliminado',
+'file "%s" of %s restored': 'archivo "%s" de %s restaurado',
+'file changed on disk': 'archivo modificado en el disco',
+'file does not exist': 'archivo no existe',
+'file saved on %(time)s': 'archivo guardado %(time)s',
+'file saved on %s': 'archivo guardado %s',
+'help': 'ayuda',
+'htmledit': 'htmledit',
+'includes': 'incluye',
+'insert new': 'inserte nuevo',
+'insert new %s': 'inserte nuevo %s',
+'internal error': 'error interno',
+'invalid password': 'contraseña inválida',
+'invalid request': 'solicitud inválida',
+'invalid ticket': 'tiquete inválido',
+'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
+'languages': 'lenguajes',
+'languages updated': 'lenguajes actualizados',
+'loading...': 'cargando...',
+'located in the file': 'localizada en el archivo',
+'login': 'inicio de sesión',
+'logout': 'fin de sesión',
+'lost password?': '¿olvido la contraseña?',
+'merge': 'combinar',
+'models': 'modelos',
+'modules': 'módulos',
+'new application "%s" created': 'nueva aplicación "%s" creada',
+'new record inserted': 'nuevo registro insertado',
+'next 100 rows': '100 filas siguientes',
+'or import from csv file': 'o importar desde archivo CSV',
+'or provide application url:': 'o provea URL de la aplicación:',
+'pack all': 'empaquetar todo',
+'pack compiled': 'empaquete compiladas',
+'previous 100 rows': '100 filas anteriores',
+'record': 'registro',
+'record does not exist': 'el registro no existe',
+'record id': 'id de registro',
+'register': 'registrese',
+'remove compiled': 'eliminar compiladas',
+'restore': 'restaurar',
+'revert': 'revertir',
+'save': 'guardar',
+'selected': 'seleccionado(s)',
+'session expired': 'sesión expirada',
+'shell': 'shell',
+'site': 'sitio',
+'some files could not be removed': 'algunos archivos no pudieron ser removidos',
+'state': 'estado',
+'static': 'estáticos',
+'table': 'tabla',
+'test': 'probar',
+'the application logic, each URL path is mapped in one exposed function in the controller': 'la lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
+'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
+'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
+'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
+'to  previous version.': 'a la versión previa.',
+'translation strings for the application': 'cadenas de caracteres de traducción para la aplicación',
+'try': 'intente',
+'try something like': 'intente algo como',
+'unable to create application "%s"': 'no es posible crear la aplicación "%s"',
+'unable to delete file "%(filename)s"': 'no es posible eliminar el archivo "%(filename)s"',
+'unable to parse csv file': 'no es posible analizar el archivo CSV',
+'unable to uninstall "%s"': 'no es posible instalar "%s"',
+'uncheck all': 'desmarcar todos',
+'uninstall': 'desinstalar',
+'update': 'actualizar',
+'update all languages': 'actualizar todos los lenguajes',
+'upload application:': 'subir aplicación:',
+'upload file:': 'suba archivo:',
+'versioning': 'versiones',
+'view': 'vista',
+'views': 'vistas',
+'web2py Recent Tweets': 'Tweets Recientes de web2py',
+'web2py is up to date': 'web2py está actualizado',
+}

languages/fr-ca.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression optionnelle comme "champ1=\'nouvellevaleur\'". Vous ne pouvez mettre à jour ou supprimer les résultats d\'un JOIN',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'%s rows deleted': '%s rangées supprimées',
+'%s rows updated': '%s rangées mises à jour',
+'About': 'À propos',
+'Access Control': "Contrôle d'accès",
+'Administrative interface': "Interface d'administration",
+'Ajax Recipes': 'Recettes Ajax',
+'Are you sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Authentication': 'Authentification',
+'Available databases and tables': 'Bases de données et tables disponibles',
+'Buy this book': 'Acheter ce livre',
+'Cannot be empty': 'Ne peut pas être vide',
+'Check to delete': 'Cliquez pour supprimer',
+'Check to delete:': 'Cliquez pour supprimer:',
+'Client IP': 'IP client',
+'Community': 'Communauté',
+'Controller': 'Contrôleur',
+'Copyright': "Droit d'auteur",
+'Current request': 'Demande actuelle',
+'Current response': 'Réponse actuelle',
+'Current session': 'Session en cours',
+'DB Model': 'Modèle DB',
+'Database': 'Base de données',
+'Delete:': 'Supprimer:',
+'Demo': 'Démo',
+'Deployment Recipes': 'Recettes de déploiement ',
+'Description': 'Descriptif',
+'Documentation': 'Documentation',
+'Download': 'Téléchargement',
+'E-mail': 'Courriel',
+'Edit': 'Éditer',
+'Edit This App': 'Modifier cette application',
+'Edit current record': "Modifier l'enregistrement courant",
+'Errors': 'Erreurs',
+'FAQ': 'faq',
+'First name': 'Prénom',
+'Forms and Validators': 'Formulaires et Validateurs',
+'Free Applications': 'Applications gratuites',
+'Function disabled': 'Fonction désactivée',
+'Group %(group_id)s created': '%(group_id)s groupe créé',
+'Group ID': 'Groupe ID',
+'Group uniquely assigned to user %(id)s': "Groupe unique attribué à l'utilisateur %(id)s",
+'Groups': 'Groupes',
+'Hello World': 'Bonjour le monde',
+'Home': 'Accueil',
+'Import/Export': 'Importer/Exporter',
+'Index': 'Index',
+'Internal State': 'État interne',
+'Introduction': 'Présentation',
+'Invalid Query': 'Requête Invalide',
+'Invalid email': 'Courriel invalide',
+'Last name': 'Nom',
+'Layout': 'Mise en page',
+'Layouts': 'layouts',
+'Live chat': 'Clavardage en direct',
+'Logged in': 'Connecté',
+'Login': 'Connectez-vous',
+'Lost Password': 'Mot de passe perdu',
+'Main Menu': 'Menu principal',
+'Menu Model': 'Menu modèle',
+'Name': 'Nom',
+'New Record': 'Nouvel enregistrement',
+'No databases in this application': "Cette application n'a pas de bases de données",
+'Online examples': 'Exemples en ligne',
+'Origin': 'Origine',
+'Other Recipes': 'Autres recettes',
+'Overview': 'Présentation',
+'Password': 'Mot de passe',
+"Password fields don't match": 'Les mots de passe ne correspondent pas',
+'Plugins': 'Plugiciels',
+'Powered by': 'Alimenté par',
+'Preface': 'Préface',
+'Python': 'Python',
+'Query:': 'Requête:',
+'Quick Examples': 'Examples Rapides',
+'Readme': 'Lisez-moi',
+'Recipes': 'Recettes',
+'Record %(id)s created': 'Record %(id)s created',
+'Record %(id)s updated': 'Record %(id)s updated',
+'Record Created': 'Record Created',
+'Record ID': "ID d'enregistrement",
+'Record Updated': 'Record Updated',
+'Register': "S'inscrire",
+'Registration key': "Clé d'enregistrement",
+'Registration successful': 'Inscription réussie',
+'Remember me (for 30 days)': 'Se souvenir de moi (pendant 30 jours)',
+'Request reset password': 'Demande de réinitialiser le mot clé',
+'Reset Password key': 'Réinitialiser le mot clé',
+'Resources': 'Ressources',
+'Role': 'Rôle',
+'Rows in table': 'Lignes du tableau',
+'Rows selected': 'Lignes sélectionnées',
+'Semantic': 'Sémantique',
+'Services': 'Services',
+'Stylesheet': 'Feuille de style',
+'Submit': 'Soumettre',
+'Support': 'Soutien',
+'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Table name': 'Nom du tableau',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "query" est une condition comme "db.table1.champ1==\'valeur\'". Quelque chose comme "db.table1.champ1==db.table2.champ2" résulte en un JOIN SQL.',
+'The Core': 'Le noyau',
+'The Views': 'Les Vues',
+'The output of the file is a dictionary that was rendered by the view': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue',
+'This App': 'Cette Appli',
+'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
+'Timestamp': 'Horodatage',
+'Twitter': 'Twitter',
+'Update:': 'Mise à jour:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Employez (...)&(...) pour AND, (...)|(...) pour OR, and ~(...)  pour NOT pour construire des requêtes plus complexes.',
+'User %(id)s Logged-in': 'Utilisateur %(id)s connecté',
+'User %(id)s Registered': 'Utilisateur %(id)s enregistré',
+'User ID': 'ID utilisateur',
+'User Voice': 'User Voice',
+'Verify Password': 'Vérifiez le mot de passe',
+'Videos': 'Vidéos',
+'View': 'Présentation',
+'Web2py': 'Web2py',
+'Welcome': 'Bienvenu',
+'Welcome %s': 'Bienvenue %s',
+'Welcome to web2py': 'Bienvenue à web2py',
+'Which called the function': 'Qui a appelé la fonction',
+'You are successfully running web2py': 'Vous roulez avec succès web2py',
+'You can modify this application and adapt it to your needs': "Vous pouvez modifier cette application et l'adapter à vos besoins",
+'You visited the url': "Vous avez visité l'URL",
+'about': 'à propos',
+'appadmin is disabled because insecure channel': "appadmin est désactivée parce que le canal n'est pas sécurisé",
+'cache': 'cache',
+'change password': 'changer le mot de passe',
+'customize me!': 'personnalisez-moi!',
+'data uploaded': 'données téléchargées',
+'database': 'base de données',
+'database %s select': 'base de données %s select',
+'db': 'db',
+'design': 'design',
+'done!': 'fait!',
+'edit profile': 'modifier le profil',
+'enter an integer between %(min)g and %(max)g': 'entrer un entier compris entre %(min)g et %(max)g',
+'export as csv file': 'exporter sous forme de fichier csv',
+'insert new': 'insérer un nouveau',
+'insert new %s': 'insérer un nouveau %s',
+'invalid request': 'requête invalide',
+'located in the file': 'se trouvant dans le fichier',
+'login': 'connectez-vous',
+'logout': 'déconnectez-vous',
+'lost password': 'mot de passe perdu',
+'lost password?': 'mot de passe perdu?',
+'new record inserted': 'nouvel enregistrement inséré',
+'next 100 rows': '100 prochaines lignes',
+'or import from csv file': "ou importer d'un fichier CSV",
+'password': 'mot de passe',
+'please input your password again': "S'il vous plaît entrer votre mot de passe",
+'previous 100 rows': '100 lignes précédentes',
+'profile': 'profile',
+'record': 'enregistrement',
+'record does not exist': "l'archive n'existe pas",
+'record id': "id d'enregistrement",
+'register': "s'inscrire",
+'selected': 'sélectionné',
+'state': 'état',
+'table': 'tableau',
+'unable to parse csv file': "incapable d'analyser le fichier cvs",
+'value already in database or empty': 'valeur déjà dans la base ou vide',
+}

languages/fr-fr.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression optionnelle comme "champ1=\'nouvellevaleur\'". Vous ne pouvez mettre à jour ou supprimer les résultats d\'un JOIN',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'%s rows deleted': '%s rangées supprimées',
+'%s rows updated': '%s rangées mises à jour',
+'About': 'À propos',
+'Access Control': 'Contrôle d\'accès',
+'Ajax Recipes': 'Recettes Ajax',
+'Are you sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Authentication': 'Authentification',
+'Available databases and tables': 'Bases de données et tables disponibles',
+'Buy this book': 'Acheter ce livre',
+'Cannot be empty': 'Ne peut pas être vide',
+'Check to delete': 'Cliquez pour supprimer',
+'Check to delete:': 'Cliquez pour supprimer:',
+'Client IP': 'IP client',
+'Community': 'Communauté',
+'Controller': 'Contrôleur',
+'Copyright': 'Copyright',
+'Current request': 'Demande actuelle',
+'Current response': 'Réponse actuelle',
+'Current session': 'Session en cours',
+'DB Model': 'Modèle DB',
+'Database': 'Base de données',
+'Delete:': 'Supprimer:',
+'Demo': 'Démo',
+'Deployment Recipes': 'Recettes de déploiement',
+'Description': 'Description',
+'Documentation': 'Documentation',
+'Download': 'Téléchargement',
+'E-mail': 'E-mail',
+'Edit': 'Éditer',
+'Edit This App': 'Modifier cette application',
+'Edit current record': "Modifier l'enregistrement courant",
+'Errors': 'Erreurs',
+'FAQ': 'FAQ',
+'First name': 'Prénom',
+'Forms and Validators': 'Formulaires et Validateurs',
+'Free Applications': 'Applications gratuites',
+'Function disabled': 'Fonction désactivée',
+'Group ID': 'Groupe ID',
+'Groups': 'Groups',
+'Hello World': 'Bonjour le monde',
+'Home': 'Accueil',
+'Import/Export': 'Importer/Exporter',
+'Index': 'Index',
+'Internal State': 'État interne',
+'Introduction': 'Introduction',
+'Invalid Query': 'Requête Invalide',
+'Invalid email': 'E-mail invalide',
+'Last name': 'Nom',
+'Layout': 'Mise en page',
+'Layouts': 'Layouts',
+'Live chat': 'Chat live',
+'Login': 'Connectez-vous',
+'Lost Password': 'Mot de passe perdu',
+'Main Menu': 'Menu principal',
+'Menu Model': 'Menu modèle',
+'Name': 'Nom',
+'New Record': 'Nouvel enregistrement',
+'No databases in this application': "Cette application n'a pas de bases de données",
+'Origin': 'Origine',
+'Other Recipes': 'Autres recettes',
+'Overview': 'Présentation',
+'Password': 'Mot de passe',
+"Password fields don't match": 'Les mots de passe ne correspondent pas',
+'Plugins': 'Plugiciels',
+'Powered by': 'Alimenté par',
+'Preface': 'Préface',
+'Python': 'Python',
+'Query:': 'Requête:',
+'Quick Examples': 'Examples Rapides',
+'Recipes': 'Recettes',
+'Record ID': 'ID d\'enregistrement',
+'Register': "S'inscrire",
+'Registration key': "Clé d'enregistrement",
+'Remember me (for 30 days)': 'Se souvenir de moi (pendant 30 jours)',
+'Request reset password': 'Demande de réinitialiser le mot clé',
+'Reset Password key': 'Réinitialiser le mot clé',
+'Resources': 'Ressources',
+'Role': 'Rôle',
+'Rows in table': 'Lignes du tableau',
+'Rows selected': 'Lignes sélectionnées',
+'Semantic': 'Sémantique',
+'Services': 'Services',
+'Stylesheet': 'Feuille de style',
+'Submit': 'Soumettre',
+'Support': 'Support',
+'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Table name': 'Nom du tableau',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "query" est une condition comme "db.table1.champ1==\'valeur\'". Quelque chose comme "db.table1.champ1==db.table2.champ2" résulte en un JOIN SQL.',
+'The Core': 'Le noyau',
+'The Views': 'Les Vues',
+'The output of the file is a dictionary that was rendered by the view': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue',
+'This App': 'Cette Appli',
+'This is a copy of the scaffolding application': 'Ceci est une copie de l\'application échafaudage',
+'Timestamp': 'Horodatage',
+'Twitter': 'Twitter',
+'Update:': 'Mise à jour:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Employez (...)&(...) pour AND, (...)|(...) pour OR, and ~(...)  pour NOT pour construire des requêtes plus complexes.',
+'User %(id)s Logged-in': 'Utilisateur %(id)s connecté',
+'User %(id)s Registered': 'Utilisateur %(id)s enregistré',
+'User ID': 'ID utilisateur',
+'User Voice': 'User Voice',
+'Verify Password': 'Vérifiez le mot de passe',
+'Videos': 'Vidéos',
+'View': 'Présentation',
+'Web2py': 'Web2py',
+'Welcome': 'Bienvenu',
+'Welcome %s': 'Bienvenue %s',
+'Welcome to web2py': 'Bienvenue à web2py',
+'Which called the function': 'Qui a appelé la fonction',
+'You are successfully running web2py': 'Vous roulez avec succès web2py',
+'You can modify this application and adapt it to your needs': 'Vous pouvez modifier cette application et l\'adapter à vos besoins',
+'You visited the url': 'Vous avez visité l\'URL',
+'appadmin is disabled because insecure channel': "appadmin est désactivée parce que le canal n'est pas sécurisé",
+'cache': 'cache',
+'change password': 'changer le mot de passe',
+'Online examples': 'Exemples en ligne',
+'Administrative interface': "Interface d'administration",
+'customize me!': 'personnalisez-moi!',
+'data uploaded': 'données téléchargées',
+'database': 'base de données',
+'database %s select': 'base de données %s select',
+'db': 'db',
+'design': 'design',
+'Documentation': 'Documentation',
+'done!': 'fait!',
+'edit profile': 'modifier le profil',
+'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g',
+'export as csv file': 'exporter sous forme de fichier csv',
+'insert new': 'insérer un nouveau',
+'insert new %s': 'insérer un nouveau %s',
+'invalid request': 'requête invalide',
+'located in the file': 'se trouvant dans le fichier',
+'login': 'connectez-vous',
+'logout': 'déconnectez-vous',
+'lost password': 'mot de passe perdu',
+'lost password?': 'mot de passe perdu?',
+'new record inserted': 'nouvel enregistrement inséré',
+'next 100 rows': '100 prochaines lignes',
+'or import from csv file': "ou importer d'un fichier CSV",
+'previous 100 rows': '100 lignes précédentes',
+'record': 'enregistrement',
+'record does not exist': "l'archive n'existe pas",
+'record id': "id d'enregistrement",
+'register': "s'inscrire",
+'selected': 'sélectionné',
+'state': 'état',
+'table': 'tableau',
+'unable to parse csv file': "incapable d'analyser le fichier cvs",
+'Readme': "Lisez-moi",
+}

languages/hi-hi.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'%s rows deleted': '%s \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\x8f\xe0\xa4\x81',
+'%s rows updated': '%s \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81  \xe0\xa4\x85\xe0\xa4\xa6\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xa4\xe0\xa4\xa8',
+'Available databases and tables': '\xe0\xa4\x89\xe0\xa4\xaa\xe0\xa4\xb2\xe0\xa4\xac\xe0\xa5\x8d\xe0\xa4\xa7  \xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8 \xe0\xa4\x94\xe0\xa4\xb0 \xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe',
+'Cannot be empty': '\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x80 \xe0\xa4\xa8\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\x82 \xe0\xa4\xb9\xe0\xa5\x8b \xe0\xa4\xb8\xe0\xa4\x95\xe0\xa4\xa4\xe0\xa4\xbe',
+'Change Password': '\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb8\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xac\xe0\xa4\xa6\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82',
+'Check to delete': '\xe0\xa4\xb9\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x87 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f \xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x82',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa7',
+'Current response': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe',
+'Current session': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xb6\xe0\xa4\xa8',
+'DB Model': 'DB Model',
+'Database': 'Database',
+'Delete:': '\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe:',
+'Edit': 'Edit',
+'Edit Profile': '\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
+'Edit This App': 'Edit This App',
+'Edit current record': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82 ',
+'Hello World': 'Hello World',
+'Hello from MyApp': 'Hello from MyApp',
+'Import/Export': '\xe0\xa4\x86\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4 / \xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4',
+'Index': 'Index',
+'Internal State': '\xe0\xa4\x86\xe0\xa4\x82\xe0\xa4\xa4\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\x95  \xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa5\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa4\xbf',
+'Invalid Query': '\xe0\xa4\x85\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xaf  \xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb6\xe0\xa5\x8d\xe0\xa4\xa8',
+'Layout': 'Layout',
+'Login': '\xe0\xa4\xb2\xe0\xa5\x89\xe0\xa4\x97 \xe0\xa4\x87\xe0\xa4\xa8',
+'Logout': '\xe0\xa4\xb2\xe0\xa5\x89\xe0\xa4\x97 \xe0\xa4\x86\xe0\xa4\x89\xe0\xa4\x9f',
+'Lost Password': '\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb8\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\x96\xe0\xa5\x8b \xe0\xa4\x97\xe0\xa4\xaf\xe0\xa4\xbe',
+'Main Menu': 'Main Menu',
+'Menu Model': 'Menu Model',
+'New Record': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1',
+'No databases in this application': '\xe0\xa4\x87\xe0\xa4\xb8  \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xaf\xe0\xa5\x8b\xe0\xa4\x97 \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\x95\xe0\xa5\x8b\xe0\xa4\x88 \xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8 \xe0\xa4\xa8\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\x82 \xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82',
+'Powered by': 'Powered by',
+'Query:': '\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb6\xe0\xa5\x8d\xe0\xa4\xa8:',
+'Register': '\xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x9c\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x83\xe0\xa4\xa4 (\xe0\xa4\xb0\xe0\xa4\x9c\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa4\xb0) \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe ',
+'Rows in table': '\xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 ',
+'Rows selected': '\xe0\xa4\x9a\xe0\xa4\xaf\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xa4 (\xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa5\x87 \xe0\xa4\x97\xe0\xa4\xaf\xe0\xa5\x87) \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 ',
+'Stylesheet': 'Stylesheet',
+'Sure you want to delete this object?': '\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb6\xe0\xa5\x8d\xe0\xa4\x9a\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82 \xe0\xa4\x95\xe0\xa4\xbf \xe0\xa4\x86\xe0\xa4\xaa \xe0\xa4\x87\xe0\xa4\xb8 \xe0\xa4\xb5\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x81 \xe0\xa4\x95\xe0\xa5\x8b \xe0\xa4\xb9\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe \xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xa4\xe0\xa5\x87 \xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82?',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
+'Update:': '\xe0\xa4\x85\xe0\xa4\xa6\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xa4\xe0\xa4\xa8 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.',
+'View': 'View',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': '\xe0\xa4\xb5\xe0\xa5\x87\xe0\xa4\xac\xe0\xa5\xa8\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\x87 (web2py)  \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\x86\xe0\xa4\xaa\xe0\xa4\x95\xe0\xa4\xbe \xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\x97\xe0\xa4\xa4 \xe0\xa4\xb9\xe0\xa5\x88',
+'appadmin is disabled because insecure channel': '\xe0\xa4\x85\xe0\xa4\xaa \xe0\xa4\x86\xe0\xa4\xa1\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\xa8 (appadmin) \xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xae \xe0\xa4\xb9\xe0\xa5\x88 \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa5\x8b\xe0\xa4\x82\xe0\xa4\x95\xe0\xa4\xbf \xe0\xa4\x85\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\x9a\xe0\xa5\x88\xe0\xa4\xa8\xe0\xa4\xb2',
+'cache': 'cache',
+'change password': 'change password',
+'Online examples': '\xe0\xa4\x91\xe0\xa4\xa8\xe0\xa4\xb2\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xa8 \xe0\xa4\x89\xe0\xa4\xa6\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xb0\xe0\xa4\xa3 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f \xe0\xa4\xaf\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
+'Administrative interface': '\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb6\xe0\xa4\xbe\xe0\xa4\xb8\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\x87\xe0\xa4\x82\xe0\xa4\x9f\xe0\xa4\xb0\xe0\xa4\xab\xe0\xa5\x87\xe0\xa4\xb8 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f \xe0\xa4\xaf\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
+'customize me!': '\xe0\xa4\xae\xe0\xa5\x81\xe0\xa4\x9d\xe0\xa5\x87 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\x95\xe0\xa5\x82\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\xa4 (\xe0\xa4\x95\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\x9c\xe0\xa4\xbc) \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82!',
+'data uploaded': '\xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\x9f\xe0\xa4\xbe \xe0\xa4\x85\xe0\xa4\xaa\xe0\xa4\xb2\xe0\xa5\x8b\xe0\xa4\xa1 \xe0\xa4\xb8\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xaa\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa8 ',
+'database': '\xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8',
+'database %s select': '\xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8  %s \xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa5\x80 \xe0\xa4\xb9\xe0\xa5\x81\xe0\xa4\x88',
+'db': 'db',
+'design': '\xe0\xa4\xb0\xe0\xa4\x9a\xe0\xa4\xa8\xe0\xa4\xbe \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
+'done!': '\xe0\xa4\xb9\xe0\xa5\x8b \xe0\xa4\x97\xe0\xa4\xaf\xe0\xa4\xbe!',
+'edit profile': 'edit profile',
+'export as csv file': 'csv \xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb0\xe0\xa5\x82\xe0\xa4\xaa \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4',
+'insert new': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82',
+'insert new %s': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe   %s  \xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82',
+'invalid request': '\xe0\xa4\x85\xe0\xa4\xb5\xe0\xa5\x88\xe0\xa4\xa7 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa7',
+'login': 'login',
+'logout': 'logout',
+'new record inserted': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbe',
+'next 100 rows': '\xe0\xa4\x85\xe0\xa4\x97\xe0\xa4\xb2\xe0\xa5\x87 100 \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81',
+'or import from csv file': '\xe0\xa4\xaf\xe0\xa4\xbe  csv \xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\xb8\xe0\xa5\x87 \xe0\xa4\x86\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4',
+'previous 100 rows': '\xe0\xa4\xaa\xe0\xa4\xbf\xe0\xa4\x9b\xe0\xa4\xb2\xe0\xa5\x87 100 \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81',
+'record': 'record',
+'record does not exist': '\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xae\xe0\xa5\x8c\xe0\xa4\x9c\xe0\xa5\x82\xe0\xa4\xa6 \xe0\xa4\xa8\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\x82 \xe0\xa4\xb9\xe0\xa5\x88',
+'record id': '\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xaa\xe0\xa4\xb9\xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbe (\xe0\xa4\x86\xe0\xa4\x88\xe0\xa4\xa1\xe0\xa5\x80)',
+'register': 'register',
+'selected': '\xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xbe \xe0\xa4\xb9\xe0\xa5\x81\xe0\xa4\x86',
+'state': '\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa5\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa4\xbf',
+'table': '\xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe',
+'unable to parse csv file': 'csv \xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xb8 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa5\x87 \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\x85\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa5',
+}

languages/hu-hu.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN',
+'%Y-%m-%d': '%Y.%m.%d.',
+'%Y-%m-%d %H:%M:%S': '%Y.%m.%d. %H:%M:%S',
+'%s rows deleted': '%s sorok t\xc3\xb6rl\xc5\x91dtek',
+'%s rows updated': '%s sorok friss\xc3\xadt\xc5\x91dtek',
+'Available databases and tables': 'El\xc3\xa9rhet\xc5\x91 adatb\xc3\xa1zisok \xc3\xa9s t\xc3\xa1bl\xc3\xa1k',
+'Cannot be empty': 'Nem lehet \xc3\xbcres',
+'Check to delete': 'T\xc3\xb6rl\xc3\xa9shez v\xc3\xa1laszd ki',
+'Client IP': 'Client IP',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Jelenlegi lek\xc3\xa9rdez\xc3\xa9s',
+'Current response': 'Jelenlegi v\xc3\xa1lasz',
+'Current session': 'Jelenlegi folyamat',
+'DB Model': 'DB Model',
+'Database': 'Adatb\xc3\xa1zis',
+'Delete:': 'T\xc3\xb6r\xc3\xb6l:',
+'Description': 'Description',
+'E-mail': 'E-mail',
+'Edit': 'Szerkeszt',
+'Edit This App': 'Alkalmaz\xc3\xa1st szerkeszt',
+'Edit current record': 'Aktu\xc3\xa1lis bejegyz\xc3\xa9s szerkeszt\xc3\xa9se',
+'First name': 'First name',
+'Group ID': 'Group ID',
+'Hello World': 'Hello Vil\xc3\xa1g',
+'Import/Export': 'Import/Export',
+'Index': 'Index',
+'Internal State': 'Internal State',
+'Invalid Query': 'Hib\xc3\xa1s lek\xc3\xa9rdez\xc3\xa9s',
+'Invalid email': 'Invalid email',
+'Last name': 'Last name',
+'Layout': 'Szerkezet',
+'Main Menu': 'F\xc5\x91men\xc3\xbc',
+'Menu Model': 'Men\xc3\xbc model',
+'Name': 'Name',
+'New Record': '\xc3\x9aj bejegyz\xc3\xa9s',
+'No databases in this application': 'Nincs adatb\xc3\xa1zis ebben az alkalmaz\xc3\xa1sban',
+'Origin': 'Origin',
+'Password': 'Password',
+'Powered by': 'Powered by',
+'Query:': 'Lek\xc3\xa9rdez\xc3\xa9s:',
+'Record ID': 'Record ID',
+'Registration key': 'Registration key',
+'Reset Password key': 'Reset Password key',
+'Role': 'Role',
+'Rows in table': 'Sorok a t\xc3\xa1bl\xc3\xa1ban',
+'Rows selected': 'Kiv\xc3\xa1lasztott sorok',
+'Stylesheet': 'Stylesheet',
+'Sure you want to delete this object?': 'Biztos t\xc3\xb6rli ezt az objektumot?',
+'Table name': 'Table name',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
+'Timestamp': 'Timestamp',
+'Update:': 'Friss\xc3\xadt:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.',
+'User ID': 'User ID',
+'View': 'N\xc3\xa9zet',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'Isten hozott a web2py-ban',
+'appadmin is disabled because insecure channel': 'az appadmin a biztons\xc3\xa1gtalan csatorna miatt letiltva',
+'cache': 'gyors\xc3\xadt\xc3\xb3t\xc3\xa1r',
+'change password': 'jelsz\xc3\xb3 megv\xc3\xa1ltoztat\xc3\xa1sa',
+'Online examples': 'online p\xc3\xa9ld\xc3\xa1k\xc3\xa9rt kattints ide',
+'Administrative interface': 'az adminisztr\xc3\xa1ci\xc3\xb3s fel\xc3\xbclet\xc3\xa9rt kattints ide',
+'customize me!': 'v\xc3\xa1ltoztass meg!',
+'data uploaded': 'adat felt\xc3\xb6ltve',
+'database': 'adatb\xc3\xa1zis',
+'database %s select': 'adatb\xc3\xa1zis %s kiv\xc3\xa1laszt\xc3\xa1s',
+'db': 'db',
+'design': 'design',
+'done!': 'k\xc3\xa9sz!',
+'edit profile': 'profil szerkeszt\xc3\xa9se',
+'export as csv file': 'export\xc3\xa1l csv f\xc3\xa1jlba',
+'insert new': '\xc3\xbaj beilleszt\xc3\xa9se',
+'insert new %s': '\xc3\xbaj beilleszt\xc3\xa9se %s',
+'invalid request': 'hib\xc3\xa1s k\xc3\xa9r\xc3\xa9s',
+'login': 'bel\xc3\xa9p',
+'logout': 'kil\xc3\xa9p',
+'lost password': 'elveszett jelsz\xc3\xb3',
+'new record inserted': '\xc3\xbaj bejegyz\xc3\xa9s felv\xc3\xa9ve',
+'next 100 rows': 'k\xc3\xb6vetkez\xc5\x91 100 sor',
+'or import from csv file': 'vagy bet\xc3\xb6lt\xc3\xa9s csv f\xc3\xa1jlb\xc3\xb3l',
+'previous 100 rows': 'el\xc5\x91z\xc5\x91 100 sor',
+'record': 'bejegyz\xc3\xa9s',
+'record does not exist': 'bejegyz\xc3\xa9s nem l\xc3\xa9tezik',
+'record id': 'bejegyz\xc3\xa9s id',
+'register': 'regisztr\xc3\xa1ci\xc3\xb3',
+'selected': 'kiv\xc3\xa1lasztott',
+'state': '\xc3\xa1llapot',
+'table': 't\xc3\xa1bla',
+'unable to parse csv file': 'nem lehet a csv f\xc3\xa1jlt beolvasni',
+}
+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN',
+'%Y-%m-%d': '%Y.%m.%d.',
+'%Y-%m-%d %H:%M:%S': '%Y.%m.%d. %H:%M:%S',
+'%s rows deleted': '%s sorok t\xc3\xb6rl\xc5\x91dtek',
+'%s rows updated': '%s sorok friss\xc3\xadt\xc5\x91dtek',
+'Available databases and tables': 'El\xc3\xa9rhet\xc5\x91 adatb\xc3\xa1zisok \xc3\xa9s t\xc3\xa1bl\xc3\xa1k',
+'Cannot be empty': 'Nem lehet \xc3\xbcres',
+'Check to delete': 'T\xc3\xb6rl\xc3\xa9shez v\xc3\xa1laszd ki',
+'Client IP': 'Client IP',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Jelenlegi lek\xc3\xa9rdez\xc3\xa9s',
+'Current response': 'Jelenlegi v\xc3\xa1lasz',
+'Current session': 'Jelenlegi folyamat',
+'DB Model': 'DB Model',
+'Database': 'Adatb\xc3\xa1zis',
+'Delete:': 'T\xc3\xb6r\xc3\xb6l:',
+'Description': 'Description',
+'E-mail': 'E-mail',
+'Edit': 'Szerkeszt',
+'Edit This App': 'Alkalmaz\xc3\xa1st szerkeszt',
+'Edit current record': 'Aktu\xc3\xa1lis bejegyz\xc3\xa9s szerkeszt\xc3\xa9se',
+'First name': 'First name',
+'Group ID': 'Group ID',
+'Hello World': 'Hello Vil\xc3\xa1g',
+'Import/Export': 'Import/Export',
+'Index': 'Index',
+'Internal State': 'Internal State',
+'Invalid Query': 'Hib\xc3\xa1s lek\xc3\xa9rdez\xc3\xa9s',
+'Invalid email': 'Invalid email',
+'Last name': 'Last name',
+'Layout': 'Szerkezet',
+'Main Menu': 'F\xc5\x91men\xc3\xbc',
+'Menu Model': 'Men\xc3\xbc model',
+'Name': 'Name',
+'New Record': '\xc3\x9aj bejegyz\xc3\xa9s',
+'No databases in this application': 'Nincs adatb\xc3\xa1zis ebben az alkalmaz\xc3\xa1sban',
+'Origin': 'Origin',
+'Password': 'Password',
+'Powered by': 'Powered by',
+'Query:': 'Lek\xc3\xa9rdez\xc3\xa9s:',
+'Record ID': 'Record ID',
+'Registration key': 'Registration key',
+'Reset Password key': 'Reset Password key',
+'Role': 'Role',
+'Rows in table': 'Sorok a t\xc3\xa1bl\xc3\xa1ban',
+'Rows selected': 'Kiv\xc3\xa1lasztott sorok',
+'Stylesheet': 'Stylesheet',
+'Sure you want to delete this object?': 'Biztos t\xc3\xb6rli ezt az objektumot?',
+'Table name': 'Table name',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
+'Timestamp': 'Timestamp',
+'Update:': 'Friss\xc3\xadt:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.',
+'User ID': 'User ID',
+'View': 'N\xc3\xa9zet',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'Isten hozott a web2py-ban',
+'appadmin is disabled because insecure channel': 'az appadmin a biztons\xc3\xa1gtalan csatorna miatt letiltva',
+'cache': 'gyors\xc3\xadt\xc3\xb3t\xc3\xa1r',
+'change password': 'jelsz\xc3\xb3 megv\xc3\xa1ltoztat\xc3\xa1sa',
+'Online examples': 'online p\xc3\xa9ld\xc3\xa1k\xc3\xa9rt kattints ide',
+'Administrative interface': 'az adminisztr\xc3\xa1ci\xc3\xb3s fel\xc3\xbclet\xc3\xa9rt kattints ide',
+'customize me!': 'v\xc3\xa1ltoztass meg!',
+'data uploaded': 'adat felt\xc3\xb6ltve',
+'database': 'adatb\xc3\xa1zis',
+'database %s select': 'adatb\xc3\xa1zis %s kiv\xc3\xa1laszt\xc3\xa1s',
+'db': 'db',
+'design': 'design',
+'done!': 'k\xc3\xa9sz!',
+'edit profile': 'profil szerkeszt\xc3\xa9se',
+'export as csv file': 'export\xc3\xa1l csv f\xc3\xa1jlba',
+'insert new': '\xc3\xbaj beilleszt\xc3\xa9se',
+'insert new %s': '\xc3\xbaj beilleszt\xc3\xa9se %s',
+'invalid request': 'hib\xc3\xa1s k\xc3\xa9r\xc3\xa9s',
+'login': 'bel\xc3\xa9p',
+'logout': 'kil\xc3\xa9p',
+'lost password': 'elveszett jelsz\xc3\xb3',
+'new record inserted': '\xc3\xbaj bejegyz\xc3\xa9s felv\xc3\xa9ve',
+'next 100 rows': 'k\xc3\xb6vetkez\xc5\x91 100 sor',
+'or import from csv file': 'vagy bet\xc3\xb6lt\xc3\xa9s csv f\xc3\xa1jlb\xc3\xb3l',
+'previous 100 rows': 'el\xc5\x91z\xc5\x91 100 sor',
+'record': 'bejegyz\xc3\xa9s',
+'record does not exist': 'bejegyz\xc3\xa9s nem l\xc3\xa9tezik',
+'record id': 'bejegyz\xc3\xa9s id',
+'register': 'regisztr\xc3\xa1ci\xc3\xb3',
+'selected': 'kiv\xc3\xa1lasztott',
+'state': '\xc3\xa1llapot',
+'table': 't\xc3\xa1bla',
+'unable to parse csv file': 'nem lehet a csv f\xc3\xa1jlt beolvasni',
+}

languages/it-it.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" è un\'espressione opzionale come "campo1=\'nuovo valore\'". Non si può fare "update" o "delete" dei risultati di un JOIN ',
+'%Y-%m-%d': '%d/%m/%Y',
+'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
+'%s rows deleted': '%s righe ("record") cancellate',
+'%s rows updated': '%s righe ("record") modificate',
+'Administrative interface': 'Interfaccia amministrativa',
+'Available databases and tables': 'Database e tabelle disponibili',
+'Cannot be empty': 'Non può essere vuoto',
+'Check to delete': 'Seleziona per cancellare',
+'Client IP': 'Client IP',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Richiesta (request) corrente',
+'Current response': 'Risposta (response) corrente',
+'Current session': 'Sessione (session) corrente',
+'DB Model': 'Modello di DB',
+'Database': 'Database',
+'Delete:': 'Cancella:',
+'Description': 'Descrizione',
+'Documentation': 'Documentazione',
+'E-mail': 'E-mail',
+'Edit': 'Modifica',
+'Edit This App': 'Modifica questa applicazione',
+'Edit current record': 'Modifica record corrente',
+'First name': 'Nome',
+'Group ID': 'ID Gruppo',
+'Hello': 'Hello',
+'Hello World': 'Salve Mondo',
+'Hello World in a flash!': 'Salve Mondo in un flash!',
+'Import/Export': 'Importa/Esporta',
+'Index': 'Indice',
+'Internal State': 'Stato interno',
+'Invalid Query': 'Richiesta (query) non valida',
+'Invalid email': 'Email non valida',
+'Last name': 'Cognome',
+'Layout': 'Layout',
+'Main Menu': 'Menu principale',
+'Menu Model': 'Menu Modelli',
+'Name': 'Nome',
+'New Record': 'Nuovo elemento (record)',
+'No databases in this application': 'Nessun database presente in questa applicazione',
+'Online examples': 'Vedere gli esempi',
+'Origin': 'Origine',
+'Password': 'Password',
+'Powered by': 'Powered by',
+'Query:': 'Richiesta (query):',
+'Record ID': 'Record ID',
+'Registration key': 'Chiave di Registazione',
+'Reset Password key': 'Resetta chiave Password ',
+'Role': 'Ruolo',
+'Rows in table': 'Righe nella tabella',
+'Rows selected': 'Righe selezionate',
+'Stylesheet': 'Foglio di stile (stylesheet)',
+'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
+'Table name': 'Nome tabella',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La richiesta (query) è una condizione come ad esempio  "db.tabella1.campo1==\'valore\'". Una condizione come "db.tabella1.campo1==db.tabella2.campo2" produce un "JOIN" SQL.',
+'The output of the file is a dictionary that was rendered by the view': 'L\'output del file è un "dictionary" che è stato visualizzato dalla vista',
+'This is a copy of the scaffolding application': "Questa è una copia dell'applicazione di base (scaffold)",
+'Timestamp': 'Ora (timestamp)',
+'Update:': 'Aggiorna:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Per costruire richieste (query) più complesse si usano (...)&(...) come "e" (AND), (...)|(...) come "o" (OR), e ~(...) come negazione (NOT).',
+'User ID': 'ID Utente',
+'View': 'Vista',
+'Welcome %s': 'Benvenuto %s',
+'Welcome to web2py': 'Benvenuto su web2py',
+'Which called the function': 'che ha chiamato la funzione',
+'You are successfully running web2py': 'Stai eseguendo web2py con successo',
+'You can modify this application and adapt it to your needs': 'Puoi modificare questa applicazione adattandola alle tue necessità',
+'You visited the url': "Hai visitato l'URL",
+'appadmin is disabled because insecure channel': 'Amministrazione (appadmin) disabilitata: comunicazione non sicura',
+'cache': 'cache',
+'change password': 'Cambia password',
+'customize me!': 'Personalizzami!',
+'data uploaded': 'dati caricati',
+'database': 'database',
+'database %s select': 'database %s select',
+'db': 'db',
+'design': 'progetta',
+'done!': 'fatto!',
+'edit profile': 'modifica profilo',
+'export as csv file': 'esporta come file CSV',
+'hello': 'hello',
+'hello world': 'salve mondo',
+'insert new': 'inserisci nuovo',
+'insert new %s': 'inserisci nuovo %s',
+'invalid request': 'richiesta non valida',
+'located in the file': 'presente nel file',
+'login': 'accesso',
+'logout': 'uscita',
+'lost password?': 'dimenticato la password?',
+'new record inserted': 'nuovo record inserito',
+'next 100 rows': 'prossime 100 righe',
+'not authorized': 'non autorizzato',
+'or import from csv file': 'oppure importa da file CSV',
+'previous 100 rows': '100 righe precedenti',
+'record': 'record',
+'record does not exist': 'il record non esiste',
+'record id': 'record id',
+'register': 'registrazione',
+'selected': 'selezionato',
+'state': 'stato',
+'table': 'tabella',
+'unable to parse csv file': 'non riesco a decodificare questo file CSV',
+}
+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" è un\'espressione opzionale come "campo1=\'nuovo valore\'". Non si può fare "update" o "delete" dei risultati di un JOIN ',
+'%Y-%m-%d': '%d/%m/%Y',
+'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
+'%s rows deleted': '%s righe ("record") cancellate',
+'%s rows updated': '%s righe ("record") modificate',
+'Administrative interface': 'Interfaccia amministrativa',
+'Available databases and tables': 'Database e tabelle disponibili',
+'Cannot be empty': 'Non può essere vuoto',
+'Check to delete': 'Seleziona per cancellare',
+'Client IP': 'Client IP',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Richiesta (request) corrente',
+'Current response': 'Risposta (response) corrente',
+'Current session': 'Sessione (session) corrente',
+'DB Model': 'Modello di DB',
+'Database': 'Database',
+'Delete:': 'Cancella:',
+'Description': 'Descrizione',
+'Documentation': 'Documentazione',
+'E-mail': 'E-mail',
+'Edit': 'Modifica',
+'Edit This App': 'Modifica questa applicazione',
+'Edit current record': 'Modifica record corrente',
+'First name': 'Nome',
+'Group ID': 'ID Gruppo',
+'Hello World': 'Salve Mondo',
+'Hello World in a flash!': 'Salve Mondo in un flash!',
+'Import/Export': 'Importa/Esporta',
+'Index': 'Indice',
+'Internal State': 'Stato interno',
+'Invalid Query': 'Richiesta (query) non valida',
+'Invalid email': 'Email non valida',
+'Last name': 'Cognome',
+'Layout': 'Layout',
+'Main Menu': 'Menu principale',
+'Menu Model': 'Menu Modelli',
+'Name': 'Nome',
+'New Record': 'Nuovo elemento (record)',
+'No databases in this application': 'Nessun database presente in questa applicazione',
+'Online examples': 'Vedere gli esempi',
+'Origin': 'Origine',
+'Password': 'Password',
+'Powered by': 'Powered by',
+'Query:': 'Richiesta (query):',
+'Record ID': 'Record ID',
+'Registration key': 'Chiave di Registazione',
+'Reset Password key': 'Resetta chiave Password ',
+'Role': 'Ruolo',
+'Rows in table': 'Righe nella tabella',
+'Rows selected': 'Righe selezionate',
+'Stylesheet': 'Foglio di stile (stylesheet)',
+'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
+'Table name': 'Nome tabella',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La richiesta (query) è una condizione come ad esempio  "db.tabella1.campo1==\'valore\'". Una condizione come "db.tabella1.campo1==db.tabella2.campo2" produce un "JOIN" SQL.',
+'The output of the file is a dictionary that was rendered by the view': 'L\'output del file è un "dictionary" che è stato visualizzato dalla vista',
+'This is a copy of the scaffolding application': "Questa è una copia dell'applicazione di base (scaffold)",
+'Timestamp': 'Ora (timestamp)',
+'Update:': 'Aggiorna:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Per costruire richieste (query) più complesse si usano (...)&(...) come "e" (AND), (...)|(...) come "o" (OR), e ~(...) come negazione (NOT).',
+'User ID': 'ID Utente',
+'View': 'Vista',
+'Welcome %s': 'Benvenuto %s',
+'Welcome to web2py': 'Benvenuto su web2py',
+'Which called the function': 'che ha chiamato la funzione',
+'You are successfully running web2py': 'Stai eseguendo web2py con successo',
+'You can modify this application and adapt it to your needs': 'Puoi modificare questa applicazione adattandola alle tue necessità',
+'You visited the url': "Hai visitato l'URL",
+'appadmin is disabled because insecure channel': 'Amministrazione (appadmin) disabilitata: comunicazione non sicura',
+'cache': 'cache',
+'change password': 'Cambia password',
+'customize me!': 'Personalizzami!',
+'data uploaded': 'dati caricati',
+'database': 'database',
+'database %s select': 'database %s select',
+'db': 'db',
+'design': 'progetta',
+'done!': 'fatto!',
+'edit profile': 'modifica profilo',
+'export as csv file': 'esporta come file CSV',
+'hello': 'hello',
+'hello world': 'salve mondo',
+'insert new': 'inserisci nuovo',
+'insert new %s': 'inserisci nuovo %s',
+'invalid request': 'richiesta non valida',
+'located in the file': 'presente nel file',
+'login': 'accesso',
+'logout': 'uscita',
+'lost password?': 'dimenticato la password?',
+'new record inserted': 'nuovo record inserito',
+'next 100 rows': 'prossime 100 righe',
+'not authorized': 'non autorizzato',
+'or import from csv file': 'oppure importa da file CSV',
+'previous 100 rows': '100 righe precedenti',
+'record': 'record',
+'record does not exist': 'il record non esiste',
+'record id': 'record id',
+'register': 'registrazione',
+'selected': 'selezionato',
+'state': 'stato',
+'table': 'tabella',
+'unable to parse csv file': 'non riesco a decodificare questo file CSV',
+}

languages/pl-pl.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Uaktualnij" jest dodatkowym wyra\xc5\xbceniem postaci "pole1=\'nowawarto\xc5\x9b\xc4\x87\'". Nie mo\xc5\xbcesz uaktualni\xc4\x87 lub usun\xc4\x85\xc4\x87 wynik\xc3\xb3w z JOIN:',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'%s rows deleted': 'Wierszy usuni\xc4\x99tych: %s',
+'%s rows updated': 'Wierszy uaktualnionych: %s',
+'Available databases and tables': 'Dost\xc4\x99pne bazy danych i tabele',
+'Cannot be empty': 'Nie mo\xc5\xbce by\xc4\x87 puste',
+'Change Password': 'Change Password',
+'Check to delete': 'Zaznacz aby usun\xc4\x85\xc4\x87',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Aktualne \xc5\xbc\xc4\x85danie',
+'Current response': 'Aktualna odpowied\xc5\xba',
+'Current session': 'Aktualna sesja',
+'DB Model': 'DB Model',
+'Database': 'Database',
+'Delete:': 'Usu\xc5\x84:',
+'Edit': 'Edit',
+'Edit Profile': 'Edit Profile',
+'Edit This App': 'Edit This App',
+'Edit current record': 'Edytuj aktualny rekord',
+'Hello World': 'Witaj \xc5\x9awiecie',
+'Import/Export': 'Importuj/eksportuj',
+'Index': 'Index',
+'Internal State': 'Stan wewn\xc4\x99trzny',
+'Invalid Query': 'B\xc5\x82\xc4\x99dne zapytanie',
+'Layout': 'Layout',
+'Login': 'Zaloguj',
+'Logout': 'Logout',
+'Lost Password': 'Przypomnij has\xc5\x82o',
+'Main Menu': 'Main Menu',
+'Menu Model': 'Menu Model',
+'New Record': 'Nowy rekord',
+'No databases in this application': 'Brak baz danych w tej aplikacji',
+'Powered by': 'Powered by',
+'Query:': 'Zapytanie:',
+'Register': 'Zarejestruj',
+'Rows in table': 'Wiersze w tabeli',
+'Rows selected': 'Wybrane wiersze',
+'Stylesheet': 'Stylesheet',
+'Sure you want to delete this object?': 'Czy na pewno chcesz usun\xc4\x85\xc4\x87 ten obiekt?',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Zapytanie" jest warunkiem postaci "db.tabela1.pole1==\'warto\xc5\x9b\xc4\x87\'". Takie co\xc5\x9b jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.',
+'Update:': 'Uaktualnij:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'U\xc5\xbcyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...)  jako NOT do tworzenia bardziej skomplikowanych zapyta\xc5\x84.',
+'View': 'View',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'Witaj w web2py',
+'appadmin is disabled because insecure channel': 'appadmin is disabled because insecure channel',
+'cache': 'cache',
+'change password': 'change password',
+'Online examples': 'Kliknij aby przej\xc5\x9b\xc4\x87 do interaktywnych przyk\xc5\x82ad\xc3\xb3w',
+'Administrative interface': 'Kliknij aby przej\xc5\x9b\xc4\x87 do panelu administracyjnego',
+'customize me!': 'dostosuj mnie!',
+'data uploaded': 'dane wys\xc5\x82ane',
+'database': 'baza danych',
+'database %s select': 'wyb\xc3\xb3r z bazy danych %s',
+'db': 'baza danych',
+'design': 'projektuj',
+'done!': 'zrobione!',
+'edit profile': 'edit profile',
+'export as csv file': 'eksportuj jako plik csv',
+'insert new': 'wstaw nowy rekord tabeli',
+'insert new %s': 'wstaw nowy rekord do tabeli %s',
+'invalid request': 'B\xc5\x82\xc4\x99dne \xc5\xbc\xc4\x85danie',
+'login': 'login',
+'logout': 'logout',
+'new record inserted': 'nowy rekord zosta\xc5\x82 wstawiony',
+'next 100 rows': 'nast\xc4\x99pne 100 wierszy',
+'or import from csv file': 'lub zaimportuj z pliku csv',
+'previous 100 rows': 'poprzednie 100 wierszy',
+'record': 'record',
+'record does not exist': 'rekord nie istnieje',
+'record id': 'id rekordu',
+'register': 'register',
+'selected': 'wybranych',
+'state': 'stan',
+'table': 'tabela',
+'unable to parse csv file': 'nie mo\xc5\xbcna sparsowa\xc4\x87 pliku csv',
+}
+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Uaktualnij" jest dodatkowym wyra\xc5\xbceniem postaci "pole1=\'nowawarto\xc5\x9b\xc4\x87\'". Nie mo\xc5\xbcesz uaktualni\xc4\x87 lub usun\xc4\x85\xc4\x87 wynik\xc3\xb3w z JOIN:',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'%s rows deleted': 'Wierszy usuni\xc4\x99tych: %s',
+'%s rows updated': 'Wierszy uaktualnionych: %s',
+'Authentication': 'Uwierzytelnienie',
+'Available databases and tables': 'Dost\xc4\x99pne bazy danych i tabele',
+'Cannot be empty': 'Nie mo\xc5\xbce by\xc4\x87 puste',
+'Change Password': 'Zmie\xc5\x84 has\xc5\x82o',
+'Check to delete': 'Zaznacz aby usun\xc4\x85\xc4\x87',
+'Check to delete:': 'Zaznacz aby usun\xc4\x85\xc4\x87:',
+'Client IP': 'IP klienta',
+'Controller': 'Kontroler',
+'Copyright': 'Copyright',
+'Current request': 'Aktualne \xc5\xbc\xc4\x85danie',
+'Current response': 'Aktualna odpowied\xc5\xba',
+'Current session': 'Aktualna sesja',
+'DB Model': 'Model bazy danych',
+'Database': 'Baza danych',
+'Delete:': 'Usu\xc5\x84:',
+'Description': 'Opis',
+'E-mail': 'Adres e-mail',
+'Edit': 'Edycja',
+'Edit Profile': 'Edytuj profil',
+'Edit This App': 'Edytuj t\xc4\x99 aplikacj\xc4\x99',
+'Edit current record': 'Edytuj obecny rekord',
+'First name': 'Imi\xc4\x99',
+'Function disabled': 'Funkcja wy\xc5\x82\xc4\x85czona',
+'Group ID': 'ID grupy',
+'Hello World': 'Witaj \xc5\x9awiecie',
+'Import/Export': 'Importuj/eksportuj',
+'Index': 'Indeks',
+'Internal State': 'Stan wewn\xc4\x99trzny',
+'Invalid Query': 'B\xc5\x82\xc4\x99dne zapytanie',
+'Invalid email': 'B\xc5\x82\xc4\x99dny adres email',
+'Last name': 'Nazwisko',
+'Layout': 'Uk\xc5\x82ad',
+'Login': 'Zaloguj',
+'Logout': 'Wyloguj',
+'Lost Password': 'Przypomnij has\xc5\x82o',
+'Main Menu': 'Menu g\xc5\x82\xc3\xb3wne',
+'Menu Model': 'Model menu',
+'Name': 'Nazwa',
+'New Record': 'Nowy rekord',
+'No databases in this application': 'Brak baz danych w tej aplikacji',
+'Origin': '\xc5\xb9r\xc3\xb3d\xc5\x82o',
+'Password': 'Has\xc5\x82o',
+"Password fields don't match": 'Pola has\xc5\x82a nie s\xc4\x85 zgodne ze sob\xc4\x85',
+'Powered by': 'Zasilane przez',
+'Query:': 'Zapytanie:',
+'Record ID': 'ID rekordu',
+'Register': 'Zarejestruj',
+'Registration key': 'Klucz rejestracji',
+'Role': 'Rola',
+'Rows in table': 'Wiersze w tabeli',
+'Rows selected': 'Wybrane wiersze',
+'Stylesheet': 'Arkusz styl\xc3\xb3w',
+'Submit': 'Wy\xc5\x9blij',
+'Sure you want to delete this object?': 'Czy na pewno chcesz usun\xc4\x85\xc4\x87 ten obiekt?',
+'Table name': 'Nazwa tabeli',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Zapytanie" jest warunkiem postaci "db.tabela1.pole1==\'warto\xc5\x9b\xc4\x87\'". Takie co\xc5\x9b jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.',
+'Timestamp': 'Znacznik czasu',
+'Update:': 'Uaktualnij:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'U\xc5\xbcyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...)  jako NOT do tworzenia bardziej skomplikowanych zapyta\xc5\x84.',
+'User %(id)s Registered': 'U\xc5\xbcytkownik %(id)s zosta\xc5\x82 zarejestrowany',
+'User ID': 'ID u\xc5\xbcytkownika',
+'Verify Password': 'Potwierd\xc5\xba has\xc5\x82o',
+'View': 'Widok',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'Witaj w web2py',
+'appadmin is disabled because insecure channel': 'administracja aplikacji wy\xc5\x82\xc4\x85czona z powodu braku bezpiecznego po\xc5\x82\xc4\x85czenia',
+'cache': 'cache',
+'change password': 'change password',
+'Online examples': 'Kliknij aby przej\xc5\x9b\xc4\x87 do interaktywnych przyk\xc5\x82ad\xc3\xb3w',
+'Administrative interface': 'Kliknij aby przej\xc5\x9b\xc4\x87 do panelu administracyjnego',
+'customize me!': 'dostosuj mnie!',
+'data uploaded': 'dane wys\xc5\x82ane',
+'database': 'baza danych',
+'database %s select': 'wyb\xc3\xb3r z bazy danych %s',
+'db': 'baza danych',
+'design': 'projektuj',
+'done!': 'zrobione!',
+'edit profile': 'edit profile',
+'export as csv file': 'eksportuj jako plik csv',
+'insert new': 'wstaw nowy rekord tabeli',
+'insert new %s': 'wstaw nowy rekord do tabeli %s',
+'invalid request': 'B\xc5\x82\xc4\x99dne \xc5\xbc\xc4\x85danie',
+'login': 'login',
+'logout': 'logout',
+'new record inserted': 'nowy rekord zosta\xc5\x82 wstawiony',
+'next 100 rows': 'nast\xc4\x99pne 100 wierszy',
+'or import from csv file': 'lub zaimportuj z pliku csv',
+'previous 100 rows': 'poprzednie 100 wierszy',
+'record': 'rekord',
+'record does not exist': 'rekord nie istnieje',
+'record id': 'id rekordu',
+'register': 'register',
+'selected': 'wybranych',
+'state': 'stan',
+'table': 'tabela',
+'unable to parse csv file': 'nie mo\xc5\xbcna sparsowa\xc4\x87 pliku csv',
+}

languages/pt-br.py

+# coding: utf8
+{
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" é uma expressão opcional como "campo1=\'novovalor\'". Você não pode atualizar ou apagar os resultados de um JOIN',
+'%Y-%m-%d': '%d-%m-%Y',
+'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
+'%s rows deleted': '%s linhas apagadas',
+'%s rows updated': '%s linhas atualizadas',
+'About': 'About',
+'Access Control': 'Access Control',
+'Ajax Recipes': 'Ajax Recipes',
+'Available databases and tables': 'Bancos de dados e tabelas disponíveis',
+'Buy this book': 'Buy this book',
+'Cannot be empty': 'Não pode ser vazio',
+'Check to delete': 'Marque para apagar',
+'Client IP': 'Client IP',
+'Community': 'Community',
+'Controller': 'Controlador',
+'Copyright': 'Copyright',
+'Current request': 'Requisição atual',
+'Current response': 'Resposta atual',
+'Current session': 'Sessão atual',
+'DB Model': 'Modelo BD',
+'Database': 'Banco de dados',
+'Delete:': 'Apagar:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
+'Description': 'Description',
+'Documentation': 'Documentation',
+'Download': 'Download',
+'E-mail': 'E-mail',
+'Edit': 'Editar',
+'Edit This App': 'Edit This App',
+'Edit current record': 'Editar o registro atual',
+'Errors': 'Errors',
+'FAQ': 'FAQ',
+'First name': 'First name',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Group ID': 'Group ID',
+'Groups': 'Groups',
+'Hello World': 'Olá Mundo',
+'Home': 'Home',
+'Import/Export': 'Importar/Exportar',
+'Index': 'Início',
+'Internal State': 'Estado Interno',
+'Introduction': 'Introduction',
+'Invalid Query': 'Consulta Inválida',
+'Invalid email': 'Invalid email',
+'Last name': 'Last name',
+'Layout': 'Layout',
+'Layouts': 'Layouts',
+'Live chat': 'Live chat',
+'Login': 'Autentique-se',
+'Lost Password': 'Esqueceu sua senha?',
+'Main Menu': 'Menu Principal',
+'Menu Model': 'Modelo de Menu',
+'Name': 'Name',
+'New Record': 'Novo Registro',
+'No databases in this application': 'Sem bancos de dados nesta aplicação',
+'Origin': 'Origin',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'Password': 'Password',
+'Plugins': 'Plugins',
+'Powered by': 'Powered by',
+'Preface': 'Preface',
+'Python': 'Python',
+'Query:': 'Consulta:',
+'Quick Examples': 'Quick Examples',
+'Recipes': 'Recipes',
+'Record ID': 'Record ID',
+'Register': 'Registre-se',
+'Registration key': 'Registration key',
+'Reset Password key': 'Reset Password key',
+'Resources': 'Resources',
+'Role': 'Role',
+'Rows in table': 'Linhas na tabela',
+'Rows selected': 'Linhas selecionadas',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Stylesheet': 'Stylesheet',
+'Support': 'Support',
+'Sure you want to delete this object?': 'Está certo(a) que deseja apagar esse objeto ?',
+'Table name': 'Table name',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'Uma "consulta" é uma condição como "db.tabela1.campo1==\'valor\'". Expressões como "db.tabela1.campo1==db.tabela2.campo2" resultam em um JOIN SQL.',
+'The Core': 'The Core',
+'The Views': 'The Views',
+'The output of the file is a dictionary that was rendered by the view': 'The output of the file is a dictionary that was rendered by the view',
+'This App': 'This App',
+'This is a copy of the scaffolding application': 'This is a copy of the scaffolding application',
+'Timestamp': 'Timestamp',
+'Twitter': 'Twitter',
+'Update:': 'Atualizar:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...)  for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, e ~(...)  para NOT para construir consultas mais complexas.',
+'User ID': 'User ID',
+'User Voice': 'User Voice',
+'Videos': 'Videos',
+'View': 'Visualização',
+'Web2py': 'Web2py',
+'Welcome': 'Welcome',
+'Welcome %s': 'Vem vindo %s',
+'Welcome to web2py': 'Bem vindo ao web2py',
+'Which called the function': 'Which called the function',
+'You are successfully running web2py': 'You are successfully running web2py',
+'You are successfully running web2py.': 'You are successfully running web2py.',
+'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
+'You visited the url': 'You visited the url',
+'appadmin is disabled because insecure channel': 'Administração desativada devido ao canal inseguro',
+'cache': 'cache',
+'change password': 'modificar senha',
+'Online examples': 'Alguns exemplos',
+'Administrative interface': 'Interface administrativa',
+'customize me!': 'Personalize-me!',
+'data uploaded': 'dados enviados',
+'database': 'banco de dados',
+'database %s select': 'Selecionar banco de dados %s',
+'db': 'bd',
+'design': 'design',
+'Documentation': 'Documentation',
+'done!': 'concluído!',
+'edit profile': 'editar perfil',
+'export as csv file': 'exportar como um arquivo csv',
+'insert new': 'inserir novo',
+'insert new %s': 'inserir novo %s',
+'invalid request': 'requisição inválida',
+'located in the file': 'located in the file',
+'login': 'Entrar',
+'logout': 'Sair',
+'lost password?': 'lost password?',
+'new record inserted': 'novo registro inserido',
+'next 100 rows': 'próximas 100 linhas',
+'or import from csv file': 'ou importar de um arquivo csv',
+'previous 100 rows': '100 linhas anteriores',
+'record': 'registro',
+'record does not exist': 'registro não existe',
+'record id'