diff --git a/VERSION b/VERSION
index 5a418e63..c6d062b9 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-Version 2.0.8 (2012-09-11 12:59:42) stable
+Version 2.0.8 (2012-09-11 13:37:13) stable
diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py
index aaf642cf..cd1153c9 100644
--- a/applications/admin/controllers/default.py
+++ b/applications/admin/controllers/default.py
@@ -22,10 +22,8 @@ except ImportError:
have_git = False
GIT_MISSING = 'requires python-git module, but not installed or incompatible version'
-from gluon.languages import (regex_language, read_possible_languages,
- lang_sampling,
- read_dict, write_dict, read_plural_dict,
- write_plural_dict, PLURAL_RULES)
+from gluon.languages import (read_possible_languages, read_dict, write_dict,
+ read_plural_dict, write_plural_dict)
if DEMO_MODE and request.function in ['change_password','pack','pack_plugin','upgrade_web2py','uninstall','cleanup','compile_app','remove_compiled_app','delete','delete_plugin','create_file','upload_file','update_languages','reload_routes','git_push','git_pull']:
@@ -812,7 +810,6 @@ def edit_language():
def edit_plurals():
""" Edit plurals file """
- #import ipdb; ipdb.set_trace()
app = get_app()
filename = '/'.join(request.args)
plurals = read_plural_dict(apath(filename, r=request)) # plural forms dictionary
@@ -949,30 +946,11 @@ def design():
statics.sort()
# Get all languages
- all_languages=dict([(lang+'.py',info[0]) for lang,info
- in read_possible_languages(apath(app, r=request)).iteritems()
- if info[2]!=0]) # info[2] is langfile_mtime:
- # get only existed files
- languages = sorted(all_languages)
-
- plural_rules = {}
- all_plurals = PLURAL_RULES
- for langfile,lang in all_languages.iteritems():
- lang=lang.strip()
- match_language = regex_language.match(lang)
- if match_language:
- match_language = tuple(part
- for part in match_language.groups()
- if part)
- plang = lang_sampling(match_language, all_plurals.keys())
- if plang:
- plural=all_plurals[plang]
- plural_rules[langfile]=(plural[0],plang,plural[4],plural[3])
- else:
- plural_rules[langfile]=(0,lang,'plural_rules-%s.py'%lang,'')
-
- plurals = listdir(apath('%s/languages/' % app, r=request),
- '^plural-[\w-]+\.py$')
+ languages=dict([(lang,info) for lang,info
+ in read_possible_languages(
+ apath(app, r=request)).iteritems()
+ if info[2]!=0]) # info[2] is langfile_mtime:
+ # get only existed files
#Get crontab
cronfolder = apath('%s/cron' % app, r=request)
@@ -1000,8 +978,6 @@ def design():
privates=filter_plugins(privates,plugins),
statics=filter_plugins(statics,plugins),
languages=languages,
- plurals=plurals,
- plural_rules=plural_rules,
crontab=crontab,
plugins=plugins)
diff --git a/applications/admin/languages/uk.py b/applications/admin/languages/uk.py
index 461a4370..b70f3a8c 100644
--- a/applications/admin/languages/uk.py
+++ b/applications/admin/languages/uk.py
@@ -14,6 +14,7 @@
'%Y-%m-%d %H:%M:%S': '%Y/%m/%d %H:%M:%S',
'(requires internet access)': '(потрібно мати доступ в інтернет)',
'(something like "it-it")': '(щось схоже на "uk-ua")',
+'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(не існує файлу **gluon/contrib/plural_rules/%s.py**)',
'@markmin\x01Searching: **%s** %%{file}': 'Знайдено: **%s** %%{файл}',
'Abort': 'Припинити',
'About': 'Про',
@@ -405,6 +406,7 @@
'ticket': 'позначка',
'Ticket': 'Позначка (Ticket)',
'Ticket ID': 'Ід.позначки (Ticket ID)',
+'Ticket Missing': 'Позначка (ticket) відсутня',
'tickets': 'позначки (tickets)',
'Time in Cache (h:m:s)': 'Час в кеші (г:хв:сек)',
'to previous version.': 'до попередньої версії.',
@@ -412,6 +414,7 @@
'To emulate a breakpoint programatically, write:': 'Для встановлення точки зупинки програмним чином напишіть:',
'to use the debugger!': 'щоб активувати ладнач!',
'toggle breakpoint': '+/- точку зупинки',
+'Toggle Fullscreen': 'Перемкнути на весь екран',
'Traceback': 'Стек викликів (Traceback)',
'Translation strings for the application': 'Пари рядків <оригінал>:<переклад> для вибраної мови',
'try something like': 'спробуйте щось схоже на',
diff --git a/applications/admin/views/default/design.html b/applications/admin/views/default/design.html
index 1934fc1d..27f12512 100644
--- a/applications/admin/views/default/design.html
+++ b/applications/admin/views/default/design.html
@@ -187,8 +187,9 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
{{if not languages:}}
{{=T("There are no translators, only default language is supported")}}
{{pass}}
- {{for file in languages:}}
- {{id="languages__"+file.replace('.','__')}}
+ {{for lang in sorted(languages):
+ file = lang+'.py'
+ id = "languages__"+file.replace('.','__')}}
|
@@ -203,24 +204,17 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
(
{{=T("Plural-Forms:")}}
- {{p=plural_rules[file]}}
- {{if p[0] == 0:}}
- {{=T("rules are not defined")}},
-
- {{=button(URL('create_file', vars=dict(filename=p[2], location='gluon/contrib/rules/', sender=URL('design', args=app), id=id, app=app, token=session.token)), T('Create rules'))}}
-
+ {{p=languages[lang][3:7]}}
+ {{if p[2] == 'default':}}
+ {{=T("rules are not defined")}} {{=T.M("(file **gluon/contrib/plural_rules/%s.py** is not found)",lang[:2])}}
{{else:}}
- {{if p[0] == 1:}}
- {{if p[3] == 'ok':}}
- {{=B(T("are not used"))}},
- {{else:}}
- {{=B(T("rules parsed with errors"))}},
- {{pass}}
+ {{if p[3] == 1:}}
+ {{=B(T("are not used"))}}
{{else:}}
- {{pfile='plural-%s.py'%p[1]}}
- {{if pfile in plurals:}}
+ {{pfile=p[0]}}
+ {{if p[1]!=0:}}
- {{=editpluralsfile('languages',pfile,dict(nplurals=p[0]))}}
+ {{=editpluralsfile('languages',pfile,dict(nplurals=p[3]))}}
{{=peekfile('languages',pfile,dict(id=id))}}
@@ -235,6 +229,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
{{pass}}
+ {{pass}}
{{=file_create_form('%s/languages/' % app, 'languages')}}{{=T('(something like "it-it")')}}
diff --git a/applications/welcome/languages/cs.py b/applications/welcome/languages/cs.py
index 85c72dce..33e58479 100644
--- a/applications/welcome/languages/cs.py
+++ b/applications/welcome/languages/cs.py
@@ -3,65 +3,139 @@
'!langcode!': 'cs-cz',
'!langname!': 'Český',
'"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 %%{row} deleted': '%s zmazaných záznamů',
'%s %%{row} updated': '%s upravených záznamů',
'%s selected': '%s označených',
+'%Y-%m-%d': '%d.%m.%Y',
+'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'pro administrátorské rozhranie kliknite sem',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojení',
'Are you sure you want to delete this object?': 'Opravdu chceš odstranit tento objekt?',
'Available Databases and Tables': 'Dostupné databáze a tabuľky',
+'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'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:',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'Client IP',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Controller',
'Copyright': 'Copyright',
'Current request': 'Aktuální požadavek',
'Current response': 'Aktuální odpověď',
'Current session': 'Aktuální session',
+'customize me!': 'uprav mě!',
+'data uploaded': 'data nahrána',
+'Database': 'databáze',
+'Database %s select': 'databáze %s výber',
+'db': 'db',
'DB Model': 'DB Model',
-'Database': 'Databáze',
'Delete:': 'Smazat:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
'Description': 'Popis',
+'design': 'návrh',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Dokumentáce',
+"Don't know what to do?": "Don't know what to do?",
+'done!': 'hotovo!',
+'Download': 'Download',
'E-mail': 'E-mail',
'Edit': 'Upravit',
-'Edit Profile': 'Upravit profil',
'Edit current record': 'Upravit aktuální záznam',
+'Edit Profile': 'Upravit profil',
+'Email and SMS': 'Email and SMS',
+'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',
+'Errors': 'Errors',
+'export as csv file': 'exportovat do csv souboru',
+'FAQ': 'FAQ',
'First name': 'Křestní jméno',
+'forgot username?': 'neznáš svúj nick?',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
'Group %(group_id)s created': 'Skupina %(group_id)s vytvořena',
'Group ID': 'ID skupiny',
+'Groups': 'Groups',
'Hello World': 'Ahoj světe',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
'Import/Export': 'Import/Export',
'Index': 'Index',
+'insert new': 'vložit nový záznam ',
+'insert new %s': 'vložit nový záznam %s',
'Internal State': 'Vnitřní stav',
-'Invalid Query': 'Neplatná dotaz',
+'Introduction': 'Introduction',
'Invalid email': 'Neplatný email',
'Invalid password': 'Nesprávné heslo',
+'Invalid Query': 'Neplatná dotaz',
+'invalid request': 'Neplatný požadavek',
+'Key': 'Key',
'Last name': 'Příjmení',
'Layout': 'Layout',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
'Logged in': 'Přihlášení úspěšné',
'Logged out': 'Odhlášení úspěšné',
+'login': 'prihlásit',
'Login': 'Login',
+'logout': 'odhlásit',
'Lost Password': 'Ztracené heslo?',
+'lost password?': 'neznáš heslo?',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Menu Model',
+'My Sites': 'My Sites',
'Name': 'Jméno',
-'New Record': 'Nový záznam',
'New password': 'Nové heslo',
+'New Record': 'Nový záznam',
+'new record inserted': 'nový záznam byl vložen',
+'next 100 rows': 'dalších 100 řádků',
'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',
+'or import from csv file': 'a nebo naimportovat z csv souboru',
'Origin': 'Púvod',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'password': 'heslo',
'Password': 'Heslo',
"Password fields don't match": 'Hesla se neshodují',
+'Plugins': 'Plugins',
'Powered by': 'Powered by',
+'Preface': 'Preface',
+'previous 100 rows': 'předchádzajících 100 řádků',
+'profile': 'profil',
+'Python': 'Python',
'Query:': 'Dotaz:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
'Readme': 'Nápověda',
+'Recipes': 'Recipes',
+'Record': 'záznam',
+'record does not exist': 'záznam neexistuje',
'Record ID': 'ID záznamu',
+'Record id': 'id záznamu',
'Register': 'Zaregistrovat se',
+'register': 'registrovat',
'Registration identifier': 'Registrační identifikátor',
'Registration key': 'Registrační kľíč',
'Remember me (for 30 days)': 'Zapamatuj si mne (na 30 dní)',
@@ -70,14 +144,28 @@
'Role': 'Role',
'Rows in Table': 'řádků v tabulce',
'Rows selected': 'označených řádků',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Size of cache:': 'Size of cache:',
+'state': 'stav',
+'Statistics': 'Statistics',
'Stylesheet': 'CSS',
+'submit': 'submit',
'Submit': 'Odeslat',
+'Support': 'Support',
'Sure you want to delete this object?': 'Opravdu chceš smazat tento objekt?',
+'Table': 'tabulka',
'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 Core': 'The Core',
'The output of the file is a dictionary that was rendered by the view %s': 'Výstup zo souboru je slovník, ktorý byl zobrazený ve view %s',
+'The Views': 'The Views',
+'This App': 'This App',
'This is a copy of the scaffolding application': 'Toto je kopie skeletu aplikace',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Časové razítko',
+'Twitter': 'Twitter',
+'unable to parse csv file': 'nedá sa zpracovat csv soubor',
'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',
@@ -89,43 +177,13 @@
'User ID': 'ID uživatele',
'Username': 'Nick',
'Verify Password': 'Zopakuj heslo',
+'Videos': 'Videos',
'View': 'Zobrazit',
'Welcome': 'Vítej',
'Welcome to web2py': 'Vitejte ve web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
'Which called the function %s located in the file %s': 'Ktorý zavolal funkci %s v souboru %s',
'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 %s': 'Navštívili jste URL %s',
-'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',
-'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',
-'state': 'stav',
-'Table': 'tabulka',
-'unable to parse csv file': 'nedá sa zpracovat csv soubor',
}
diff --git a/applications/welcome/languages/es.py b/applications/welcome/languages/es.py
index 1780400c..3fef6254 100644
--- a/applications/welcome/languages/es.py
+++ b/applications/welcome/languages/es.py
@@ -3,144 +3,28 @@
'!langcode!': 'es',
'!langname!': 'Español',
'"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 %%{row} deleted': '%s filas eliminadas',
'%s %%{row} updated': '%s filas actualizadas',
'%s selected': '%s seleccionado(s)',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'(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': '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',
-'Administrative interface': 'Interfaz administrativa',
-'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',
-'Documentation': 'Documentación',
-'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',
-'Online examples': 'Ejemplos en línea',
-'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 %s': 'La salida del archivo es un diccionario escenificado por la vista %s',
-'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 %s located in the file %s': 'La cual llamó la función %s localizada en el archivo %s',
-'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 %s': 'Usted visitó la url %s',
-'about': 'acerca de',
+'Access Control': 'Access Control',
'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',
+'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',
+'Administrative Interface': 'Administrative Interface',
+'Administrative interface': 'Interfaz administrativa',
+'Administrator Password:': 'Contraseña del Administrador:',
+'Ajax Recipes': 'Ajax Recipes',
'and rename it (required):': 'y renombrela (requerido):',
'and rename it:': ' y renombrelo:',
'appadmin': 'appadmin',
@@ -148,40 +32,98 @@
'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',
+'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
+'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"?',
+'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!',
+'Authentication': 'Autenticación',
+'Available Databases and Tables': 'Bases de datos y tablas disponibles',
+'Buy this book': 'Buy this book',
'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
+'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.',
'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',
'change password': 'cambie contraseña',
'check all': 'marcar todos',
+'Check to delete': 'Marque para eliminar',
'clean': 'limpiar',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'click to check for upgrades': 'haga clic para buscar actualizaciones',
+'Client IP': 'IP del Cliente',
+'Community': 'Community',
'compile': 'compilar',
'compiled application removed': 'aplicación compilada removida',
+'Components and Plugins': 'Components and Plugins',
+'Controller': 'Controlador',
+'Controllers': 'Controladores',
'controllers': 'controladores',
+'Copyright': 'Derechos de autor',
'create file with filename:': 'cree archivo con nombre:',
+'Create new application': 'Cree una nueva aplicación',
'create new application:': 'nombre de la nueva aplicación:',
'crontab': 'crontab',
+'Current request': 'Solicitud en curso',
+'Current response': 'Respuesta en curso',
+'Current session': 'Sesión en curso',
'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',
+'Date and Time': 'Fecha y Hora',
'db': 'db',
+'DB Model': 'Modelo "db"',
'defines tables': 'define tablas',
+'Delete': 'Elimine',
'delete': 'eliminar',
'delete all checked': 'eliminar marcados',
+'Delete:': 'Elimine:',
+'Demo': 'Demo',
+'Deploy on Google App Engine': 'Instale en Google App Engine',
+'Deployment Recipes': 'Deployment Recipes',
+'Description': 'Descripción',
+'DESIGN': 'DISEÑO',
'design': 'modificar',
+'Design for': 'Diseño para',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
+'Documentation': 'Documentación',
+"Don't know what to do?": "Don't know what to do?",
'done!': 'listo!',
+'Download': 'Download',
+'E-mail': 'Correo electrónico',
+'EDIT': 'EDITAR',
'edit': 'editar',
+'Edit': 'Editar',
+'Edit application': 'Editar aplicación',
'edit controller': 'editar controlador',
+'Edit current record': 'Edite el registro actual',
'edit profile': 'editar perfil',
+'Edit Profile': 'Editar Perfil',
+'Edit This App': 'Edite esta App',
+'Editing file': 'Editando archivo',
+'Editing file "%s"': 'Editando archivo "%s"',
+'Email and SMS': 'Email and SMS',
+'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
+'Errors': 'Errors',
'errors': 'errores',
'export as csv file': 'exportar como archivo CSV',
'exposes': 'expone',
'extends': 'extiende',
'failed to reload module': 'recarga del módulo ha fallado',
+'FAQ': 'FAQ',
'file "%(filename)s" created': 'archivo "%(filename)s" creado',
'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
@@ -191,70 +133,186 @@
'file does not exist': 'archivo no existe',
'file saved on %(time)s': 'archivo guardado %(time)s',
'file saved on %s': 'archivo guardado %s',
+'First name': 'Nombre',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
+'Group ID': 'ID de Grupo',
+'Groups': 'Groups',
+'Hello World': 'Hola Mundo',
'help': 'ayuda',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
'htmledit': 'htmledit',
+'import': 'import',
+'Import/Export': 'Importar/Exportar',
'includes': 'incluye',
+'Index': 'Indice',
'insert new': 'inserte nuevo',
'insert new %s': 'inserte nuevo %s',
+'Installed applications': 'Aplicaciones instaladas',
'internal error': 'error interno',
+'Internal State': 'Estado Interno',
+'Introduction': 'Introduction',
+'Invalid action': 'Acción inválida',
+'Invalid email': 'Correo inválido',
'invalid password': 'contraseña inválida',
+'Invalid Query': 'Consulta inválida',
'invalid request': 'solicitud inválida',
'invalid ticket': 'tiquete inválido',
+'Key': 'Key',
'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
+'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
'languages': 'lenguajes',
+'Languages': 'Lenguajes',
'languages updated': 'lenguajes actualizados',
+'Last name': 'Apellido',
+'Last saved on:': 'Guardado en:',
+'Layout': 'Diseño de página',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'License for': 'Licencia para',
+'Live Chat': 'Live Chat',
'loading...': 'cargando...',
'login': 'inicio de sesión',
+'Login': 'Inicio de sesión',
+'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
'logout': 'fin de sesión',
+'Logout': 'Fin de sesión',
+'Lost Password': 'Contraseña perdida',
'lost password?': '¿olvido la contraseña?',
+'Main Menu': 'Menú principal',
+'Manage Cache': 'Manage Cache',
+'Menu Model': 'Modelo "menu"',
'merge': 'combinar',
+'Models': 'Modelos',
'models': 'modelos',
+'Modules': 'Módulos',
'modules': 'módulos',
+'My Sites': 'My Sites',
+'Name': 'Nombre',
'new application "%s" created': 'nueva aplicación "%s" creada',
+'New Record': 'Registro nuevo',
'new record inserted': 'nuevo registro insertado',
'next 100 rows': '100 filas siguientes',
+'NO': 'NO',
+'No databases in this application': 'No hay bases de datos en esta aplicación',
+'Online examples': 'Ejemplos en línea',
'or import from csv file': 'o importar desde archivo CSV',
'or provide application url:': 'o provea URL de la aplicación:',
+'Origin': 'Origen',
+'Original/Translation': 'Original/Traducción',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
'pack all': 'empaquetar todo',
'pack compiled': 'empaquete compiladas',
+'Password': 'Contraseña',
+'Peeking at file': 'Visualizando archivo',
+'Plugins': 'Plugins',
+'Powered by': 'Este sitio usa',
+'Preface': 'Preface',
'previous 100 rows': '100 filas anteriores',
+'Python': 'Python',
+'Query:': 'Consulta:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
'Record': 'registro',
'record does not exist': 'el registro no existe',
+'Record ID': 'ID de Registro',
'Record id': 'id de registro',
+'Register': 'Registrese',
'register': 'registrese',
+'Registration key': 'Contraseña de Registro',
'remove compiled': 'eliminar compiladas',
+'Reset Password key': 'Reset Password key',
+'Resolve Conflict file': 'archivo Resolución de Conflicto',
'restore': 'restaurar',
'revert': 'revertir',
+'Role': 'Rol',
+'Rows in Table': 'Filas en la tabla',
+'Rows selected': 'Filas seleccionadas',
'save': 'guardar',
+'Saved file hash:': 'Hash del archivo guardado:',
+'Semantic': 'Semantic',
+'Services': 'Services',
'session expired': 'sesión expirada',
'shell': 'shell',
'site': 'sitio',
+'Size of cache:': 'Size of cache:',
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
'state': 'estado',
'static': 'estáticos',
+'Static files': 'Archivos estáticos',
+'Statistics': 'Statistics',
+'Stylesheet': 'Hoja de estilo',
+'submit': 'submit',
+'Support': 'Support',
+'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
'Table': 'tabla',
+'Table name': 'Nombre de la tabla',
'test': 'probar',
+'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 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 Core': 'The Core',
'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
+'The output of the file is a dictionary that was rendered by the view %s': 'La salida del archivo es un diccionario escenificado por la vista %s',
'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
+'The Views': 'The Views',
+'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',
'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
+'This App': 'This App',
+'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',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
+'Timestamp': 'Timestamp',
'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',
+'Twitter': 'Twitter',
+'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
'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 download': 'No es posible la descarga',
+'Unable to download app': 'No es posible descarga la aplicación',
'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',
+'Update:': 'Actualice:',
'upload application:': 'subir aplicación:',
+'Upload existing application': 'Suba esta aplicación',
'upload file:': 'suba archivo:',
+'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',
'versioning': 'versiones',
+'Videos': 'Videos',
'view': 'vista',
+'View': 'Vista',
+'Views': 'Vistas',
'views': 'vistas',
-'web2py Recent Tweets': 'Tweets Recientes de web2py',
'web2py is up to date': 'web2py está actualizado',
+'web2py Recent Tweets': 'Tweets Recientes de web2py',
+'Welcome': 'Welcome',
+'Welcome %s': 'Bienvenido %s',
+'Welcome to web2py': 'Bienvenido a web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
+'Which called the function %s located in the file %s': 'La cual llamó la función %s localizada en el archivo %s',
+'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 %s': 'Usted visitó la url %s',
}
diff --git a/applications/welcome/languages/fr-ca.py b/applications/welcome/languages/fr-ca.py
index 2491a9ea..7693d5b4 100644
--- a/applications/welcome/languages/fr-ca.py
+++ b/applications/welcome/languages/fr-ca.py
@@ -3,42 +3,67 @@
'!langcode!': 'fr-ca',
'!langname!': 'Français (Canadien)',
'"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 %%{row} deleted': '%s rangées supprimées',
'%s %%{row} updated': '%s rangées mises à jour',
'%s selected': '%s sélectionné',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'about': 'à propos',
'About': 'À propos',
'Access Control': "Contrôle d'accès",
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': "Interface d'administration",
'Ajax Recipes': 'Recettes Ajax',
+'appadmin is disabled because insecure channel': "appadmin est désactivée parce que le canal n'est pas sécurisé",
'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',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Ne peut pas être vide',
+'change password': 'changer le mot de passe',
'Check to delete': 'Cliquez pour supprimer',
'Check to delete:': 'Cliquez pour supprimer:',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'IP client',
'Community': 'Communauté',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Contrôleur',
'Copyright': "Droit d'auteur",
'Current request': 'Demande actuelle',
'Current response': 'Réponse actuelle',
'Current session': 'Session en cours',
+'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',
'DB Model': 'Modèle DB',
-'Database': 'Base de données',
'Delete:': 'Supprimer:',
'Demo': 'Démo',
'Deployment Recipes': 'Recettes de déploiement ',
'Description': 'Descriptif',
+'design': 'design',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
+'done!': 'fait!',
'Download': 'Téléchargement',
'E-mail': 'Courriel',
'Edit': 'Éditer',
-'Edit This App': 'Modifier cette application',
'Edit current record': "Modifier l'enregistrement courant",
+'edit profile': 'modifier le profil',
+'Edit This App': 'Modifier cette application',
+'Email and SMS': 'Email and SMS',
+'enter an integer between %(min)g and %(max)g': 'entrer un entier compris entre %(min)g et %(max)g',
'Errors': 'Erreurs',
+'export as csv file': 'exporter sous forme de fichier csv',
'FAQ': 'faq',
'First name': 'Prénom',
'Forms and Validators': 'Formulaires et Validateurs',
@@ -50,44 +75,73 @@
'Groups': 'Groupes',
'Hello World': 'Bonjour le monde',
'Home': 'Accueil',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
'Import/Export': 'Importer/Exporter',
'Index': 'Index',
+'insert new': 'insérer un nouveau',
+'insert new %s': 'insérer un nouveau %s',
'Internal State': 'État interne',
'Introduction': 'Présentation',
-'Invalid Query': 'Requête Invalide',
'Invalid email': 'Courriel invalide',
+'Invalid Query': 'Requête Invalide',
+'invalid request': 'requête invalide',
+'Key': 'Key',
'Last name': 'Nom',
'Layout': 'Mise en page',
+'Layout Plugins': 'Layout Plugins',
'Layouts': 'layouts',
'Live chat': 'Clavardage en direct',
+'Live Chat': 'Live Chat',
'Logged in': 'Connecté',
+'login': 'connectez-vous',
'Login': 'Connectez-vous',
+'logout': 'déconnectez-vous',
+'lost password': 'mot de passe perdu',
'Lost Password': 'Mot de passe perdu',
+'lost password?': 'mot de passe perdu?',
'Main Menu': 'Menu principal',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Menu modèle',
+'My Sites': 'My Sites',
'Name': 'Nom',
'New Record': 'Nouvel enregistrement',
+'new record inserted': 'nouvel enregistrement inséré',
+'next 100 rows': '100 prochaines lignes',
'No databases in this application': "Cette application n'a pas de bases de données",
'Online examples': 'Exemples en ligne',
+'or import from csv file': "ou importer d'un fichier CSV",
'Origin': 'Origine',
+'Other Plugins': 'Other Plugins',
'Other Recipes': 'Autres recettes',
'Overview': 'Présentation',
+'password': 'mot de passe',
'Password': 'Mot de passe',
"Password fields don't match": 'Les mots de passe ne correspondent pas',
+'please input your password again': "S'il vous plaît entrer votre mot de passe",
'Plugins': 'Plugiciels',
'Powered by': 'Alimenté par',
'Preface': 'Préface',
+'previous 100 rows': '100 lignes précédentes',
+'profile': 'profile',
'Python': 'Python',
'Query:': 'Requête:',
'Quick Examples': 'Examples Rapides',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
'Readme': 'Lisez-moi',
'Recipes': 'Recettes',
+'Record': 'enregistrement',
'Record %(id)s created': 'Record %(id)s created',
'Record %(id)s updated': 'Record %(id)s updated',
'Record Created': 'Record Created',
+'record does not exist': "l'archive n'existe pas",
'Record ID': "ID d'enregistrement",
+'Record id': "id d'enregistrement",
'Record Updated': 'Record Updated',
'Register': "S'inscrire",
+'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)',
@@ -99,25 +153,33 @@
'Rows selected': 'Lignes sélectionnées',
'Semantic': 'Sémantique',
'Services': 'Services',
+'Size of cache:': 'Size of cache:',
+'state': 'état',
+'Statistics': 'Statistics',
'Stylesheet': 'Feuille de style',
+'submit': 'submit',
'Submit': 'Soumettre',
'Support': 'Soutien',
'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Table': 'tableau',
'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 %s': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue %s',
+'The Views': 'Les Vues',
'This App': 'Cette Appli',
'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Horodatage',
'Twitter': 'Twitter',
+'unable to parse csv file': "incapable d'analyser le fichier cvs",
'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',
+'value already in database or empty': 'valeur déjà dans la base ou vide',
'Verify Password': 'Vérifiez le mot de passe',
'Videos': 'Vidéos',
'View': 'Présentation',
@@ -125,44 +187,9 @@
'Welcome': 'Bienvenu',
'Welcome %s': 'Bienvenue %s',
'Welcome to web2py': 'Bienvenue à web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
'Which called the function %s located in the file %s': 'Qui a appelé la fonction %s se trouvant dans le fichier %s',
'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 %s': "Vous avez visité l'URL %s",
-'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',
-'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",
-'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',
}
diff --git a/applications/welcome/languages/fr.py b/applications/welcome/languages/fr.py
index f7893576..d3ff3d92 100644
--- a/applications/welcome/languages/fr.py
+++ b/applications/welcome/languages/fr.py
@@ -19,10 +19,15 @@
'Available Databases and Tables': 'Bases de données et tables disponibles',
'Buy this book': 'Acheter ce livre',
'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Ne peut pas être vide',
'change password': 'changer le mot de passe',
'Check to delete': 'Cliquez pour supprimer',
'Check to delete:': 'Cliquez pour supprimer:',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'IP client',
'Community': 'Communauté',
'Components and Plugins': 'Components and Plugins',
@@ -33,7 +38,6 @@
'Current session': 'Session en cours',
'customize me!': 'personnalisez-moi!',
'data uploaded': 'données téléchargées',
-'Database': 'Base de données',
'Database': 'base de données',
'Database %s select': 'base de données %s select',
'db': 'db',
@@ -43,6 +47,9 @@
'Deployment Recipes': 'Recettes de déploiement',
'Description': 'Description',
'design': 'design',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Documentation',
"Don't know what to do?": "Don't know what to do?",
'done!': 'fait!',
@@ -66,6 +73,7 @@
'Hello World': 'Bonjour le monde',
'Home': 'Accueil',
'How did you get here?': 'How did you get here?',
+'import': 'import',
'Import/Export': 'Importer/Exporter',
'Index': 'Index',
'insert new': 'insérer un nouveau',
@@ -75,20 +83,22 @@
'Invalid email': 'E-mail invalide',
'Invalid Query': 'Requête Invalide',
'invalid request': 'requête invalide',
+'Key': 'Key',
'Last name': 'Nom',
'Layout': 'Mise en page',
'Layout Plugins': 'Layout Plugins',
'Layouts': 'Layouts',
'Live chat': 'Chat live',
'Live Chat': 'Live Chat',
-'Login': 'Connectez-vous',
'login': 'connectez-vous',
+'Login': 'Connectez-vous',
'logout': 'déconnectez-vous',
'lost password': 'mot de passe perdu',
'Lost Password': 'Mot de passe perdu',
-'lost password?': 'mot de passe perdu?',
'Lost password?': 'Lost password?',
+'lost password?': 'mot de passe perdu?',
'Main Menu': 'Menu principal',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Menu modèle',
'My Sites': 'My Sites',
'Name': 'Nom',
@@ -112,12 +122,15 @@
'Python': 'Python',
'Query:': 'Requête:',
'Quick Examples': 'Examples Rapides',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
'Readme': 'Lisez-moi',
'Recipes': 'Recettes',
'Record': 'enregistrement',
'record does not exist': "l'archive n'existe pas",
-'Record id': "id d'enregistrement",
'Record ID': "ID d'enregistrement",
+'Record id': "id d'enregistrement",
'Register': "S'inscrire",
'register': "s'inscrire",
'Registration identifier': 'Registration identifier',
@@ -131,8 +144,11 @@
'Rows selected': 'Lignes sélectionnées',
'Semantic': 'Sémantique',
'Services': 'Services',
+'Size of cache:': 'Size of cache:',
'state': 'état',
+'Statistics': 'Statistics',
'Stylesheet': 'Feuille de style',
+'submit': 'submit',
'Submit': 'Soumettre',
'Support': 'Support',
'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
@@ -144,6 +160,7 @@
'The Views': 'Les Vues',
'This App': 'Cette Appli',
'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Horodatage',
'Twitter': 'Twitter',
'unable to parse csv file': "incapable d'analyser le fichier cvs",
diff --git a/applications/welcome/languages/hi.py b/applications/welcome/languages/hi.py
index 8dc9f19f..46a47e86 100644
--- a/applications/welcome/languages/hi.py
+++ b/applications/welcome/languages/hi.py
@@ -3,85 +3,147 @@
'!langcode!': 'hi-in',
'!langname!': 'हिन्दी',
'"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 %%{row} deleted': '%s पंक्तियाँ मिटाएँ',
'%s %%{row} updated': '%s पंक्तियाँ अद्यतन',
'%s selected': '%s चुना हुआ',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'प्रशासनिक इंटरफेस के लिए यहाँ क्लिक करें',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'अप आडमिन (appadmin) अक्षम है क्योंकि असुरक्षित चैनल',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Available Databases and Tables': 'उपलब्ध डेटाबेस और तालिका',
+'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'खाली नहीं हो सकता',
'Change Password': 'पासवर्ड बदलें',
+'change password': 'change password',
'Check to delete': 'हटाने के लिए चुनें',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Controller',
'Copyright': 'Copyright',
'Current request': 'वर्तमान अनुरोध',
'Current response': 'वर्तमान प्रतिक्रिया',
'Current session': 'वर्तमान सेशन',
-'DB Model': 'DB Model',
-'Database': 'Database',
-'Delete:': 'मिटाना:',
-'Edit': 'Edit',
-'Edit Profile': 'प्रोफ़ाइल संपादित करें',
-'Edit This App': 'Edit This App',
-'Edit current record': 'वर्तमान रेकॉर्ड संपादित करें ',
-'Hello World': 'Hello World',
-'Hello from MyApp': 'Hello from MyApp',
-'Import/Export': 'आयात / निर्यात',
-'Index': 'Index',
-'Internal State': 'आंतरिक स्थिति',
-'Invalid Query': 'अमान्य प्रश्न',
-'Layout': 'Layout',
-'Login': 'लॉग इन',
-'Logout': 'लॉग आउट',
-'Lost Password': 'पासवर्ड खो गया',
-'Main Menu': 'Main Menu',
-'Menu Model': 'Menu Model',
-'New Record': 'नया रेकॉर्ड',
-'No databases in this application': 'इस अनुप्रयोग में कोई डेटाबेस नहीं हैं',
-'Online examples': 'ऑनलाइन उदाहरण के लिए यहाँ क्लिक करें',
-'Powered by': 'Powered by',
-'Query:': 'प्रश्न:',
-'Register': 'पंजीकृत (रजिस्टर) करना ',
-'Rows in Table': 'तालिका में पंक्तियाँ ',
-'Rows selected': 'चयनित (चुने गये) पंक्तियाँ ',
-'Stylesheet': 'Stylesheet',
-'Sure you want to delete this object?': 'सुनिश्चित हैं कि आप इस वस्तु को हटाना चाहते हैं?',
-'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.',
-'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
-'Update:': 'अद्यतन करना:',
-'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': 'वेब२पाइ (web2py) में आपका स्वागत है',
-'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
-'You visited the url %s': 'You visited the url %s',
-'appadmin is disabled because insecure channel': 'अप आडमिन (appadmin) अक्षम है क्योंकि असुरक्षित चैनल',
-'cache': 'cache',
-'change password': 'change password',
'customize me!': 'मुझे अनुकूलित (कस्टमाइज़) करें!',
'data uploaded': 'डाटा अपलोड सम्पन्न ',
'Database': 'डेटाबेस',
'Database %s select': 'डेटाबेस %s चुनी हुई',
'db': 'db',
+'DB Model': 'DB Model',
+'Delete:': 'मिटाना:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
'design': 'रचना करें',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
'done!': 'हो गया!',
+'Download': 'Download',
+'Edit': 'Edit',
+'Edit current record': 'वर्तमान रेकॉर्ड संपादित करें ',
'edit profile': 'edit profile',
+'Edit Profile': 'प्रोफ़ाइल संपादित करें',
+'Edit This App': 'Edit This App',
+'Email and SMS': 'Email and SMS',
+'Errors': 'Errors',
'export as csv file': 'csv फ़ाइल के रूप में निर्यात',
+'FAQ': 'FAQ',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Groups': 'Groups',
+'Hello from MyApp': 'Hello from MyApp',
+'Hello World': 'Hello World',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
+'Import/Export': 'आयात / निर्यात',
+'Index': 'Index',
'insert new': 'नया डालें',
'insert new %s': 'नया %s डालें',
+'Internal State': 'आंतरिक स्थिति',
+'Introduction': 'Introduction',
+'Invalid Query': 'अमान्य प्रश्न',
'invalid request': 'अवैध अनुरोध',
+'Key': 'Key',
+'Layout': 'Layout',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
'login': 'login',
+'Login': 'लॉग इन',
'logout': 'logout',
+'Logout': 'लॉग आउट',
+'Lost Password': 'पासवर्ड खो गया',
+'Main Menu': 'Main Menu',
+'Manage Cache': 'Manage Cache',
+'Menu Model': 'Menu Model',
+'My Sites': 'My Sites',
+'New Record': 'नया रेकॉर्ड',
'new record inserted': 'नया रेकॉर्ड डाला',
'next 100 rows': 'अगले 100 पंक्तियाँ',
+'No databases in this application': 'इस अनुप्रयोग में कोई डेटाबेस नहीं हैं',
+'Online examples': 'ऑनलाइन उदाहरण के लिए यहाँ क्लिक करें',
'or import from csv file': 'या csv फ़ाइल से आयात',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'Plugins': 'Plugins',
+'Powered by': 'Powered by',
+'Preface': 'Preface',
'previous 100 rows': 'पिछले 100 पंक्तियाँ',
+'Python': 'Python',
+'Query:': 'प्रश्न:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
'Record': 'Record',
'record does not exist': 'रिकॉर्ड मौजूद नहीं है',
'Record id': 'रिकॉर्ड पहचानकर्ता (आईडी)',
+'Register': 'पंजीकृत (रजिस्टर) करना ',
'register': 'register',
+'Rows in Table': 'तालिका में पंक्तियाँ ',
+'Rows selected': 'चयनित (चुने गये) पंक्तियाँ ',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Size of cache:': 'Size of cache:',
'state': 'स्थिति',
+'Statistics': 'Statistics',
+'Stylesheet': 'Stylesheet',
+'submit': 'submit',
+'Support': 'Support',
+'Sure you want to delete this object?': 'सुनिश्चित हैं कि आप इस वस्तु को हटाना चाहते हैं?',
'Table': 'तालिका',
+'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.',
+'The Core': 'The Core',
+'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
+'The Views': 'The Views',
+'This App': 'This App',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
+'Twitter': 'Twitter',
'unable to parse csv file': 'csv फ़ाइल पार्स करने में असमर्थ',
+'Update:': 'अद्यतन करना:',
+'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.',
+'Videos': 'Videos',
+'View': 'View',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'वेब२पाइ (web2py) में आपका स्वागत है',
+'Welcome to web2py!': 'Welcome to web2py!',
+'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
+'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 %s': 'You visited the url %s',
}
diff --git a/applications/welcome/languages/hu.py b/applications/welcome/languages/hu.py
index bd996f66..bc32c8dd 100644
--- a/applications/welcome/languages/hu.py
+++ b/applications/welcome/languages/hu.py
@@ -3,96 +3,160 @@
'!langcode!': 'hu',
'!langname!': 'Magyar',
'"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 %%{row} deleted': '%s sorok törlődtek',
'%s %%{row} updated': '%s sorok frissítődtek',
'%s selected': '%s kiválasztott',
+'%Y-%m-%d': '%Y.%m.%d.',
+'%Y-%m-%d %H:%M:%S': '%Y.%m.%d. %H:%M:%S',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'az adminisztrációs felületért kattints ide',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'az appadmin a biztonságtalan csatorna miatt letiltva',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Available Databases and Tables': 'Elérhető adatbázisok és táblák',
+'Buy this book': 'Buy this book',
+'cache': 'gyorsítótár',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Nem lehet üres',
+'change password': 'jelszó megváltoztatása',
'Check to delete': 'Törléshez válaszd ki',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'Client IP',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Controller',
'Copyright': 'Copyright',
'Current request': 'Jelenlegi lekérdezés',
'Current response': 'Jelenlegi válasz',
'Current session': 'Jelenlegi folyamat',
-'DB Model': 'DB Model',
-'Database': 'Adatbázis',
-'Delete:': 'Töröl:',
-'Description': 'Description',
-'E-mail': 'E-mail',
-'Edit': 'Szerkeszt',
-'Edit This App': 'Alkalmazást szerkeszt',
-'Edit current record': 'Aktuális bejegyzés szerkesztése',
-'First name': 'First name',
-'Group ID': 'Group ID',
-'Hello World': 'Hello Világ',
-'Import/Export': 'Import/Export',
-'Index': 'Index',
-'Internal State': 'Internal State',
-'Invalid Query': 'Hibás lekérdezés',
-'Invalid email': 'Invalid email',
-'Last name': 'Last name',
-'Layout': 'Szerkezet',
-'Main Menu': 'Főmenü',
-'Menu Model': 'Menü model',
-'Name': 'Name',
-'New Record': 'Új bejegyzés',
-'No databases in this application': 'Nincs adatbázis ebben az alkalmazásban',
-'Online examples': 'online példákért kattints ide',
-'Origin': 'Origin',
-'Password': 'Password',
-'Powered by': 'Powered by',
-'Query:': 'Lekérdezés:',
-'Record ID': 'Record ID',
-'Registration key': 'Registration key',
-'Reset Password key': 'Reset Password key',
-'Role': 'Role',
-'Rows in Table': 'Sorok a táblában',
-'Rows selected': 'Kiválasztott sorok',
-'Stylesheet': 'Stylesheet',
-'Sure you want to delete this object?': 'Biztos törli 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.',
-'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
-'Timestamp': 'Timestamp',
-'Update:': 'Frissít:',
-'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ézet',
-'Welcome %s': 'Welcome %s',
-'Welcome to web2py': 'Isten hozott a web2py-ban',
-'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
-'You visited the url %s': 'You visited the url %s',
-'appadmin is disabled because insecure channel': 'az appadmin a biztonságtalan csatorna miatt letiltva',
-'cache': 'gyorsítótár',
-'change password': 'jelszó megváltoztatása',
'customize me!': 'változtass meg!',
'data uploaded': 'adat feltöltve',
'Database': 'adatbázis',
'Database %s select': 'adatbázis %s kiválasztás',
'db': 'db',
+'DB Model': 'DB Model',
+'Delete:': 'Töröl:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
+'Description': 'Description',
'design': 'design',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
'done!': 'kész!',
+'Download': 'Download',
+'E-mail': 'E-mail',
+'Edit': 'Szerkeszt',
+'Edit current record': 'Aktuális bejegyzés szerkesztése',
'edit profile': 'profil szerkesztése',
+'Edit This App': 'Alkalmazást szerkeszt',
+'Email and SMS': 'Email and SMS',
+'Errors': 'Errors',
'export as csv file': 'exportál csv fájlba',
+'FAQ': 'FAQ',
+'First name': 'First name',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Group ID': 'Group ID',
+'Groups': 'Groups',
+'Hello World': 'Hello Világ',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
+'Import/Export': 'Import/Export',
+'Index': 'Index',
'insert new': 'új beillesztése',
'insert new %s': 'új beillesztése %s',
+'Internal State': 'Internal State',
+'Introduction': 'Introduction',
+'Invalid email': 'Invalid email',
+'Invalid Query': 'Hibás lekérdezés',
'invalid request': 'hibás kérés',
+'Key': 'Key',
+'Last name': 'Last name',
+'Layout': 'Szerkezet',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
'login': 'belép',
'logout': 'kilép',
'lost password': 'elveszett jelszó',
+'Lost Password': 'Lost Password',
+'Main Menu': 'Főmenü',
+'Manage Cache': 'Manage Cache',
+'Menu Model': 'Menü model',
+'My Sites': 'My Sites',
+'Name': 'Name',
+'New Record': 'Új bejegyzés',
'new record inserted': 'új bejegyzés felvéve',
'next 100 rows': 'következő 100 sor',
+'No databases in this application': 'Nincs adatbázis ebben az alkalmazásban',
+'Online examples': 'online példákért kattints ide',
'or import from csv file': 'vagy betöltés csv fájlból',
+'Origin': 'Origin',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'Password': 'Password',
+'Plugins': 'Plugins',
+'Powered by': 'Powered by',
+'Preface': 'Preface',
'previous 100 rows': 'előző 100 sor',
+'Python': 'Python',
+'Query:': 'Lekérdezés:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
'Record': 'bejegyzés',
'record does not exist': 'bejegyzés nem létezik',
+'Record ID': 'Record ID',
'Record id': 'bejegyzés id',
+'Register': 'Register',
'register': 'regisztráció',
+'Registration key': 'Registration key',
+'Reset Password key': 'Reset Password key',
+'Role': 'Role',
+'Rows in Table': 'Sorok a táblában',
+'Rows selected': 'Kiválasztott sorok',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Size of cache:': 'Size of cache:',
'state': 'állapot',
+'Statistics': 'Statistics',
+'Stylesheet': 'Stylesheet',
+'submit': 'submit',
+'Support': 'Support',
+'Sure you want to delete this object?': 'Biztos törli ezt az objektumot?',
'Table': 'tábla',
+'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.',
+'The Core': 'The Core',
+'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
+'The Views': 'The Views',
+'This App': 'This App',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
+'Timestamp': 'Timestamp',
+'Twitter': 'Twitter',
'unable to parse csv file': 'nem lehet a csv fájlt beolvasni',
+'Update:': 'Frissít:',
+'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',
+'Videos': 'Videos',
+'View': 'Nézet',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'Isten hozott a web2py-ban',
+'Welcome to web2py!': 'Welcome to web2py!',
+'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
+'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 %s': 'You visited the url %s',
}
diff --git a/applications/welcome/languages/it.py b/applications/welcome/languages/it.py
index 90f5d3e1..516852d0 100644
--- a/applications/welcome/languages/it.py
+++ b/applications/welcome/languages/it.py
@@ -20,6 +20,8 @@
'Available Databases and Tables': 'Database e tabelle disponibili',
'Buy this book': 'Buy this book',
'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Non può essere vuoto',
'change password': 'Cambia password',
'Check to delete': 'Seleziona per cancellare',
@@ -49,6 +51,7 @@
'Description': 'Descrizione',
'design': 'progetta',
'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
'Disk Cleared': 'Disk Cleared',
'Documentation': 'Documentazione',
"Don't know what to do?": "Don't know what to do?",
@@ -90,6 +93,7 @@
'Invalid Query': 'Richiesta (query) non valida',
'invalid request': 'richiesta non valida',
'Is Active': 'Is Active',
+'Key': 'Key',
'Last name': 'Cognome',
'Layout': 'Layout',
'Layout Plugins': 'Layout Plugins',
@@ -136,6 +140,7 @@
'Query:': 'Richiesta (query):',
'Quick Examples': 'Quick Examples',
'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
'Ram Cleared': 'Ram Cleared',
'Recipes': 'Recipes',
'Record': 'Record',
@@ -154,7 +159,9 @@
'Rows selected': 'Righe selezionate',
'Semantic': 'Semantic',
'Services': 'Services',
+'Size of cache:': 'Size of cache:',
'state': 'stato',
+'Statistics': 'Statistics',
'Stylesheet': 'Foglio di stile (stylesheet)',
'submit': 'submit',
'Submit': 'Submit',
@@ -168,6 +175,7 @@
'The Views': 'The Views',
'This App': 'This App',
'This is a copy of the scaffolding application': "Questa è una copia dell'applicazione di base (scaffold)",
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Ora (timestamp)',
'too short': 'too short',
'Twitter': 'Twitter',
diff --git a/applications/welcome/languages/nl.py b/applications/welcome/languages/nl.py
index 33a06002..39892e52 100644
--- a/applications/welcome/languages/nl.py
+++ b/applications/welcome/languages/nl.py
@@ -2,6 +2,7 @@
{
'!langcode!': 'nl',
'!langname!': 'Nederlands',
+'"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',
'%(nrows)s records found': '%(nrows)s records gevonden',
'%d days ago': '%d dagen geleden',
'%d weeks ago': '%d weken gelden',
@@ -95,7 +96,6 @@
'customize me!': 'pas me aan!',
'data uploaded': 'data geupload',
'Database': 'Database',
-'Database': 'Database',
'Database %s select': 'Database %s select',
'database administration': 'database administratie',
'Date and Time': 'Datum en Tijd',
@@ -181,8 +181,8 @@
'Introduction': 'Introductie',
'Invalid action': 'Ongeldige actie',
'Invalid email': 'Ongeldig emailadres',
-'Invalid password': 'Ongeldig wachtwoord',
'invalid password': 'ongeldig wachtwoord',
+'Invalid password': 'Ongeldig wachtwoord',
'Invalid Query': 'Ongeldige Query',
'invalid request': 'ongeldige request',
'invalid ticket': 'ongeldige ticket',
@@ -262,8 +262,8 @@
'Recipes': 'Recepten',
'Record': 'Record',
'record does not exist': 'record bestaat niet',
-'Record id': 'Record id',
'Record ID': 'Record ID',
+'Record id': 'Record id',
'register': 'registreer',
'Register': 'Registreer',
'Registration identifier': 'Registratie identifier',
diff --git a/applications/welcome/languages/pl.py b/applications/welcome/languages/pl.py
index a94ec312..aa1e5701 100644
--- a/applications/welcome/languages/pl.py
+++ b/applications/welcome/languages/pl.py
@@ -3,107 +3,169 @@
'!langcode!': 'pl',
'!langname!': 'Polska',
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Uaktualnij" jest dodatkowym wyrażeniem postaci "pole1=\'nowawartość\'". Nie możesz uaktualnić lub usunąć wyników z JOIN:',
-'%Y-%m-%d': '%Y-%m-%d',
-'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'%s %%{row} deleted': 'Wierszy usuniętych: %s',
'%s %%{row} updated': 'Wierszy uaktualnionych: %s',
'%s selected': '%s wybranych',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'Kliknij aby przejść do panelu administracyjnego',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'administracja aplikacji wyłączona z powodu braku bezpiecznego połączenia',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Authentication': 'Uwierzytelnienie',
'Available Databases and Tables': 'Dostępne bazy danych i tabele',
+'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Nie może być puste',
'Change Password': 'Zmień hasło',
+'change password': 'change password',
'Check to delete': 'Zaznacz aby usunąć',
'Check to delete:': 'Zaznacz aby usunąć:',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'IP klienta',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Kontroler',
'Copyright': 'Copyright',
'Current request': 'Aktualne żądanie',
'Current response': 'Aktualna odpowiedź',
'Current session': 'Aktualna sesja',
-'DB Model': 'Model bazy danych',
-'Database': 'Baza danych',
-'Delete:': 'Usuń:',
-'Description': 'Opis',
-'E-mail': 'Adres e-mail',
-'Edit': 'Edycja',
-'Edit Profile': 'Edytuj profil',
-'Edit This App': 'Edytuj tę aplikację',
-'Edit current record': 'Edytuj obecny rekord',
-'First name': 'Imię',
-'Function disabled': 'Funkcja wyłączona',
-'Group ID': 'ID grupy',
-'Hello World': 'Witaj Świecie',
-'Import/Export': 'Importuj/eksportuj',
-'Index': 'Indeks',
-'Internal State': 'Stan wewnętrzny',
-'Invalid Query': 'Błędne zapytanie',
-'Invalid email': 'Błędny adres email',
-'Last name': 'Nazwisko',
-'Layout': 'Układ',
-'Login': 'Zaloguj',
-'Logout': 'Wyloguj',
-'Lost Password': 'Przypomnij hasło',
-'Main Menu': 'Menu główne',
-'Menu Model': 'Model menu',
-'Name': 'Nazwa',
-'New Record': 'Nowy rekord',
-'No databases in this application': 'Brak baz danych w tej aplikacji',
-'Online examples': 'Kliknij aby przejść do interaktywnych przykładów',
-'Origin': 'Źródło',
-'Password': 'Hasło',
-"Password fields don't match": 'Pola hasła nie są zgodne ze sobą',
-'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ów',
-'Submit': 'Wyślij',
-'Sure you want to delete this object?': 'Czy na pewno chcesz usunąć 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ść\'". Takie coś jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.',
-'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
-'Timestamp': 'Znacznik czasu',
-'Update:': 'Uaktualnij:',
-'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Użyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...) jako NOT do tworzenia bardziej skomplikowanych zapytań.',
-'User %(id)s Registered': 'Użytkownik %(id)s został zarejestrowany',
-'User ID': 'ID użytkownika',
-'Verify Password': 'Potwierdź hasło',
-'View': 'Widok',
-'Welcome %s': 'Welcome %s',
-'Welcome to web2py': 'Witaj w web2py',
-'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
-'You visited the url %s': 'You visited the url %s',
-'appadmin is disabled because insecure channel': 'administracja aplikacji wyłączona z powodu braku bezpiecznego połączenia',
-'cache': 'cache',
-'change password': 'change password',
'customize me!': 'dostosuj mnie!',
'data uploaded': 'dane wysłane',
'Database': 'baza danych',
'Database %s select': 'wybór z bazy danych %s',
'db': 'baza danych',
+'DB Model': 'Model bazy danych',
+'Delete:': 'Usuń:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
+'Description': 'Opis',
'design': 'projektuj',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
'done!': 'zrobione!',
+'Download': 'Download',
+'E-mail': 'Adres e-mail',
+'Edit': 'Edycja',
+'Edit current record': 'Edytuj obecny rekord',
'edit profile': 'edit profile',
+'Edit Profile': 'Edytuj profil',
+'Edit This App': 'Edytuj tę aplikację',
+'Email and SMS': 'Email and SMS',
+'Errors': 'Errors',
'export as csv file': 'eksportuj jako plik csv',
+'FAQ': 'FAQ',
+'First name': 'Imię',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Function disabled': 'Funkcja wyłączona',
+'Group ID': 'ID grupy',
+'Groups': 'Groups',
+'Hello World': 'Witaj Świecie',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
+'Import/Export': 'Importuj/eksportuj',
+'Index': 'Indeks',
'insert new': 'wstaw nowy rekord tabeli',
'insert new %s': 'wstaw nowy rekord do tabeli %s',
+'Internal State': 'Stan wewnętrzny',
+'Introduction': 'Introduction',
+'Invalid email': 'Błędny adres email',
+'Invalid Query': 'Błędne zapytanie',
'invalid request': 'Błędne żądanie',
+'Key': 'Key',
+'Last name': 'Nazwisko',
+'Layout': 'Układ',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
'login': 'login',
+'Login': 'Zaloguj',
'logout': 'logout',
+'Logout': 'Wyloguj',
+'Lost Password': 'Przypomnij hasło',
+'Main Menu': 'Menu główne',
+'Manage Cache': 'Manage Cache',
+'Menu Model': 'Model menu',
+'My Sites': 'My Sites',
+'Name': 'Nazwa',
+'New Record': 'Nowy rekord',
'new record inserted': 'nowy rekord został wstawiony',
'next 100 rows': 'następne 100 wierszy',
+'No databases in this application': 'Brak baz danych w tej aplikacji',
+'Online examples': 'Kliknij aby przejść do interaktywnych przykładów',
'or import from csv file': 'lub zaimportuj z pliku csv',
+'Origin': 'Źródło',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'Password': 'Hasło',
+"Password fields don't match": 'Pola hasła nie są zgodne ze sobą',
+'Plugins': 'Plugins',
+'Powered by': 'Zasilane przez',
+'Preface': 'Preface',
'previous 100 rows': 'poprzednie 100 wierszy',
+'Python': 'Python',
+'Query:': 'Zapytanie:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
'Record': 'rekord',
'record does not exist': 'rekord nie istnieje',
+'Record ID': 'ID rekordu',
'Record id': 'id rekordu',
+'Register': 'Zarejestruj',
'register': 'register',
+'Registration key': 'Klucz rejestracji',
+'Role': 'Rola',
+'Rows in Table': 'Wiersze w tabeli',
+'Rows selected': 'Wybrane wiersze',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Size of cache:': 'Size of cache:',
'state': 'stan',
+'Statistics': 'Statistics',
+'Stylesheet': 'Arkusz stylów',
+'submit': 'submit',
+'Submit': 'Wyślij',
+'Support': 'Support',
+'Sure you want to delete this object?': 'Czy na pewno chcesz usunąć ten obiekt?',
'Table': 'tabela',
+'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ść\'". Takie coś jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.',
+'The Core': 'The Core',
+'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
+'The Views': 'The Views',
+'This App': 'This App',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
+'Timestamp': 'Znacznik czasu',
+'Twitter': 'Twitter',
'unable to parse csv file': 'nie można sparsować pliku csv',
+'Update:': 'Uaktualnij:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Użyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...) jako NOT do tworzenia bardziej skomplikowanych zapytań.',
+'User %(id)s Registered': 'Użytkownik %(id)s został zarejestrowany',
+'User ID': 'ID użytkownika',
+'Verify Password': 'Potwierdź hasło',
+'Videos': 'Videos',
+'View': 'Widok',
+'Welcome %s': 'Welcome %s',
+'Welcome to web2py': 'Witaj w web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
+'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
+'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 %s': 'You visited the url %s',
}
diff --git a/applications/welcome/languages/pt-br.py b/applications/welcome/languages/pt-br.py
index ecdfba3f..9e9048dc 100644
--- a/applications/welcome/languages/pt-br.py
+++ b/applications/welcome/languages/pt-br.py
@@ -3,39 +3,63 @@
'!langcode!': 'pt-br',
'!langname!': 'Português (do Brasil)',
'"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 %%{row} deleted': '%s linhas apagadas',
'%s %%{row} updated': '%s linhas atualizadas',
'%s selected': '%s selecionado',
+'%Y-%m-%d': '%d-%m-%Y',
+'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
'About': 'About',
'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'Interface administrativa',
'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'Administração desativada devido ao canal inseguro',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Available Databases and Tables': 'Bancos de dados e tabelas disponíveis',
'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Não pode ser vazio',
+'change password': 'modificar senha',
'Check to delete': 'Marque para apagar',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'Client IP',
'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Controlador',
'Copyright': 'Copyright',
'Current request': 'Requisição atual',
'Current response': 'Resposta atual',
'Current session': 'Sessão atual',
+'customize me!': 'Personalize-me!',
+'data uploaded': 'dados enviados',
+'Database': 'banco de dados',
+'Database %s select': 'Selecionar banco de dados %s',
+'db': 'bd',
'DB Model': 'Modelo BD',
-'Database': 'Banco de dados',
'Delete:': 'Apagar:',
'Demo': 'Demo',
'Deployment Recipes': 'Deployment Recipes',
'Description': 'Description',
+'design': 'design',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
+'done!': 'concluído!',
'Download': 'Download',
'E-mail': 'E-mail',
'Edit': 'Editar',
-'Edit This App': 'Edit This App',
'Edit current record': 'Editar o registro atual',
+'edit profile': 'editar perfil',
+'Edit This App': 'Edit This App',
+'Email and SMS': 'Email and SMS',
'Errors': 'Errors',
+'export as csv file': 'exportar como um arquivo csv',
'FAQ': 'FAQ',
'First name': 'First name',
'Forms and Validators': 'Forms and Validators',
@@ -44,37 +68,62 @@
'Groups': 'Groups',
'Hello World': 'Olá Mundo',
'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
'Import/Export': 'Importar/Exportar',
'Index': 'Início',
+'insert new': 'inserir novo',
+'insert new %s': 'inserir novo %s',
'Internal State': 'Estado Interno',
'Introduction': 'Introduction',
-'Invalid Query': 'Consulta Inválida',
'Invalid email': 'Invalid email',
+'Invalid Query': 'Consulta Inválida',
+'invalid request': 'requisição inválida',
+'Key': 'Key',
'Last name': 'Last name',
'Layout': 'Layout',
+'Layout Plugins': 'Layout Plugins',
'Layouts': 'Layouts',
'Live chat': 'Live chat',
+'Live Chat': 'Live Chat',
+'login': 'Entrar',
'Login': 'Autentique-se',
+'logout': 'Sair',
'Lost Password': 'Esqueceu sua senha?',
+'lost password?': 'lost password?',
'Main Menu': 'Menu Principal',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Modelo de Menu',
+'My Sites': 'My Sites',
'Name': 'Name',
'New Record': 'Novo Registro',
+'new record inserted': 'novo registro inserido',
+'next 100 rows': 'próximas 100 linhas',
'No databases in this application': 'Sem bancos de dados nesta aplicação',
'Online examples': 'Alguns exemplos',
+'or import from csv file': 'ou importar de um arquivo csv',
'Origin': 'Origin',
+'Other Plugins': 'Other Plugins',
'Other Recipes': 'Other Recipes',
'Overview': 'Overview',
'Password': 'Password',
'Plugins': 'Plugins',
'Powered by': 'Powered by',
'Preface': 'Preface',
+'previous 100 rows': '100 linhas anteriores',
'Python': 'Python',
'Query:': 'Consulta:',
'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
'Recipes': 'Recipes',
+'Record': 'registro',
+'record does not exist': 'registro não existe',
'Record ID': 'Record ID',
+'Record id': 'id do registro',
'Register': 'Registre-se',
+'register': 'Registre-se',
'Registration key': 'Registration key',
'Reset Password key': 'Reset Password key',
'Resources': 'Resources',
@@ -83,18 +132,25 @@
'Rows selected': 'Linhas selecionadas',
'Semantic': 'Semantic',
'Services': 'Services',
+'Size of cache:': 'Size of cache:',
+'state': 'estado',
+'Statistics': 'Statistics',
'Stylesheet': 'Stylesheet',
+'submit': 'submit',
'Support': 'Support',
'Sure you want to delete this object?': 'Está certo(a) que deseja apagar esse objeto ?',
+'Table': 'tabela',
'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 %s': 'The output of the file is a dictionary that was rendered by the view %s',
+'The Views': 'The Views',
'This App': 'This App',
'This is a copy of the scaffolding application': 'This is a copy of the scaffolding application',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Timestamp',
'Twitter': 'Twitter',
+'unable to parse csv file': 'não foi possível analisar arquivo csv',
'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',
@@ -105,38 +161,10 @@
'Welcome': 'Welcome',
'Welcome %s': 'Vem vindo %s',
'Welcome to web2py': 'Bem vindo ao web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
'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 %s': 'You visited the url %s',
-'appadmin is disabled because insecure channel': 'Administração desativada devido ao canal inseguro',
-'cache': 'cache',
-'change password': 'modificar senha',
-'customize me!': 'Personalize-me!',
-'data uploaded': 'dados enviados',
-'Database': 'banco de dados',
-'Database %s select': 'Selecionar banco de dados %s',
-'db': 'bd',
-'design': 'design',
-'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',
-'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': 'id do registro',
-'register': 'Registre-se',
-'state': 'estado',
-'Table': 'tabela',
-'unable to parse csv file': 'não foi possível analisar arquivo csv',
}
diff --git a/applications/welcome/languages/pt.py b/applications/welcome/languages/pt.py
index 8b0c633f..8d36be6f 100644
--- a/applications/welcome/languages/pt.py
+++ b/applications/welcome/languages/pt.py
@@ -3,119 +3,182 @@
'!langcode!': 'pt',
'!langname!': 'Português',
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" é uma expressão opcional como "field1=\'newvalue\'". Não pode actualizar ou eliminar os resultados de um JOIN',
-'%Y-%m-%d': '%Y-%m-%d',
-'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'%s %%{row} deleted': '%s linhas eliminadas',
'%s %%{row} updated': '%s linhas actualizadas',
'%s selected': '%s seleccionado(s)',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'Painel administrativo',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'appadmin está desactivada pois o canal é inseguro',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Author Reference Auth User': 'Author Reference Auth User',
'Author Reference Auth User.username': 'Author Reference Auth User.username',
'Available Databases and Tables': 'bases de dados e tabelas disponíveis',
+'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'não pode ser vazio',
'Category Create': 'Category Create',
'Category Select': 'Category Select',
+'change password': 'alterar palavra-chave',
'Check to delete': 'seleccione para eliminar',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Comment Create': 'Comment Create',
'Comment Select': 'Comment Select',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Content': 'Content',
'Controller': 'Controlador',
'Copyright': 'Direitos de cópia',
+'create new category': 'create new category',
+'create new comment': 'create new comment',
+'create new post': 'create new post',
'Created By': 'Created By',
'Created On': 'Created On',
'Current request': 'pedido currente',
'Current response': 'resposta currente',
'Current session': 'sessão currente',
-'DB Model': 'Modelo de BD',
-'Database': 'Base de dados',
-'Delete:': 'Eliminar:',
-'Edit': 'Editar',
-'Edit This App': 'Edite esta aplicação',
-'Edit current record': 'Edição de registo currente',
-'Email': 'Email',
-'First Name': 'First Name',
-'For %s #%s': 'For %s #%s',
-'Hello World': 'Olá Mundo',
-'Import/Export': 'Importar/Exportar',
-'Index': 'Índice',
-'Internal State': 'Estado interno',
-'Invalid Query': 'Consulta Inválida',
-'Last Name': 'Last Name',
-'Layout': 'Esboço',
-'Main Menu': 'Menu Principal',
-'Menu Model': 'Menu do Modelo',
-'Modified By': 'Modified By',
-'Modified On': 'Modified On',
-'Name': 'Name',
-'New Record': 'Novo Registo',
-'No Data': 'No Data',
-'No databases in this application': 'Não há bases de dados nesta aplicação',
-'Online examples': 'Exemplos online',
-'Password': 'Password',
-'Post Create': 'Post Create',
-'Post Select': 'Post Select',
-'Powered by': 'Suportado por',
-'Query:': 'Interrogação:',
-'Replyto Reference Post': 'Replyto Reference Post',
-'Rows in Table': 'Linhas numa tabela',
-'Rows selected': 'Linhas seleccionadas',
-'Stylesheet': 'Folha de estilo',
-'Sure you want to delete this object?': 'Tem a certeza que deseja eliminar este objecto?',
-'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'A "query" é uma condição do tipo "db.table1.field1==\'value\'". Algo como "db.table1.field1==db.table2.field2" resultaria num SQL JOIN.',
-'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
-'Title': 'Title',
-'Update:': 'Actualização:',
-'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilize (...)&(...) para AND, (...)|(...) para OR, e ~(...) para NOT para construir interrogações mais complexas.',
-'Username': 'Username',
-'View': 'Vista',
-'Welcome %s': 'Bem-vindo(a) %s',
-'Welcome to Gluonization': 'Bem vindo ao Web2py',
-'Welcome to web2py': 'Bem-vindo(a) ao web2py',
-'When': 'When',
-'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
-'You visited the url %s': 'You visited the url %s',
-'appadmin is disabled because insecure channel': 'appadmin está desactivada pois o canal é inseguro',
-'cache': 'cache',
-'change password': 'alterar palavra-chave',
-'create new category': 'create new category',
-'create new comment': 'create new comment',
-'create new post': 'create new post',
'customize me!': 'Personaliza-me!',
'data uploaded': 'informação enviada',
'Database': 'base de dados',
'Database %s select': 'selecção de base de dados %s',
'db': 'bd',
+'DB Model': 'Modelo de BD',
+'Delete:': 'Eliminar:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
'design': 'design',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
'done!': 'concluído!',
+'Download': 'Download',
+'Edit': 'Editar',
'edit category': 'edit category',
'edit comment': 'edit comment',
+'Edit current record': 'Edição de registo currente',
'edit post': 'edit post',
'edit profile': 'Editar perfil',
+'Edit This App': 'Edite esta aplicação',
+'Email': 'Email',
+'Email and SMS': 'Email and SMS',
+'Errors': 'Errors',
'export as csv file': 'exportar como ficheiro csv',
+'FAQ': 'FAQ',
+'First Name': 'First Name',
+'For %s #%s': 'For %s #%s',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Groups': 'Groups',
+'Hello World': 'Olá Mundo',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
+'Import/Export': 'Importar/Exportar',
+'Index': 'Índice',
'insert new': 'inserir novo',
'insert new %s': 'inserir novo %s',
+'Internal State': 'Estado interno',
+'Introduction': 'Introduction',
+'Invalid Query': 'Consulta Inválida',
'invalid request': 'Pedido Inválido',
+'Key': 'Key',
+'Last Name': 'Last Name',
+'Layout': 'Esboço',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
'login': 'login',
'logout': 'logout',
+'Lost Password': 'Lost Password',
+'Main Menu': 'Menu Principal',
+'Manage Cache': 'Manage Cache',
+'Menu Model': 'Menu do Modelo',
+'Modified By': 'Modified By',
+'Modified On': 'Modified On',
+'My Sites': 'My Sites',
+'Name': 'Name',
+'New Record': 'Novo Registo',
'new record inserted': 'novo registo inserido',
'next 100 rows': 'próximas 100 linhas',
+'No Data': 'No Data',
+'No databases in this application': 'Não há bases de dados nesta aplicação',
+'Online examples': 'Exemplos online',
'or import from csv file': 'ou importe a partir de ficheiro csv',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'Password': 'Password',
+'Plugins': 'Plugins',
+'Post Create': 'Post Create',
+'Post Select': 'Post Select',
+'Powered by': 'Suportado por',
+'Preface': 'Preface',
'previous 100 rows': '100 linhas anteriores',
+'Python': 'Python',
+'Query:': 'Interrogação:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
'Record': 'registo',
'record does not exist': 'registo inexistente',
'Record id': 'id de registo',
+'Register': 'Register',
'register': 'register',
+'Replyto Reference Post': 'Replyto Reference Post',
+'Rows in Table': 'Linhas numa tabela',
+'Rows selected': 'Linhas seleccionadas',
'search category': 'search category',
'search comment': 'search comment',
'search post': 'search post',
'select category': 'select category',
'select comment': 'select comment',
'select post': 'select post',
+'Semantic': 'Semantic',
+'Services': 'Services',
'show category': 'show category',
'show comment': 'show comment',
'show post': 'show post',
+'Size of cache:': 'Size of cache:',
'state': 'estado',
+'Statistics': 'Statistics',
+'Stylesheet': 'Folha de estilo',
+'submit': 'submit',
+'Support': 'Support',
+'Sure you want to delete this object?': 'Tem a certeza que deseja eliminar este objecto?',
'Table': 'tabela',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'A "query" é uma condição do tipo "db.table1.field1==\'value\'". Algo como "db.table1.field1==db.table2.field2" resultaria num SQL JOIN.',
+'The Core': 'The Core',
+'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
+'The Views': 'The Views',
+'This App': 'This App',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
+'Title': 'Title',
+'Twitter': 'Twitter',
'unable to parse csv file': 'não foi possível carregar ficheiro csv',
+'Update:': 'Actualização:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilize (...)&(...) para AND, (...)|(...) para OR, e ~(...) para NOT para construir interrogações mais complexas.',
+'Username': 'Username',
+'Videos': 'Videos',
+'View': 'Vista',
+'Welcome %s': 'Bem-vindo(a) %s',
+'Welcome to Gluonization': 'Bem vindo ao Web2py',
+'Welcome to web2py': 'Bem-vindo(a) ao web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
+'When': 'When',
+'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
+'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 %s': 'You visited the url %s',
}
diff --git a/applications/welcome/languages/ro.py b/applications/welcome/languages/ro.py
index 1352c26e..0f830e3d 100644
--- a/applications/welcome/languages/ro.py
+++ b/applications/welcome/languages/ro.py
@@ -56,6 +56,7 @@
'Available Databases and Tables': 'Baze de date și tabele disponibile',
'Back': 'Înapoi',
'Buy this book': 'Cumpără această carte',
+'Cache': 'Cache',
'cache': 'cache',
'Cache Keys': 'Chei cache',
'cache, errors and sessions cleaned': 'cache, erori și sesiuni golite',
@@ -70,6 +71,9 @@
'Check to delete': 'Coșați pentru a șterge',
'clean': 'golire',
'Clear': 'Golește',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'click to check for upgrades': 'Clic pentru a verifica dacă există upgrade-uri',
'Client IP': 'IP client',
'Community': 'Comunitate',
@@ -91,7 +95,6 @@
'currently saved or': 'în prezent salvat sau',
'customize me!': 'Personalizează-mă!',
'data uploaded': 'date încărcate',
-'Database': 'Baza de date',
'Database': 'bază de date',
'Database %s select': 'selectare bază de date %s',
'database administration': 'administrare bază de date',
@@ -110,7 +113,9 @@
'design': 'design',
'DESIGN': 'DESIGN',
'Design for': 'Design pentru',
+'DISK': 'DISK',
'Disk Cache Keys': 'Chei cache de disc',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Documentație',
"Don't know what to do?": 'Nu știți ce să faceți?',
'done!': 'gata!',
@@ -164,6 +169,7 @@
'Home': 'Acasă',
'How did you get here?': 'Cum ați ajuns aici?',
'htmledit': 'editare html',
+'import': 'import',
'Import/Export': 'Import/Export',
'includes': 'include',
'Index': 'Index',
@@ -180,6 +186,7 @@
'Invalid Query': 'Interogare invalidă',
'invalid request': 'cerere invalidă',
'invalid ticket': 'tichet invalid',
+'Key': 'Key',
'language file "%(filename)s" created/updated': 'fișier de limbă "%(filename)s" creat/actualizat',
'Language files (static strings) updated': 'Fișierele de limbă (șirurile statice de caractere) actualizate',
'languages': 'limbi',
@@ -203,6 +210,7 @@
'Lost Password': 'Parolă pierdută',
'Lost password?': 'Parolă pierdută?',
'Main Menu': 'Meniu principal',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Model meniu',
'merge': 'unește',
'Models': 'Modele',
@@ -245,12 +253,14 @@
'Query': 'Interogare',
'Query:': 'Interogare:',
'Quick Examples': 'Exemple rapide',
+'RAM': 'RAM',
'RAM Cache Keys': 'Chei cache RAM',
+'Ram Cleared': 'Ram Cleared',
'Recipes': 'Rețete',
'Record': 'înregistrare',
'record does not exist': 'înregistrare inexistentă',
-'Record id': 'id înregistrare',
'Record ID': 'ID înregistrare',
+'Record id': 'id înregistrare',
'register': 'înregistrare',
'Register': 'Înregistrare',
'Registration identifier': 'Identificator de autentificare',
@@ -275,13 +285,16 @@
'session expired': 'sesiune expirată',
'shell': 'line de commandă',
'site': 'site',
+'Size of cache:': 'Size of cache:',
'some files could not be removed': 'anumite fișiere n-au putut fi șterse',
'starts with': 'începe cu',
'state': 'stare',
'static': 'static',
'Static files': 'Fișiere statice',
+'Statistics': 'Statistics',
'Stylesheet': 'Foaie de stiluri',
'Submit': 'Înregistrează',
+'submit': 'submit',
'Support': 'Suport',
'Sure you want to delete this object?': 'Sigur ștergeți acest obiect?',
'Table': 'tabel',
@@ -306,6 +319,7 @@
'This is a copy of the scaffolding application': 'Aceasta este o copie a aplicației schelet',
'This is the %(filename)s template': 'Aceasta este șablonul fișierului %(filename)s',
'Ticket': 'Tichet',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Moment în timp (timestamp)',
'to previous version.': 'la versiunea anterioară.',
'too short': 'prea scurt',
diff --git a/applications/welcome/languages/ru.py b/applications/welcome/languages/ru.py
index ce632207..85644ea2 100644
--- a/applications/welcome/languages/ru.py
+++ b/applications/welcome/languages/ru.py
@@ -27,14 +27,20 @@
'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'административный интерфейс',
'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'appadmin is disabled because insecure channel',
'Are you sure you want to delete this object?': 'Вы уверены, что хотите удалить этот объект?',
'Available Databases and Tables': 'Базы данных и таблицы',
'Buy this book': 'Buy this book',
'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Пустое значение недопустимо',
'Change Password': 'Смените пароль',
'Check to delete': 'Удалить',
'Check to delete:': 'Удалить:',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': 'Client IP',
'Community': 'Community',
'Components and Plugins': 'Components and Plugins',
@@ -45,7 +51,6 @@
'Current session': 'Текущая сессия',
'customize me!': 'настройте внешний вид!',
'data uploaded': 'данные загружены',
-'Database': 'база данных',
'Database': 'Database',
'Database %s select': 'выбор базы данных %s',
'db': 'БД',
@@ -55,6 +60,9 @@
'Deployment Recipes': 'Deployment Recipes',
'Description': 'Описание',
'design': 'дизайн',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Documentation',
"Don't know what to do?": "Don't know what to do?",
'done!': 'готово!',
@@ -86,6 +94,7 @@
'Invalid password': 'Неверный пароль',
'Invalid Query': 'Неверный запрос',
'invalid request': 'неверный запрос',
+'Key': 'Key',
'Last name': 'Фамилия',
'Layout': 'Layout',
'Layout Plugins': 'Layout Plugins',
@@ -99,6 +108,7 @@
'Logout': 'Выход',
'Lost Password': 'Забыли пароль?',
'Lost password?': 'Lost password?',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Menu Model',
'My Sites': 'My Sites',
'Name': 'Name',
@@ -116,8 +126,8 @@
'Other Plugins': 'Other Plugins',
'Other Recipes': 'Other Recipes',
'Overview': 'Overview',
-'password': 'пароль',
'Password': 'Пароль',
+'password': 'пароль',
"Password fields don't match": 'Пароли не совпадают',
'Plugins': 'Plugins',
'Powered by': 'Powered by',
@@ -127,10 +137,14 @@
'Python': 'Python',
'Query:': 'Запрос:',
'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
'Recipes': 'Recipes',
+'Record': 'Record',
'record does not exist': 'запись не найдена',
-'Record id': 'id записи',
'Record ID': 'ID записи',
+'Record id': 'id записи',
'Register': 'Зарегистрироваться',
'Registration identifier': 'Registration identifier',
'Registration key': 'Ключ регистрации',
@@ -141,8 +155,11 @@
'Rows selected': 'Выделено строк',
'Semantic': 'Semantic',
'Services': 'Services',
+'Size of cache:': 'Size of cache:',
'state': 'состояние',
+'Statistics': 'Statistics',
'Stylesheet': 'Stylesheet',
+'submit': 'submit',
'Submit': 'Отправить',
'Support': 'Support',
'Sure you want to delete this object?': 'Подтвердите удаление объекта',
@@ -153,6 +170,7 @@
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
'The Views': 'The Views',
'This App': 'This App',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Отметка времени',
'Twitter': 'Twitter',
'unable to parse csv file': 'нечитаемый csv-файл',
diff --git a/applications/welcome/languages/sk.py b/applications/welcome/languages/sk.py
index 34d34e63..88f8343f 100644
--- a/applications/welcome/languages/sk.py
+++ b/applications/welcome/languages/sk.py
@@ -3,69 +3,154 @@
'!langcode!': 'sk',
'!langname!': 'Slovenský',
'"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 %%{row} deleted': '%s zmazaných záznamov',
'%s %%{row} updated': '%s upravených záznamov',
'%s selected': '%s označených',
+'%Y-%m-%d': '%d.%m.%Y',
+'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
'Administrative interface': 'pre administrátorské rozhranie kliknite sem',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojenia',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'Available Databases and Tables': 'Dostupné databázy a tabuľky',
+'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': 'Nemôže byť prázdne',
'Check to delete': 'Označiť na zmazanie',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': 'Controller',
'Copyright': 'Copyright',
'Current request': 'Aktuálna požiadavka',
'Current response': 'Aktuálna odpoveď',
'Current session': 'Aktuálne sedenie',
+'customize me!': 'prispôsob ma!',
+'data uploaded': 'údaje naplnené',
+'Database': 'databáza',
+'Database %s select': 'databáza %s výber',
+'db': 'db',
'DB Model': 'DB Model',
-'Database': 'Databáza',
'Delete:': 'Zmazať:',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
'Description': 'Popis',
+'design': 'návrh',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
'Documentation': 'Dokumentácia',
+"Don't know what to do?": "Don't know what to do?",
+'done!': 'hotovo!',
+'Download': 'Download',
'Edit': 'Upraviť',
-'Edit Profile': 'Upraviť profil',
'Edit current record': 'Upraviť aktuálny záznam',
+'Edit Profile': 'Upraviť profil',
+'Email and SMS': 'Email and SMS',
+'Errors': 'Errors',
+'export as csv file': 'exportovať do csv súboru',
+'FAQ': 'FAQ',
'First name': 'Krstné meno',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
'Group ID': 'ID skupiny',
+'Groups': 'Groups',
'Hello World': 'Ahoj svet',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
'Import/Export': 'Import/Export',
'Index': 'Index',
+'insert new': 'vložiť nový záznam ',
+'insert new %s': 'vložiť nový záznam %s',
'Internal State': 'Vnútorný stav',
-'Invalid Query': 'Neplatná otázka',
+'Introduction': 'Introduction',
'Invalid email': 'Neplatný email',
'Invalid password': 'Nesprávne heslo',
+'Invalid Query': 'Neplatná otázka',
+'invalid request': 'Neplatná požiadavka',
+'Key': 'Key',
'Last name': 'Priezvisko',
'Layout': 'Layout',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
'Logged in': 'Prihlásený',
'Logged out': 'Odhlásený',
+'login': 'prihlásiť',
+'logout': 'odhlásiť',
'Lost Password': 'Stratené heslo?',
+'lost password?': 'stratené heslo?',
+'Manage Cache': 'Manage Cache',
'Menu Model': 'Menu Model',
+'My Sites': 'My Sites',
'Name': 'Meno',
-'New Record': 'Nový záznam',
'New password': 'Nové heslo',
+'New Record': 'Nový záznam',
+'new record inserted': 'nový záznam bol vložený',
+'next 100 rows': 'ďalších 100 riadkov',
'No databases in this application': 'V tejto aplikácii nie sú databázy',
'Old password': 'Staré heslo',
'Online examples': 'pre online príklady kliknite sem',
+'or import from csv file': 'alebo naimportovať z csv súboru',
'Origin': 'Pôvod',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'password': 'heslo',
'Password': 'Heslo',
+'Plugins': 'Plugins',
'Powered by': 'Powered by',
+'Preface': 'Preface',
+'previous 100 rows': 'predchádzajúcich 100 riadkov',
+'Python': 'Python',
'Query:': 'Otázka:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
+'Record': 'záznam',
+'record does not exist': 'záznam neexistuje',
'Record ID': 'ID záznamu',
+'Record id': 'id záznamu',
'Register': 'Zaregistrovať sa',
+'register': 'registrovať',
'Registration key': 'Registračný kľúč',
'Remember me (for 30 days)': 'Zapamätaj si ma (na 30 dní)',
'Reset Password key': 'Nastaviť registračný kľúč',
'Role': 'Rola',
'Rows in Table': 'riadkov v tabuľke',
'Rows selected': 'označených riadkov',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Size of cache:': 'Size of cache:',
+'state': 'stav',
+'Statistics': 'Statistics',
'Stylesheet': 'Stylesheet',
+'submit': 'submit',
'Submit': 'Odoslať',
+'Support': 'Support',
'Sure you want to delete this object?': 'Ste si istí, že chcete zmazať tento objekt?',
+'Table': 'tabuľka',
'Table name': 'Názov tabuľky',
'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 podmienka ako "db.table1.field1==\'value\'". Niečo ako "db.table1.field1==db.table2.field2" má za výsledok SQL JOIN.',
+'The Core': 'The Core',
'The output of the file is a dictionary that was rendered by the view %s': 'Výstup zo súboru je slovník, ktorý bol zobrazený vo view %s',
+'The Views': 'The Views',
+'This App': 'This App',
'This is a copy of the scaffolding application': 'Toto je kópia skeletu aplikácie',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': 'Časová pečiatka',
+'Twitter': 'Twitter',
+'unable to parse csv file': 'nedá sa načítať csv súbor',
'Update:': 'Upraviť:',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použite (...)&(...) pre AND, (...)|(...) pre OR a ~(...) pre NOT na poskladanie komplexnejších otázok.',
'User %(id)s Logged-in': 'Používateľ %(id)s prihlásený',
@@ -75,38 +160,12 @@
'User %(id)s Registered': 'Používateľ %(id)s sa zaregistroval',
'User ID': 'ID používateľa',
'Verify Password': 'Zopakujte heslo',
+'Videos': 'Videos',
'View': 'Zobraziť',
'Welcome to web2py': 'Vitajte vo web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
'Which called the function %s located in the file %s': 'Ktorý zavolal funkciu %s nachádzajúci sa v súbore %s',
'You are successfully running web2py': 'Úspešne ste spustili web2py',
'You can modify this application and adapt it to your needs': 'Môžete upraviť túto aplikáciu a prispôsobiť ju svojim potrebám',
'You visited the url %s': 'Navštívili ste URL %s',
-'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojenia',
-'cache': 'cache',
-'customize me!': 'prispôsob ma!',
-'data uploaded': 'údaje naplnené',
-'Database': 'databáza',
-'Database %s select': 'databáza %s výber',
-'db': 'db',
-'design': 'návrh',
-'done!': 'hotovo!',
-'export as csv file': 'exportovať do csv súboru',
-'insert new': 'vložiť nový záznam ',
-'insert new %s': 'vložiť nový záznam %s',
-'invalid request': 'Neplatná požiadavka',
-'login': 'prihlásiť',
-'logout': 'odhlásiť',
-'lost password?': 'stratené heslo?',
-'new record inserted': 'nový záznam bol vložený',
-'next 100 rows': 'ďalších 100 riadkov',
-'or import from csv file': 'alebo naimportovať z csv súboru',
-'password': 'heslo',
-'previous 100 rows': 'predchádzajúcich 100 riadkov',
-'Record': 'záznam',
-'record does not exist': 'záznam neexistuje',
-'Record id': 'id záznamu',
-'register': 'registrovať',
-'state': 'stav',
-'Table': 'tabuľka',
-'unable to parse csv file': 'nedá sa načítať csv súbor',
}
diff --git a/applications/welcome/languages/uk.py b/applications/welcome/languages/uk.py
index 4561f5cd..453745c9 100644
--- a/applications/welcome/languages/uk.py
+++ b/applications/welcome/languages/uk.py
@@ -53,12 +53,13 @@
'Components and Plugins': 'Компоненти та втулки',
'Controller': 'Контролер',
'Copyright': 'Правовласник',
+'Created By': 'Створив(ла)',
+'Created On': 'Створено в',
'Current request': 'Поточний запит (current request)',
'Current response': 'Поточна відповідь (current response)',
'Current session': 'Поточна сесія (current session)',
'customize me!': 'причепуріть мене!',
'data uploaded': 'дані завантажено',
-'Database': 'база даних',
'Database': 'База даних',
'Database %s select': 'Вибірка з бази даних %s',
'db': 'база даних',
@@ -108,6 +109,7 @@
'Invalid password': 'Невірний пароль',
'Invalid Query': 'Помилковий запит',
'invalid request': 'хибний запит',
+'Is Active': 'Активна',
'Key': 'Ключ',
'Last name': 'Прізвище',
'Layout': 'Макет (Layout)',
@@ -122,6 +124,8 @@
'Lost password?': 'Забули пароль?',
'Manage Cache': 'Управління кешем',
'Menu Model': 'Модель меню',
+'Modified By': 'Зміни провадив(ла)',
+'Modified On': 'Змінено в',
'My Sites': 'Сайт (усі додатки)',
'Name': "Ім'я",
'New password': 'Новий пароль',
@@ -160,8 +164,8 @@
'Record': 'запис',
'Record %(id)s updated': 'Запис %(id)s змінено',
'record does not exist': 'запису не існує',
-'Record id': 'ід. запису',
'Record ID': 'Ід.запису',
+'Record id': 'ід. запису',
'Record Updated': 'Запис змінено',
'Register': 'Реєстрація',
'Registration identifier': 'Реєстраційний ідентифікатор',
@@ -180,7 +184,7 @@
'state': 'стан',
'Statistics': 'Статистика',
'Stylesheet': 'CSS-стилі',
-'submit': 'submit',
+'submit': 'застосувати',
'Submit': 'Застосувати',
'Support': 'Підтримка',
'Table': 'Таблиця',
diff --git a/applications/welcome/languages/zh.py b/applications/welcome/languages/zh.py
index 30c8a575..8d62a30e 100644
--- a/applications/welcome/languages/zh.py
+++ b/applications/welcome/languages/zh.py
@@ -3,34 +3,50 @@
'!langcode!': 'zh-cn',
'!langname!': '中文',
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"更新" 是選擇性的條件式, 格式就像 "欄位1=\'值\'". 但是 JOIN 的資料不可以使用 update 或是 delete"',
-'%Y-%m-%d': '%Y-%m-%d',
-'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'%s %%{row} deleted': '已刪除 %s 筆',
'%s %%{row} updated': '已更新 %s 筆',
'%s selected': '%s 已選擇',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
'(something like "it-it")': '(格式類似 "zh-tw")',
'A new version of web2py is available': '新版的 web2py 已發行',
'A new version of web2py is available: %s': '新版的 web2py 已發行: %s',
+'about': '關於',
+'About': '關於',
+'About application': '關於本應用程式',
+'Access Control': 'Access Control',
+'Admin is disabled because insecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
+'Admin is disabled because unsecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
+'Administrative Interface': 'Administrative Interface',
+'Administrative interface': '點此處進入管理介面',
+'Administrator Password:': '管理員密碼:',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': '因為來自非安全通道,管理介面關閉',
+'Are you sure you want to delete file "%s"?': '確定要刪除檔案"%s"?',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
+'Are you sure you want to uninstall application "%s"': '確定要移除應用程式 "%s"',
+'Are you sure you want to uninstall application "%s"?': '確定要移除應用程式 "%s"',
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': '注意: 登入管理帳號需要安全連線(HTTPS)或是在本機連線(localhost).',
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': '注意: 因為在測試模式不保證多執行緒安全性,也就是說不可以同時執行多個測試案例',
'ATTENTION: you cannot edit the running application!': '注意:不可編輯正在執行的應用程式!',
-'About': '關於',
-'About application': '關於本應用程式',
-'Admin is disabled because insecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
-'Admin is disabled because unsecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
-'Administrative interface': '點此處進入管理介面',
-'Administrator Password:': '管理員密碼:',
-'Are you sure you want to delete file "%s"?': '確定要刪除檔案"%s"?',
-'Are you sure you want to uninstall application "%s"': '確定要移除應用程式 "%s"',
-'Are you sure you want to uninstall application "%s"?': '確定要移除應用程式 "%s"',
'Authentication': '驗證',
'Available Databases and Tables': '可提供的資料庫和資料表',
+'Buy this book': 'Buy this book',
+'cache': '快取記憶體',
+'Cache': 'Cache',
+'Cache Keys': 'Cache Keys',
'Cannot be empty': '不可空白',
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': '無法編譯:應用程式中含有錯誤,請除錯後再試一次.',
'Change Password': '變更密碼',
+'change password': '變更密碼',
'Check to delete': '打勾代表刪除',
'Check to delete:': '點選以示刪除:',
+'Clear CACHE?': 'Clear CACHE?',
+'Clear DISK': 'Clear DISK',
+'Clear RAM': 'Clear RAM',
'Client IP': '客戶端網址(IP)',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
'Controller': '控件',
'Controllers': '控件',
'Copyright': '版權所有',
@@ -38,64 +54,120 @@
'Current request': '目前網路資料要求(request)',
'Current response': '目前網路資料回應(response)',
'Current session': '目前網路連線資訊(session)',
-'DB Model': '資料庫模組',
-'DESIGN': '設計',
+'customize me!': '請調整我!',
+'data uploaded': '資料已上傳',
'Database': '資料庫',
+'Database %s select': '已選擇 %s 資料庫',
'Date and Time': '日期和時間',
+'db': 'db',
+'DB Model': '資料庫模組',
'Delete': '刪除',
'Delete:': '刪除:',
+'Demo': 'Demo',
'Deploy on Google App Engine': '配置到 Google App Engine',
+'Deployment Recipes': 'Deployment Recipes',
'Description': '描述',
+'DESIGN': '設計',
+'design': '設計',
'Design for': '設計為了',
+'DISK': 'DISK',
+'Disk Cache Keys': 'Disk Cache Keys',
+'Disk Cleared': 'Disk Cleared',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
+'done!': '完成!',
+'Download': 'Download',
'E-mail': '電子郵件',
'EDIT': '編輯',
'Edit': '編輯',
-'Edit Profile': '編輯設定檔',
-'Edit This App': '編輯本應用程式',
'Edit application': '編輯應用程式',
'Edit current record': '編輯當前紀錄',
+'edit profile': '編輯設定檔',
+'Edit Profile': '編輯設定檔',
+'Edit This App': '編輯本應用程式',
'Editing file': '編輯檔案',
'Editing file "%s"': '編輯檔案"%s"',
+'Email and SMS': 'Email and SMS',
'Error logs for "%(app)s"': '"%(app)s"的錯誤紀錄',
+'Errors': 'Errors',
+'export as csv file': '以逗號分隔檔(csv)格式匯出',
+'FAQ': 'FAQ',
'First name': '名',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
'Functions with no doctests will result in [passed] tests.': '沒有 doctests 的函式會顯示 [passed].',
'Group ID': '群組編號',
+'Groups': 'Groups',
'Hello World': '嗨! 世界',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'import': 'import',
'Import/Export': '匯入/匯出',
'Index': '索引',
+'insert new': '插入新資料',
+'insert new %s': '插入新資料 %s',
'Installed applications': '已安裝應用程式',
'Internal State': '內部狀態',
-'Invalid Query': '不合法的查詢',
+'Introduction': 'Introduction',
'Invalid action': '不合法的動作(action)',
'Invalid email': '不合法的電子郵件',
+'Invalid Query': '不合法的查詢',
+'invalid request': '不合法的網路要求(request)',
+'Key': 'Key',
'Language files (static strings) updated': '語言檔已更新',
'Languages': '各國語言',
'Last name': '姓',
'Last saved on:': '最後儲存時間:',
'Layout': '網頁配置',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
'License for': '軟體版權為',
+'Live Chat': 'Live Chat',
+'login': '登入',
'Login': '登入',
'Login to the Administrative Interface': '登入到管理員介面',
+'logout': '登出',
'Logout': '登出',
'Lost Password': '密碼遺忘',
'Main Menu': '主選單',
+'Manage Cache': 'Manage Cache',
'Menu Model': '選單模組(menu)',
'Models': '資料模組',
'Modules': '程式模組',
-'NO': '否',
+'My Sites': 'My Sites',
'Name': '名字',
'New Record': '新紀錄',
+'new record inserted': '已插入新紀錄',
+'next 100 rows': '往後 100 筆',
+'NO': '否',
'No databases in this application': '這應用程式不含資料庫',
'Online examples': '點此處進入線上範例',
+'or import from csv file': '或是從逗號分隔檔(CSV)匯入',
'Origin': '原文',
'Original/Translation': '原文/翻譯',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
'Password': '密碼',
"Password fields don't match": '密碼欄不匹配',
'Peeking at file': '選擇檔案',
+'Plugins': 'Plugins',
'Powered by': '基於以下技術構建:',
+'Preface': 'Preface',
+'previous 100 rows': '往前 100 筆',
+'Python': 'Python',
'Query:': '查詢:',
+'Quick Examples': 'Quick Examples',
+'RAM': 'RAM',
+'RAM Cache Keys': 'RAM Cache Keys',
+'Ram Cleared': 'Ram Cleared',
+'Recipes': 'Recipes',
+'Record': '紀錄',
+'record does not exist': '紀錄不存在',
'Record ID': '紀錄編號',
+'Record id': '紀錄編號',
'Register': '註冊',
+'register': '註冊',
'Registration key': '註冊金鑰',
'Remember me (for 30 days)': '記住我(30 天)',
'Reset Password key': '重設密碼',
@@ -104,26 +176,40 @@
'Rows in Table': '在資料表裏的資料',
'Rows selected': '筆資料被選擇',
'Saved file hash:': '檔案雜湊值已紀錄:',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Size of cache:': 'Size of cache:',
+'state': '狀態',
'Static files': '靜態檔案',
+'Statistics': 'Statistics',
'Stylesheet': '網頁風格檔',
+'submit': 'submit',
'Submit': '傳送',
+'Support': 'Support',
'Sure you want to delete this object?': '確定要刪除此物件?',
+'Table': '資料表',
'Table name': '資料表名稱',
'Testing application': '測試中的應用程式',
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"查詢"是一個像 "db.表1.欄位1==\'值\'" 的條件式. 以"db.表1.欄位1==db.表2.欄位2"方式則相當於執行 JOIN SQL.',
+'The Core': 'The Core',
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
+'The Views': 'The Views',
'There are no controllers': '沒有控件(controllers)',
'There are no models': '沒有資料庫模組(models)',
'There are no modules': '沒有程式模組(modules)',
'There are no static files': '沒有靜態檔案',
'There are no translators, only default language is supported': '沒有翻譯檔,只支援原始語言',
'There are no views': '沒有視圖',
+'This App': 'This App',
'This is the %(filename)s template': '這是%(filename)s檔案的樣板(template)',
'Ticket': '問題單',
+'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
'Timestamp': '時間標記',
+'Twitter': 'Twitter',
'Unable to check for upgrades': '無法做升級檢查',
'Unable to download': '無法下載',
'Unable to download app': '無法下載應用程式',
+'unable to parse csv file': '無法解析逗號分隔檔(csv)',
'Update:': '更新:',
'Upload existing application': '更新存在的應用程式',
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': '使用下列方式來組合更複雜的條件式, (...)&(...) 代表同時存在的條件, (...)|(...) 代表擇一的條件, ~(...)則代表反向條件.',
@@ -131,40 +217,15 @@
'User %(id)s Registered': '使用者 %(id)s 已註冊',
'User ID': '使用者編號',
'Verify Password': '驗證密碼',
+'Videos': 'Videos',
'View': '視圖',
'Views': '視圖',
'Welcome %s': '歡迎 %s',
'Welcome to web2py': '歡迎使用 web2py',
+'Welcome to web2py!': 'Welcome to web2py!',
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
'YES': '是',
+'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 %s': 'You visited the url %s',
-'about': '關於',
-'appadmin is disabled because insecure channel': '因為來自非安全通道,管理介面關閉',
-'cache': '快取記憶體',
-'change password': '變更密碼',
-'customize me!': '請調整我!',
-'data uploaded': '資料已上傳',
-'Database': '資料庫',
-'Database %s select': '已選擇 %s 資料庫',
-'db': 'db',
-'design': '設計',
-'done!': '完成!',
-'edit profile': '編輯設定檔',
-'export as csv file': '以逗號分隔檔(csv)格式匯出',
-'insert new': '插入新資料',
-'insert new %s': '插入新資料 %s',
-'invalid request': '不合法的網路要求(request)',
-'login': '登入',
-'logout': '登出',
-'new record inserted': '已插入新紀錄',
-'next 100 rows': '往後 100 筆',
-'or import from csv file': '或是從逗號分隔檔(CSV)匯入',
-'previous 100 rows': '往前 100 筆',
-'Record': '紀錄',
-'record does not exist': '紀錄不存在',
-'Record id': '紀錄編號',
-'register': '註冊',
-'state': '狀態',
-'Table': '資料表',
-'unable to parse csv file': '無法解析逗號分隔檔(csv)',
}
diff --git a/gluon/cfs.py b/gluon/cfs.py
index d40737b3..358540ca 100644
--- a/gluon/cfs.py
+++ b/gluon/cfs.py
@@ -12,7 +12,7 @@ Functions required to execute app components
FOR INTERNAL USE ONLY
"""
-import os
+from os import stat
import thread
import logging
from fileutils import read_file
@@ -35,7 +35,7 @@ def getcfs(key, filename, filter=None):
This is used on Google App Engine since pyc files cannot be saved.
"""
try:
- t = os.stat(filename).st_mtime
+ t = stat(filename).st_mtime
except OSError:
return filter() if callable(filter) else ''
cfs_lock.acquire()
diff --git a/gluon/languages.py b/gluon/languages.py
index 95be43b6..8c0361f4 100644
--- a/gluon/languages.py
+++ b/gluon/languages.py
@@ -29,15 +29,16 @@ from string import maketrans
__all__ = ['translator', 'findT', 'update_all_languages']
-ospath = os.path
ostat = os.stat
-osep = os.sep
+oslistdir = os.listdir
pjoin = os.path.join
+pexists = os.path.exists
pdirname = os.path.dirname
isdir = os.path.isdir
is_gae = settings.global_settings.web2py_runtime_gae
DEFAULT_LANGUAGE = 'en'
+DEFAULT_LANGUAGE_NAME = 'English'
# DEFAULT PLURAL-FORMS RULES:
# language doesn't use plural forms
@@ -45,23 +46,7 @@ DEFAULT_NPLURALS = 1
# only one singular/plural form is used
DEFAULT_GET_PLURAL_ID = lambda n: 0
# word is unchangeable
-DEFAULT_CONSTRUCTOR_PLURAL_FORM = lambda word, plural_id: word
-
-def safe_eval(text):
- if text.strip():
- try:
- import ast
- return ast.literal_eval(text)
- except ImportError:
- return eval(text,{},{})
- return None
-
-# used as default filter in translator.M()
-def markmin_aux(m):
- return '{%s}' % markmin_escape(m.group('s'))
-def markmin(s):
- return render(regex_param.sub(markmin_aux,s),
- sep='br', autolinks=None, id_prefix='')
+DEFAULT_CONSTRUCT_PLURAL_FORM = lambda word, plural_id: word
NUMBERS = (int,long,float)
@@ -75,14 +60,30 @@ regex_translate = re.compile(PY_STRING_LITERAL_RE, re.DOTALL)
regex_param=re.compile(r'{(?P.+?)}')
# pattern for a valid accept_language
-
regex_language = \
- re.compile('^([a-zA-Z]{2})(\-[a-zA-Z]{2})?(\-[a-zA-Z]+)?$')
-regex_langfile = re.compile('^[a-zA-Z]{2}(-[a-zA-Z]{2})?\.py$')
+ re.compile('([a-z]{2}(?:\-[a-z]{2})?(?:\-[a-z]{2})?)(?:[,;]|$)')
+regex_langfile = re.compile('^[a-z]{2}(-[a-z]{2})?\.py$')
regex_backslash = re.compile(r"\\([\\{}%])")
regex_plural = re.compile('%({.+?})')
regex_plural_dict = re.compile('^{(?P[^()[\]][^()[\]]*?)\((?P[^()\[\]]+)\)}$') # %%{word(varname or number)}
regex_plural_tuple = re.compile('^{(?P[^[\]()]+)(?:\[(?P\d+)\])?}$') # %%{word[index]} or %%{word}
+regex_plural_file = re.compile('^plural-[a-zA-Z]{2}(-[a-zA-Z]{2})?\.py$')
+
+def safe_eval(text):
+ if text.strip():
+ try:
+ import ast
+ return ast.literal_eval(text)
+ except ImportError:
+ return eval(text,{},{})
+ return None
+
+# used as default filter in translator.M()
+def markmin(s):
+ def markmin_aux(m):
+ return '{%s}' % markmin_escape(m.group('s'))
+ return render(regex_param.sub(markmin_aux,s),
+ sep='br', autolinks=None, id_prefix='')
# UTF8 helper functions
def upper_fun(s):
@@ -90,7 +91,7 @@ def upper_fun(s):
def title_fun(s):
return unicode(s,'utf-8').title().encode('utf-8')
def cap_fun(s):
- return lambda s: unicode(s,'utf-8').capitalize().encode('utf-8')
+ return unicode(s,'utf-8').capitalize().encode('utf-8')
ttab_in = maketrans("\\%{}", '\x1c\x1d\x1e\x1f')
ttab_out = maketrans('\x1c\x1d\x1e\x1f', "\\%{}")
@@ -132,38 +133,6 @@ def clear_cache(filename):
finally:
lock.release()
-def lang_sampling(lang_tuple, langlist):
- """
- search *lang_tuple* in *langlist*
-
- Args:
- lang_tuple (tuple of strings): ('aa'[[,'-bb'],'-cc'])
- langlist (list of strings): [available languages]
-
- Returns:
- language from langlist or None
- """
- # step 1:
- # compare "aa-bb-cc" | "aa-bb" | "aa" from lang_tuple
- # with strings from langlist. Return appropriate string
- # from langlist:
- tries = range(len(lang_tuple),0,-1)
- for i in tries:
- language="".join(lang_tuple[:i])
- if language in langlist:
- return language
- # step 2 (if not found in step 1):
- # compare "aa-bb-cc" | "aa-bb" | "aa" from lang_tuple
- # with left part of a string from langlist. Return
- # appropriate string from langlist
- for i in tries:
- lang="".join(lang_tuple[:i])
- for language in langlist:
- if language.startswith(lang):
- return language
- return None
-
-
def read_dict_aux(filename):
lang_text = portalocker.read_locked(filename).replace('\r\n', '\n')
clear_cache(filename)
@@ -175,57 +144,24 @@ def read_dict_aux(filename):
return {'__corrupted__':status}
def read_dict(filename):
- """
- return dictionary with translation messages
+ """ return dictionary with translation messages
"""
return getcfs('lang:'+filename, filename,
lambda: read_dict_aux(filename))
-def get_lang_info(lang, langdir):
- """
- retrieve lang information from *langdir*/*lang*.py file.
- Read few strings from lang.py file until keys !langname!,
- !langcode! or keys greater then '!*' were found
-
- args:
- lang (str): lang-code or 'default'
- langdir (str): path to 'languages' directory in web2py app dir
-
- returns:
- tuple(langcode, langname, langfile_mtime)
- e.g.: ('en', 'English', 1338549043.0)
- """
- filename = ospath.join(langdir, lang+'.py')
- d = read_dict(filename)
- langcode = d.get('!langcode!',DEFAULT_LANGUAGE)
- langname = d.get('!langname!',langcode)
- return (langcode, langname or langcode, ostat(filename).st_mtime)
-
-def read_possible_languages(appdir):
- langs = {}
- # scan languages directory for langfiles:
- langdir = ospath.join(appdir,'languages')
- for filename in os.listdir(langdir):
- if regex_langfile.match(filename) or filename=='default.py':
- lang = filename[:-3]
- langs[lang] = get_lang_info(lang, langdir)
- if not 'en' in langs:
- # if default.py is not found, add default value:
- langs['en'] = ('en', 'English', 0)
- return langs
-
-def read_possible_plurals():
+def read_possible_plural_rules():
"""
create list of all possible plural rules files
- result is cached to increase speed
+ result is cached in PLURAL_RULES dictionary to increase speed
"""
- plurals = {}
try:
- import contrib.plural_rules as package
+ import gluon.contrib.plural_rules as package
+ plurals = {}
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
if len(modname)==2:
- module = __import__(package.__name__+'.'+modname)
+ module = __import__(package.__name__+'.'+modname,
+ fromlist=[modname])
lang = modname
pname = modname+'.py'
nplurals = getattr(module,'nplurals', DEFAULT_NPLURALS)
@@ -234,19 +170,84 @@ def read_possible_plurals():
DEFAULT_GET_PLURAL_ID)
construct_plural_form = getattr(
module,'construct_plural_form',
- DEFAULT_CONSTRUCTOR_PLURAL_FORM)
+ DEFAULT_CONSTRUCT_PLURAL_FORM)
plurals[lang] = (lang, nplurals, get_plural_id,
- construct_plural_form, pname)
- except ImportError:
- logging.warn('Unable to import plural rules')
- plurals['default'] = ('default',
- DEFAULT_NPLURALS,
- DEFAULT_GET_PLURAL_ID,
- DEFAULT_CONSTRUCTOR_PLURAL_FORM,
- None)
+ construct_plural_form)
+ except ImportError, e:
+ logging.warn('Unable to import plural rules: %s' % e)
return plurals
-PLURAL_RULES = read_possible_plurals()
+PLURAL_RULES = read_possible_plural_rules()
+
+def read_possible_languages_aux(langdir):
+ def get_lang_struct(lang, langcode, langname, langfile_mtime):
+ if lang == 'default':
+ real_lang = langcode.lower()
+ else:
+ real_lang = lang
+ (prules_langcode,
+ nplurals,
+ get_plural_id,
+ construct_plural_form
+ ) = PLURAL_RULES.get(real_lang[:2],('default',
+ DEFAULT_NPLURALS,
+ DEFAULT_GET_PLURAL_ID,
+ DEFAULT_CONSTRUCT_PLURAL_FORM))
+ if prules_langcode != 'default':
+ (pluraldict_fname,
+ pluraldict_mtime) = plurals.get(real_lang,
+ plurals.get(real_lang[:2],
+ ('plural-%s.py'%real_lang,0)))
+ else:
+ pluraldict_fname = None
+ pluraldict_mtime = 0
+ return (langcode, # language code from !langcode!
+ langname, # language name in national spelling from !langname!
+ langfile_mtime, # m_time of language file
+ pluraldict_fname,# name of plural dictionary file or None (when default.py is not exist)
+ pluraldict_mtime,# m_time of plural dictionary file or 0 if file is not exist
+ prules_langcode, # code of plural rules language or 'default'
+ nplurals, # nplurals for current language
+ get_plural_id, # get_plural_id() for current language
+ construct_plural_form) # construct_plural_form() for current language
+
+ plurals = {}
+ flist = oslistdir(langdir)
+ # scan languages directory for plural dict files:
+ for pname in flist:
+ if regex_plural_file.match(pname):
+ plurals[pname[7:-3]] = (pname,
+ ostat(pjoin(langdir,pname)).st_mtime)
+ langs = {}
+ # scan languages directory for langfiles:
+ for fname in flist:
+ if regex_langfile.match(fname) or fname == 'default.py':
+ fname_with_path = pjoin(langdir,fname)
+ d = read_dict(fname_with_path)
+ lang = fname[:-3]
+ langcode = d.get('!langcode!', lang if lang != 'default'
+ else DEFAULT_LANGUAGE)
+ langname = d.get('!langname!',langcode)
+ langfile_mtime = ostat(fname_with_path).st_mtime
+ langs[lang] = get_lang_struct(lang, langcode,
+ langname, langfile_mtime)
+ if 'default' not in langs:
+ # if default.py is not found,
+ # add DEFAULT_LANGUAGE as default language:
+ langs['default'] = get_lang_struct('default', DEFAULT_LANGUAGE,
+ DEFAULT_LANGUAGE_NAME, 0)
+ deflang = langs['default']
+ deflangcode = deflang[0]
+ if deflangcode not in langs:
+ # create language from default.py:
+ langs[deflangcode] = deflang[:2]+(0,)+deflang[3:]
+
+ return langs
+
+def read_possible_languages(appdir):
+ langdir = pjoin(appdir,'languages')
+ return getcfs('langs:'+langdir, langdir,
+ lambda: read_possible_languages_aux(langdir))
def read_plural_dict_aux(filename):
lang_text = portalocker.read_locked(filename).replace('\r\n', '\n')
@@ -401,42 +402,81 @@ class translator(object):
T(\"Hello World\") # translates \"Hello World\" using the selected file
notice 1: there is no need to force since, by default, T uses
- http_accept_language to determine a translation file.
+ http_accept_language to determine a translation file.
notice 2:
en and en-en are considered different languages!
notice 3:
if language xx-yy is not found force() probes other similar
- languages using such algorithm:
+ languages using such algorithm:
xx-yy.py -> xx.py -> xx-yy*.py -> xx*.py
"""
def __init__(self, request):
self.request = request
self.folder = request.folder
- self.langpath = ospath.join(self.folder,'languages')
- self.filenames = set(os.listdir(self.langpath))
+ self.langpath = pjoin(self.folder, 'languages')
self.http_accept_language = request.env.http_accept_language
- # self.cache # filled in self.force()
- # self.accepted_language = None # filled in self.force()
- # self.language_file = None # filled in self.force()
- # self.plural_language = None # filled in self.force()
- # self.nplurals = None # filled in self.force()
- # self.get_plural_id = None # filled in self.force()
- # self.construct_plural_form = None # filled in self.force()
- # self.plural_rules_file = None # filled in self.force()
- # self.plural_file = None # filled in self.force()
- # self.plural_dict = None # filled in self.force()
- # self.plural_status = None # filled in self.force()
- self.requested_languages = \
- self.force(self.http_accept_language)
+ # filled in self.force():
+ #------------------------
+ # self.cache
+ # self.accepted_language
+ # self.language_file
+ # self.plural_language
+ # self.nplurals
+ # self.get_plural_id
+ # self.construct_plural_form
+ # self.plural_file
+ # self.plural_dict
+ # self.requested_languages
+ #----------------------------------------
+ # filled in self.set_current_languages():
+ #----------------------------------------
+ # self.default_language_file
+ # self.default_t
+ # self.current_languages
+ self.set_current_languages()
self.lazy = True
self.otherTs = {}
self.filter = markmin
self.ftag = 'markmin'
+ def get_possible_languages_info(self, lang=None):
+ """
+ return info for selected language or dictionary with all
+ possible languages info from APP/languages/*.py
+ args:
+ *lang* (str): language
+ returns:
+ if *lang* is defined:
+ return tuple(langcode, langname, langfile_mtime,
+ pluraldict_fname, pluraldict_mtime,
+ prules_langcode, nplurals,
+ get_plural_id, construct_plural_form)
+ or None
+
+ if *lang* is NOT defined:
+ returns dictionary with all possible languages:
+ { langcode(from filename):
+ ( langcode, # language code from !langcode!
+ langname, # language name in national spelling from !langname!
+ langfile_mtime, # m_time of language file
+ pluraldict_fname,# name of plural dictionary file or None (when default.py is not exist)
+ pluraldict_mtime,# m_time of plural dictionary file or 0 if file is not exist
+ prules_langcode, # code of plural rules language or 'default'
+ nplurals, # nplurals for current language
+ get_plural_id, # get_plural_id() for current language
+ construct_plural_form) # construct_plural_form() for current language
+ }
+ """
+ info = read_possible_languages(self.folder)
+ if lang: info = info.get(lang)
+ return info
+
def get_possible_languages(self):
- return [lang[:-3] for lang in self.filenames \
- if regex_langfile.match(lang)]
+ """ get list of all possible languages for current applications """
+ return list(set(self.current_languages +
+ [lang for lang in read_possible_languages(self.folder).iterkeys()
+ if lang != 'default']))
def set_current_languages(self, *languages):
"""
@@ -447,38 +487,30 @@ class translator(object):
if len(languages) == 1 and isinstance(
languages[0], (tuple, list)):
languages = languages[0]
- self.current_languages = languages
+ if not languages or languages[0] is None:
+ # set default language from default.py/DEFAULT_LANGUAGE
+ pl_info = self.get_possible_languages_info('default')
+ if pl_info[2]==0: # langfile_mtime
+ # if languages/default.py is not found
+ self.default_language_file = self.langpath
+ self.default_t = {}
+ self.current_languages = [DEFAULT_LANGUAGE]
+ else:
+ self.default_language_file = pjoin(self.langpath,
+ 'default.py')
+ self.default_t = read_dict(self.default_language_file)
+ self.current_languages = [pl_info[0]] # !langcode!
+ else:
+ self.current_languages = list(languages)
self.force(self.http_accept_language)
- def set_plural(self, language):
- """
- initialize plural forms subsystem
- invoked from self.force()
- """
- lang = language[:2]
- (self.plural_language,
- self.nplurals,
- self.get_plural_id,
- self.construct_plural_form,
- self.plural_filename
- ) = PLURAL_RULES.get(language,PLURAL_RULES['default'])
- for lang in (language, language[:5], language[:2]):
- filename = 'plural-%s.py' % lang
- if filename in self.filenames:
- self.plural_file = ospath.join(self.langpath,filename)
- self.plural_dict = read_plural_dict(self.plural_file)
- break
- else:
- self.plural_file = None
- self.plural_dict = {}
-
+
def plural(self, word, n):
- """
- get plural form of word for number *n*
- NOTE: *word* MUST be defined in current language
+ """ get plural form of word for number *n*
+ NOTE: *word" MUST be defined in current language
(T.accepted_language)
- invoked from T()/M() in %%{} tag
+ invoked from T()/T.M() in %%{} tag
args:
word (str): word in singular
n (numeric): number plural form created for
@@ -486,51 +518,34 @@ class translator(object):
returns:
(str): word in appropriate singular/plural form
"""
- nplurals = self.nplurals
- if int(n)==1:
+ if int(n) == 1:
return word
elif word:
id = self.get_plural_id(abs(int(n)))
- # id = 0 first plural form
- # id = 1 second plural form
+ # id = 0 singular form
+ # id = 1 first plural form
+ # id = 2 second plural form
# etc.
- forms = self.plural_dict.get(word, [])
- if len(forms)>=id:
- # have this plural form
- return forms[id-1]
- else:
- # guessing this plural form
- forms += ['']*(nplurals-len(forms)-1)
- form = self.construct_plural_form(word, id)
- forms[id-1] = form
- self.plural_dict[word] = forms
- if self.plural_file and not is_gae:
- write_plural_dict(self.plural_file,
- self.plural_dict)
- return form
-
- def get_possible_languages_info(self, lang=None):
- """
- return info for selected language or dictionary with all
- possible languages info from APP/languages/*.py
- args:
- *lang* (str): language
- returns:
- if *lang* is defined:
- return tuple(langcode, langname, langfile_mtime) or None
-
- if *lang* is NOT defined:
- returns dictionary with all possible languages:
- { langcode(from filename): ( langcode(from !langcode! key),
- langname(from !langname! key),
- langfile_mtime ) }
- """
- info = read_possible_languages(self.folder)
- if lang: info = info.get(lang)
- return info
+ if id != 0:
+ forms = self.plural_dict.get(word, [])
+ if len(forms)>=id:
+ # have this plural form:
+ return forms[id-1]
+ else:
+ # guessing this plural form
+ forms += ['']*(self.nplurals-len(forms)-1)
+ form = self.construct_plural_form(word, id)
+ forms[id-1] = form
+ self.plural_dict[word] = forms
+ if self.plural_file and not is_gae:
+ write_plural_dict(self.plural_file,
+ self.plural_dict)
+ return form
+ return word
def force(self, *languages):
"""
+
select language(s) for translation
if a list of languages is passed as a parameter,
@@ -541,41 +556,76 @@ class translator(object):
default language will be selected if none
of them matches possible_languages.
"""
+ pl_info = read_possible_languages(self.folder)
+ def set_plural(language):
+ """
+ initialize plural forms subsystem
+ """
+ lang_info = pl_info.get(language)
+ if lang_info:
+ (pname,
+ pmtime,
+ self.plural_language,
+ self.nplurals,
+ self.get_plural_id,
+ self.construct_plural_form
+ ) = lang_info[3:]
+ pdict = {}
+ if pname:
+ pname = pjoin(self.langpath, pname)
+ if pmtime != 0:
+ pdict = read_plural_dict(pname)
+ self.plural_file = pname
+ self.plural_dict = pdict
+ else:
+ self.plural_language = 'default'
+ self.nplurals = DEFAULT_NPLURALS
+ self.get_plural_id = DEFAULT_GET_PLURAL_ID
+ self.construct_plural_form = DEFAULT_CONSTRUCT_PLURAL_FORM
+ self.plural_file = None
+ self.plural_dict = {}
language = ''
- if isinstance(languages,str):
- languages = regex_language.findall(languages.lower())
+ if len(languages)==1 and isinstance(languages[0],str):
+ languages = regex_language.findall(languages[0].lower())
elif not languages or languages[0] is None:
languages = []
- for lang in languages:
- if lang+'.py' in self.filenames:
- language = lang
- langfile = language+'.py'
- break
- elif len(lang)>5 and lang[:5]+'.py' in self.filenames:
- language = lang[:5]
- langfile = language+'.py'
- break
- elif len(lang)>2 and lang[:2]+'.py' in self.filenames:
- language = lang[:2]
- langfile = language+'.py'
- break
- else:
- if 'default.py' in self.filenames:
- language = DEFAULT_LANGUAGE
- langfile = 'default.py'
- else:
- language = DEFAULT_LANGUAGE
- langfile = None
- self.accepted_language = language
- if langfile:
- self.language_file = ospath.join(self.langpath,langfile)
- self.t = read_dict(self.language_file)
- else:
- self.language_file = None
- self.t = {}
- self.cache = global_language_cache.setdefault(
- self.language_file,({},allocate_lock()))
- self.set_plural(language)
+ self.requested_languages = languages = tuple(languages)
+ if languages:
+ all_languages = set(lang for lang in pl_info.iterkeys()
+ if lang != 'default') \
+ | set(self.current_languages)
+ for lang in languages:
+ # compare "aa-bb" | "aa" from *language* parameter
+ # with strings from langlist using such alghorythm:
+ # xx-yy.py -> xx.py -> xx*.py
+ lang5 = lang[:5]
+ if lang5 in all_languages:
+ language = lang5
+ else:
+ lang2 = lang[:2]
+ if len(lang5)>2 and lang2 in all_languages:
+ language = lang2
+ else:
+ for l in all_languages:
+ if l[:2]==lang2:
+ language = l
+ if language:
+ if language in self.current_languages:
+ break
+ self.language_file = pjoin(self.langpath, language+'.py')
+ self.t = read_dict(self.language_file)
+ self.cache = global_language_cache.setdefault(
+ self.language_file,
+ ({},allocate_lock()))
+ set_plural(language)
+ self.accepted_language = language
+ return languages
+ self.accepted_language = language or self.current_languages[0]
+ self.language_file = self.default_language_file
+ self.cache = global_language_cache.setdefault(self.language_file,
+ ({}, allocate_lock()))
+ self.t = self.default_t
+ set_plural(self.accepted_language)
return languages
def __call__(self, message, symbols={}, language=None, lazy=None):
@@ -661,20 +711,18 @@ class translator(object):
"""
key = prefix+message
mt = self.t.get(key, None)
- if mt is None:
- # we did not find a translation
- if message.find('##')>0 and not '\n' in message:
- # remove comments
- message = message.rsplit('##', 1)[0]
- # guess translation same as original
- self.t[key] = mt = message
- # update language file for later translation
- if self.language_file and not is_gae:
- write_dict(self.language_file, self.t)
- # fix backslash escaping
- mt = regex_backslash.sub(
- lambda m: m.group(1).translate(ttab_in), mt)
- return mt
+ if mt is not None: return mt
+ # we did not find a translation
+ if message.find('##')>0 and not '\n' in message:
+ # remove comments
+ message = message.rsplit('##', 1)[0]
+ # guess translation same as original
+ self.t[key] = mt = self.default_t.get(key, message)
+ # update language file for latter translation
+ if self.language_file != self.default_language_file and not is_gae:
+ write_dict(self.language_file, self.t)
+ return regex_backslash.sub(
+ lambda m: m.group(1).translate(ttab_in), mt)
def params_substitution(self, message, symbols):
"""
@@ -796,16 +844,16 @@ class translator(object):
message = self.params_substitution(message, symbols)
return message.translate(ttab_out)
-def findT(path, language='en'):
+def findT(path, language=DEFAULT_LANGUAGE):
"""
must be run by the admin app
"""
- lang_file = ospath.join(path, 'languages', language + '.py')
+ lang_file = pjoin(path, 'languages', language + '.py')
sentences = read_dict(lang_file)
- mp = ospath.join(path, 'models')
- cp = ospath.join(path, 'controllers')
- vp = ospath.join(path, 'views')
- mop = ospath.join(path, 'modules')
+ mp = pjoin(path, 'models')
+ cp = pjoin(path, 'controllers')
+ vp = pjoin(path, 'views')
+ mop = pjoin(path, 'modules')
for filename in \
listdir(mp, '^.+\.py$', 0)+listdir(cp, '^.+\.py$', 0)\
+listdir(vp, '^.+\.html$', 0)+listdir(mop, '^.+\.py$', 0):
@@ -827,10 +875,10 @@ def findT(path, language='en'):
sentences[message] = message
if not '!langcode!' in sentences:
sentences['!langcode!'] = (
- 'en' if language in ('default', 'en') else language)
+ DEFAULT_LANGUAGE if language in ('default', DEFAULT_LANGUAGE) else language)
if not '!langname!' in sentences:
sentences['!langname!'] = (
- 'English' if language in ('default', 'en')
+ DEFAULT_LANGUAGE_NAME if language in ('default', DEFAULT_LANGUAGE)
else sentences['!langcode!'])
write_dict(lang_file, sentences)
@@ -843,9 +891,10 @@ copy_reg.pickle(lazyT, lazyT_pickle, lazyT_unpickle)
def update_all_languages(application_path):
- path = ospath.join(application_path, 'languages/')
- for language in listdir(path, regex_langfile):
- findT(application_path, language[:-3])
+ path = pjoin(application_path, 'languages/')
+ for language in oslistdir(path):
+ if regex_langfile.match(language):
+ findT(application_path, language[:-3])
if __name__ == '__main__':