From 9182e7a882c90ff85ce22fbe5f1c0b387ae8d0ab Mon Sep 17 00:00:00 2001 From: mdipierro Date: Tue, 11 Sep 2012 13:37:16 -0500 Subject: [PATCH] better languages.py, thanks Vladyslav --- VERSION | 2 +- applications/admin/controllers/default.py | 38 +- applications/admin/languages/uk.py | 3 + applications/admin/views/default/design.html | 29 +- applications/welcome/languages/cs.py | 134 +++-- applications/welcome/languages/es.py | 312 ++++++----- applications/welcome/languages/fr-ca.py | 111 ++-- applications/welcome/languages/fr.py | 25 +- applications/welcome/languages/hi.py | 148 +++-- applications/welcome/languages/hu.py | 170 ++++-- applications/welcome/languages/it.py | 8 + applications/welcome/languages/nl.py | 6 +- applications/welcome/languages/pl.py | 186 ++++--- applications/welcome/languages/pt-br.py | 98 ++-- applications/welcome/languages/pt.py | 175 ++++-- applications/welcome/languages/ro.py | 18 +- applications/welcome/languages/ru.py | 24 +- applications/welcome/languages/sk.py | 127 +++-- applications/welcome/languages/uk.py | 10 +- applications/welcome/languages/zh.py | 153 ++++-- gluon/cfs.py | 4 +- gluon/languages.py | 541 ++++++++++--------- 22 files changed, 1474 insertions(+), 848 deletions(-) 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('.','__')}} {{pass}}
@@ -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}}
{{=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__':