Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

initial commit

  • Loading branch information...
commit 5a78edad03160fff97836b8a8d93d185b34d378d 0 parents
@mdipierro authored
Showing with 23,909 additions and 0 deletions.
  1. +2 −0  ABOUT
  2. +4 −0 LICENSE
  3. 0  __init__.py
  4. +442 −0 controllers/appadmin.py
  5. +130 −0 controllers/default.py
  6. +1 −0  cron/crontab
  7. +1 −0  cron/crontab.example
  8. +131 −0 languages/cs.py
  9. +122 −0 languages/default.py
  10. +260 −0 languages/es.py
  11. +168 −0 languages/fr-ca.py
  12. +168 −0 languages/fr.py
  13. +87 −0 languages/hi.py
  14. +98 −0 languages/hu.py
  15. +188 −0 languages/it.py
  16. +376 −0 languages/nl.py
  17. +109 −0 languages/pl.py
  18. +14 −0 languages/plural-en.py
  19. +16 −0 languages/plural-ru.py
  20. +17 −0 languages/plural-uk.py
  21. +142 −0 languages/pt-br.py
  22. +121 −0 languages/pt.py
  23. +359 −0 languages/ro.py
  24. +177 −0 languages/ru.py
  25. +112 −0 languages/sk.py
  26. +216 −0 languages/uk.py
  27. +170 −0 languages/zh.py
  28. +1 −0  modules/__init__.py
  29. +13 −0 progress.log
  30. +40 −0 routes.example.py
  31. +19 −0 sources/29-web2py-english/00.markmin
  32. +552 −0 sources/29-web2py-english/01.markmin
  33. +1,006 −0 sources/29-web2py-english/02.markmin
  34. +1,482 −0 sources/29-web2py-english/03.markmin
  35. +2,412 −0 sources/29-web2py-english/04.markmin
  36. +1,796 −0 sources/29-web2py-english/05.markmin
  37. +2,842 −0 sources/29-web2py-english/06.markmin
  38. +2,422 −0 sources/29-web2py-english/07.markmin
  39. +268 −0 sources/29-web2py-english/08.markmin
  40. +1,409 −0 sources/29-web2py-english/09.markmin
  41. +1,359 −0 sources/29-web2py-english/10.markmin
  42. +582 −0 sources/29-web2py-english/11.markmin
  43. +1,135 −0 sources/29-web2py-english/12.markmin
  44. +1,470 −0 sources/29-web2py-english/13.markmin
  45. +508 −0 sources/29-web2py-english/14.markmin
  46. +15 −0 sources/29-web2py-english/chapters.txt
  47. BIN  sources/29-web2py-english/images/en0.png
  48. BIN  sources/29-web2py-english/images/en100.png
  49. BIN  sources/29-web2py-english/images/en1000.png
  50. BIN  sources/29-web2py-english/images/en10000.png
  51. BIN  sources/29-web2py-english/images/en10100.png
  52. BIN  sources/29-web2py-english/images/en10200.png
  53. BIN  sources/29-web2py-english/images/en10300.png
  54. BIN  sources/29-web2py-english/images/en10400.png
  55. BIN  sources/29-web2py-english/images/en10500.png
  56. BIN  sources/29-web2py-english/images/en10600.png
  57. BIN  sources/29-web2py-english/images/en10700.png
  58. BIN  sources/29-web2py-english/images/en10800.png
  59. BIN  sources/29-web2py-english/images/en10900.png
  60. BIN  sources/29-web2py-english/images/en1100.png
  61. BIN  sources/29-web2py-english/images/en11000.png
  62. BIN  sources/29-web2py-english/images/en11100.png
  63. BIN  sources/29-web2py-english/images/en11200.png
  64. BIN  sources/29-web2py-english/images/en11300.png
  65. BIN  sources/29-web2py-english/images/en11400.png
  66. BIN  sources/29-web2py-english/images/en11500.png
  67. BIN  sources/29-web2py-english/images/en11600.png
  68. BIN  sources/29-web2py-english/images/en11700.png
  69. BIN  sources/29-web2py-english/images/en11800.png
  70. BIN  sources/29-web2py-english/images/en11900.png
  71. BIN  sources/29-web2py-english/images/en1200.png
  72. BIN  sources/29-web2py-english/images/en12000.png
  73. BIN  sources/29-web2py-english/images/en12100.png
  74. BIN  sources/29-web2py-english/images/en12200.png
  75. BIN  sources/29-web2py-english/images/en12300.png
  76. BIN  sources/29-web2py-english/images/en12400.png
  77. BIN  sources/29-web2py-english/images/en12500.png
  78. BIN  sources/29-web2py-english/images/en12600.png
  79. BIN  sources/29-web2py-english/images/en12700.png
  80. BIN  sources/29-web2py-english/images/en12800.png
  81. BIN  sources/29-web2py-english/images/en12900.png
  82. BIN  sources/29-web2py-english/images/en1300.png
  83. BIN  sources/29-web2py-english/images/en13000.png
  84. BIN  sources/29-web2py-english/images/en13100.png
  85. BIN  sources/29-web2py-english/images/en13200.png
  86. BIN  sources/29-web2py-english/images/en13300.png
  87. BIN  sources/29-web2py-english/images/en13400.png
  88. BIN  sources/29-web2py-english/images/en13500.png
  89. BIN  sources/29-web2py-english/images/en13600.png
  90. BIN  sources/29-web2py-english/images/en13700.png
  91. BIN  sources/29-web2py-english/images/en13800.png
  92. BIN  sources/29-web2py-english/images/en13900.png
  93. BIN  sources/29-web2py-english/images/en1400.png
  94. BIN  sources/29-web2py-english/images/en14000.png
  95. BIN  sources/29-web2py-english/images/en14100.png
  96. BIN  sources/29-web2py-english/images/en14200.png
  97. BIN  sources/29-web2py-english/images/en14300.png
  98. BIN  sources/29-web2py-english/images/en14400.png
  99. BIN  sources/29-web2py-english/images/en14500.png
  100. BIN  sources/29-web2py-english/images/en14600.png
  101. BIN  sources/29-web2py-english/images/en14700.png
  102. BIN  sources/29-web2py-english/images/en14800.png
  103. BIN  sources/29-web2py-english/images/en14900.png
  104. BIN  sources/29-web2py-english/images/en1500.png
  105. BIN  sources/29-web2py-english/images/en15000.png
  106. BIN  sources/29-web2py-english/images/en15100.png
  107. BIN  sources/29-web2py-english/images/en15200.png
  108. BIN  sources/29-web2py-english/images/en15300.png
  109. BIN  sources/29-web2py-english/images/en15400.png
  110. BIN  sources/29-web2py-english/images/en15500.png
  111. BIN  sources/29-web2py-english/images/en15600.png
  112. BIN  sources/29-web2py-english/images/en15700.png
  113. BIN  sources/29-web2py-english/images/en15800.png
  114. BIN  sources/29-web2py-english/images/en15900.png
  115. BIN  sources/29-web2py-english/images/en1600.png
  116. BIN  sources/29-web2py-english/images/en16000.png
  117. BIN  sources/29-web2py-english/images/en16100.png
  118. BIN  sources/29-web2py-english/images/en1700.png
  119. BIN  sources/29-web2py-english/images/en1800.png
  120. BIN  sources/29-web2py-english/images/en1900.png
  121. BIN  sources/29-web2py-english/images/en200.png
  122. BIN  sources/29-web2py-english/images/en2000.png
  123. BIN  sources/29-web2py-english/images/en2100.png
  124. BIN  sources/29-web2py-english/images/en2200.png
  125. BIN  sources/29-web2py-english/images/en2300.png
  126. BIN  sources/29-web2py-english/images/en2400.png
  127. BIN  sources/29-web2py-english/images/en2500.png
  128. BIN  sources/29-web2py-english/images/en2600.png
  129. BIN  sources/29-web2py-english/images/en2700.png
  130. BIN  sources/29-web2py-english/images/en2800.png
  131. BIN  sources/29-web2py-english/images/en2900.png
  132. BIN  sources/29-web2py-english/images/en300.png
  133. BIN  sources/29-web2py-english/images/en3000.png
  134. BIN  sources/29-web2py-english/images/en3100.png
  135. BIN  sources/29-web2py-english/images/en3200.png
  136. BIN  sources/29-web2py-english/images/en3300.png
  137. BIN  sources/29-web2py-english/images/en3400.png
  138. BIN  sources/29-web2py-english/images/en3500.png
  139. BIN  sources/29-web2py-english/images/en3600.png
  140. BIN  sources/29-web2py-english/images/en3700.png
  141. BIN  sources/29-web2py-english/images/en3800.png
  142. BIN  sources/29-web2py-english/images/en3900.png
  143. BIN  sources/29-web2py-english/images/en400.png
  144. BIN  sources/29-web2py-english/images/en4000.png
  145. BIN  sources/29-web2py-english/images/en4100.png
  146. BIN  sources/29-web2py-english/images/en4200.png
  147. BIN  sources/29-web2py-english/images/en4300.png
  148. BIN  sources/29-web2py-english/images/en4400.png
  149. BIN  sources/29-web2py-english/images/en4500.png
  150. BIN  sources/29-web2py-english/images/en4600.png
  151. BIN  sources/29-web2py-english/images/en4700.png
  152. BIN  sources/29-web2py-english/images/en4800.png
  153. BIN  sources/29-web2py-english/images/en4900.png
  154. BIN  sources/29-web2py-english/images/en500.png
  155. BIN  sources/29-web2py-english/images/en5000.png
  156. BIN  sources/29-web2py-english/images/en5100.png
  157. BIN  sources/29-web2py-english/images/en5200.png
  158. BIN  sources/29-web2py-english/images/en5300.png
  159. BIN  sources/29-web2py-english/images/en5400.png
  160. BIN  sources/29-web2py-english/images/en5500.png
  161. BIN  sources/29-web2py-english/images/en5600.png
  162. BIN  sources/29-web2py-english/images/en5700.png
  163. BIN  sources/29-web2py-english/images/en5800.png
  164. BIN  sources/29-web2py-english/images/en5900.png
  165. BIN  sources/29-web2py-english/images/en600.png
  166. BIN  sources/29-web2py-english/images/en6000.png
  167. BIN  sources/29-web2py-english/images/en6100.png
  168. BIN  sources/29-web2py-english/images/en6200.png
  169. BIN  sources/29-web2py-english/images/en6300.png
  170. BIN  sources/29-web2py-english/images/en6400.png
  171. BIN  sources/29-web2py-english/images/en6500.png
  172. BIN  sources/29-web2py-english/images/en6600.png
  173. BIN  sources/29-web2py-english/images/en6700.png
  174. BIN  sources/29-web2py-english/images/en6800.png
  175. BIN  sources/29-web2py-english/images/en6900.png
  176. BIN  sources/29-web2py-english/images/en700.png
  177. BIN  sources/29-web2py-english/images/en7000.png
  178. BIN  sources/29-web2py-english/images/en7100.png
  179. BIN  sources/29-web2py-english/images/en7200.png
  180. BIN  sources/29-web2py-english/images/en7300.png
  181. BIN  sources/29-web2py-english/images/en7400.png
  182. BIN  sources/29-web2py-english/images/en7500.png
  183. BIN  sources/29-web2py-english/images/en7600.png
  184. BIN  sources/29-web2py-english/images/en7700.png
  185. BIN  sources/29-web2py-english/images/en7800.png
  186. BIN  sources/29-web2py-english/images/en7900.png
  187. BIN  sources/29-web2py-english/images/en800.png
  188. BIN  sources/29-web2py-english/images/en8000.png
  189. BIN  sources/29-web2py-english/images/en8100.png
  190. BIN  sources/29-web2py-english/images/en8200.png
  191. BIN  sources/29-web2py-english/images/en8300.png
  192. BIN  sources/29-web2py-english/images/en8400.png
  193. BIN  sources/29-web2py-english/images/en8500.png
  194. BIN  sources/29-web2py-english/images/en8600.png
  195. BIN  sources/29-web2py-english/images/en8700.png
  196. BIN  sources/29-web2py-english/images/en8800.png
  197. BIN  sources/29-web2py-english/images/en8900.png
  198. BIN  sources/29-web2py-english/images/en900.png
  199. BIN  sources/29-web2py-english/images/en9000.png
  200. BIN  sources/29-web2py-english/images/en9100.png
  201. BIN  sources/29-web2py-english/images/en9200.png
  202. BIN  sources/29-web2py-english/images/en9300.png
  203. BIN  sources/29-web2py-english/images/en9400.png
  204. BIN  sources/29-web2py-english/images/en9500.png
  205. BIN  sources/29-web2py-english/images/en9600.png
  206. BIN  sources/29-web2py-english/images/en9700.png
  207. BIN  sources/29-web2py-english/images/en9800.png
  208. BIN  sources/29-web2py-english/images/en9900.png
  209. +14 −0 sources/29-web2py-english/info.txt
  210. +123 −0 sources/29-web2py-english/latex_template.tex
  211. +9 −0 sources/29-web2py-english/references/PAM
  212. +9 −0 sources/29-web2py-english/references/RFC2396
  213. +9 −0 sources/29-web2py-english/references/RFC2616
  214. +9 −0 sources/29-web2py-english/references/RFC3490
  215. +9 −0 sources/29-web2py-english/references/RFC3492
  216. +9 −0 sources/29-web2py-english/references/ReportLab
  217. +9 −0 sources/29-web2py-english/references/ajax-w
  218. +9 −0 sources/29-web2py-english/references/alterego
  219. +9 −0 sources/29-web2py-english/references/apache
  220. +9 −0 sources/29-web2py-english/references/apache1
  221. +9 −0 sources/29-web2py-english/references/apache2
  222. +9 −0 sources/29-web2py-english/references/appliances
  223. +9 −0 sources/29-web2py-english/references/authorizenet
  224. +9 −0 sources/29-web2py-english/references/blogspot1
  225. +9 −0 sources/29-web2py-english/references/cas
  226. +9 −0 sources/29-web2py-english/references/cgi
  227. +9 −0 sources/29-web2py-english/references/cherokee
  228. +9 −0 sources/29-web2py-english/references/cron
  229. +9 −0 sources/29-web2py-english/references/css-o
  230. +9 −0 sources/29-web2py-english/references/css-school
  231. +9 −0 sources/29-web2py-english/references/css-w
  232. +9 −0 sources/29-web2py-english/references/cxoracle
  233. +9 −0 sources/29-web2py-english/references/db2
  234. +9 −0 sources/29-web2py-english/references/dowcommerce
  235. +9 −0 sources/29-web2py-english/references/editarea
  236. +9 −0 sources/29-web2py-english/references/ezcss
  237. +9 −0 sources/29-web2py-english/references/fastcgi
  238. +9 −0 sources/29-web2py-english/references/feedparser
  239. +9 −0 sources/29-web2py-english/references/firebird
  240. +9 −0 sources/29-web2py-english/references/gae
  241. +9 −0 sources/29-web2py-english/references/googlewallet
  242. +9 −0 sources/29-web2py-english/references/guido
  243. +9 −0 sources/29-web2py-english/references/haproxy
  244. +9 −0 sources/29-web2py-english/references/html-o
  245. +9 −0 sources/29-web2py-english/references/html-w
  246. +9 −0 sources/29-web2py-english/references/http-o
  247. +9 −0 sources/29-web2py-english/references/http-w
  248. +9 −0 sources/29-web2py-english/references/informix
  249. +9 −0 sources/29-web2py-english/references/informixdb
  250. +9 −0 sources/29-web2py-english/references/ingresdb
  251. +9 −0 sources/29-web2py-english/references/ingresdbi
  252. +9 −0 sources/29-web2py-english/references/jdbcjar
  253. +9 −0 sources/29-web2py-english/references/jdbcsource
  254. +9 −0 sources/29-web2py-english/references/jquery
  255. +9 −0 sources/29-web2py-english/references/jquery-b
  256. +9 −0 sources/29-web2py-english/references/jquery-ui
  257. +9 −0 sources/29-web2py-english/references/js-b
  258. +9 −0 sources/29-web2py-english/references/js-w
  259. +9 −0 sources/29-web2py-english/references/kinterbasdb
  260. +9 −0 sources/29-web2py-english/references/layouts
  261. +9 −0 sources/29-web2py-english/references/lgpl3
  262. +9 −0 sources/29-web2py-english/references/lighttpd
  263. +9 −0 sources/29-web2py-english/references/lutz
  264. +9 −0 sources/29-web2py-english/references/markdown2
  265. +9 −0 sources/29-web2py-english/references/memcache
  266. +9 −0 sources/29-web2py-english/references/modernizr
  267. +9 −0 sources/29-web2py-english/references/modproxy
  268. +9 −0 sources/29-web2py-english/references/modwsgi
  269. +9 −0 sources/29-web2py-english/references/modwsgi1
  270. +9 −0 sources/29-web2py-english/references/mssql
  271. +9 −0 sources/29-web2py-english/references/mysql
  272. +9 −0 sources/29-web2py-english/references/mysqldb
  273. +9 −0 sources/29-web2py-english/references/nicedit
  274. +9 −0 sources/29-web2py-english/references/openssl
  275. +9 −0 sources/29-web2py-english/references/oracle
  276. +9 −0 sources/29-web2py-english/references/owasp
  277. +9 −0 sources/29-web2py-english/references/paypal
  278. +9 −0 sources/29-web2py-english/references/php
  279. +9 −0 sources/29-web2py-english/references/postgres
  280. +9 −0 sources/29-web2py-english/references/pound
  281. +9 −0 sources/29-web2py-english/references/psycopg2
  282. +9 −0 sources/29-web2py-english/references/pyamf
  283. +9 −0 sources/29-web2py-english/references/pydocs
  284. +9 −0 sources/29-web2py-english/references/pymysql
  285. +9 −0 sources/29-web2py-english/references/pyodbc
  286. +9 −0 sources/29-web2py-english/references/pyrss2gen
  287. +9 −0 sources/29-web2py-english/references/pyrtf
  288. +9 −0 sources/29-web2py-english/references/python
  289. +9 −0 sources/29-web2py-english/references/pythonsecurity
  290. +9 −0 sources/29-web2py-english/references/quoteall
  291. +9 −0 sources/29-web2py-english/references/recaptcha
  292. +9 −0 sources/29-web2py-english/references/redis
  293. +9 −0 sources/29-web2py-english/references/regexlib
  294. +9 −0 sources/29-web2py-english/references/rocket
  295. +9 −0 sources/29-web2py-english/references/simplejson
  296. +9 −0 sources/29-web2py-english/references/skeleton
  297. +9 −0 sources/29-web2py-english/references/source1
  298. +9 −0 sources/29-web2py-english/references/sql-w
  299. +9 −0 sources/29-web2py-english/references/sqlite
  300. +9 −0 sources/29-web2py-english/references/ssl
Sorry, we could not display the entire diff because too many files (1,847) changed.
2  ABOUT
@@ -0,0 +1,2 @@
+Write something about this app.
+Developed with web2py.
4 LICENSE
@@ -0,0 +1,4 @@
+The web2py welcome app is licensed under public domain
+(except for the css and js files that it includes, which have their own third party licenses).
+
+You can modify this license when you add your own code.
0  __init__.py
No changes.
442 controllers/appadmin.py
@@ -0,0 +1,442 @@
+# -*- coding: utf-8 -*-
+
+# ##########################################################
+# ## make sure administrator is on localhost
+# ###########################################################
+
+import os
+import socket
+import datetime
+import copy
+import gluon.contenttype
+import gluon.fileutils
+
+response.subtitle = 'Database Administration (appadmin)'
+
+# ## critical --- make a copy of the environment
+
+global_env = copy.copy(globals())
+global_env['datetime'] = datetime
+
+http_host = request.env.http_host.split(':')[0]
+remote_addr = request.env.remote_addr
+try:
+ hosts = (http_host, socket.gethostname(),
+ socket.gethostbyname(http_host),
+ '::1','127.0.0.1','::ffff:127.0.0.1')
+except:
+ hosts = (http_host, )
+
+if request.env.http_x_forwarded_for or request.is_https:
+ session.secure()
+elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
+ raise HTTP(200, T('appadmin is disabled because insecure channel'))
+
+if (request.application=='admin' and not session.authorized) or \
+ (request.application!='admin' and not gluon.fileutils.check_credentials(request)):
+ redirect(URL('admin', 'default', 'index',
+ vars=dict(send=URL(args=request.args,vars=request.vars))))
+
+ignore_rw = True
+response.view = 'appadmin.html'
+response.menu = [[T('design'), False, URL('admin', 'default', 'design',
+ args=[request.application])], [T('db'), False,
+ URL('index')], [T('state'), False,
+ URL('state')], [T('cache'), False,
+ URL('ccache')]]
+
+# ##########################################################
+# ## auxiliary functions
+# ###########################################################
+
+
+def get_databases(request):
+ dbs = {}
+ for (key, value) in global_env.items():
+ cond = False
+ try:
+ cond = isinstance(value, GQLDB)
+ except:
+ cond = isinstance(value, SQLDB)
+ if cond:
+ dbs[key] = value
+ return dbs
+
+
+databases = get_databases(None)
+
+
+def eval_in_global_env(text):
+ exec ('_ret=%s' % text, {}, global_env)
+ return global_env['_ret']
+
+
+def get_database(request):
+ if request.args and request.args[0] in databases:
+ return eval_in_global_env(request.args[0])
+ else:
+ session.flash = T('invalid request')
+ redirect(URL('index'))
+
+
+def get_table(request):
+ db = get_database(request)
+ if len(request.args) > 1 and request.args[1] in db.tables:
+ return (db, request.args[1])
+ else:
+ session.flash = T('invalid request')
+ redirect(URL('index'))
+
+
+def get_query(request):
+ try:
+ return eval_in_global_env(request.vars.query)
+ except Exception:
+ return None
+
+
+def query_by_table_type(tablename,db,request=request):
+ keyed = hasattr(db[tablename],'_primarykey')
+ if keyed:
+ firstkey = db[tablename][db[tablename]._primarykey[0]]
+ cond = '>0'
+ if firstkey.type in ['string', 'text']:
+ cond = '!=""'
+ qry = '%s.%s.%s%s' % (request.args[0], request.args[1], firstkey.name, cond)
+ else:
+ qry = '%s.%s.id>0' % tuple(request.args[:2])
+ return qry
+
+
+
+# ##########################################################
+# ## list all databases and tables
+# ###########################################################
+
+
+def index():
+ return dict(databases=databases)
+
+
+# ##########################################################
+# ## insert a new record
+# ###########################################################
+
+
+def insert():
+ (db, table) = get_table(request)
+ form = SQLFORM(db[table], ignore_rw=ignore_rw)
+ if form.accepts(request.vars, session):
+ response.flash = T('new record inserted')
+ return dict(form=form,table=db[table])
+
+
+# ##########################################################
+# ## list all records in table and insert new record
+# ###########################################################
+
+
+def download():
+ import os
+ db = get_database(request)
+ return response.download(request,db)
+
+def csv():
+ import gluon.contenttype
+ response.headers['Content-Type'] = \
+ gluon.contenttype.contenttype('.csv')
+ db = get_database(request)
+ query = get_query(request)
+ if not query:
+ return None
+ response.headers['Content-disposition'] = 'attachment; filename=%s_%s.csv'\
+ % tuple(request.vars.query.split('.')[:2])
+ return str(db(query,ignore_common_filters=True).select())
+
+
+def import_csv(table, file):
+ table.import_from_csv_file(file)
+
+def select():
+ import re
+ db = get_database(request)
+ dbname = request.args[0]
+ regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)')
+ if len(request.args)>1 and hasattr(db[request.args[1]],'_primarykey'):
+ regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)')
+ if request.vars.query:
+ match = regex.match(request.vars.query)
+ if match:
+ request.vars.query = '%s.%s.%s==%s' % (request.args[0],
+ match.group('table'), match.group('field'),
+ match.group('value'))
+ else:
+ request.vars.query = session.last_query
+ query = get_query(request)
+ if request.vars.start:
+ start = int(request.vars.start)
+ else:
+ start = 0
+ nrows = 0
+ stop = start + 100
+ table = None
+ rows = []
+ orderby = request.vars.orderby
+ if orderby:
+ orderby = dbname + '.' + orderby
+ if orderby == session.last_orderby:
+ if orderby[0] == '~':
+ orderby = orderby[1:]
+ else:
+ orderby = '~' + orderby
+ session.last_orderby = orderby
+ session.last_query = request.vars.query
+ form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
+ _name='query', _value=request.vars.query or '',
+ requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR(T('Update:'),
+ INPUT(_name='update_check', _type='checkbox',
+ value=False), INPUT(_style='width:400px',
+ _name='update_fields', _value=request.vars.update_fields
+ or '')), TR(T('Delete:'), INPUT(_name='delete_check',
+ _class='delete', _type='checkbox', value=False), ''),
+ TR('', '', INPUT(_type='submit', _value=T('submit')))),
+ _action=URL(r=request,args=request.args))
+ if form.accepts(request.vars, formname=None):
+ regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+')
+ match = regex.match(form.vars.query.strip())
+ if match:
+ table = match.group('table')
+ try:
+ nrows = db(query).count()
+ if form.vars.update_check and form.vars.update_fields:
+ db(query).update(**eval_in_global_env('dict(%s)'
+ % form.vars.update_fields))
+ response.flash = T('%s %%{row} updated', nrows)
+ elif form.vars.delete_check:
+ db(query).delete()
+ response.flash = T('%s %%{row} deleted', nrows)
+ nrows = db(query).count()
+ if orderby:
+ rows = db(query,ignore_common_filters=True).select(limitby=(start, stop), orderby=eval_in_global_env(orderby))
+ else:
+ rows = db(query,ignore_common_filters=True).select(limitby=(start, stop))
+ except Exception, e:
+ (rows, nrows) = ([], 0)
+ response.flash = DIV(T('Invalid Query'),PRE(str(e)))
+ # begin handle upload csv
+ csv_table = table or request.vars.table
+ if csv_table:
+ formcsv = FORM(str(T('or import from csv file'))+" ",
+ INPUT(_type='file',_name='csvfile'),
+ INPUT(_type='hidden',_value=csv_table,_name='table'),
+ INPUT(_type='submit',_value=T('import')))
+ else:
+ formcsv = None
+ if formcsv and formcsv.process().accepted:
+ try:
+ import_csv(db[request.vars.table],
+ request.vars.csvfile.file)
+ response.flash = T('data uploaded')
+ except Exception, e:
+ response.flash = DIV(T('unable to parse csv file'),PRE(str(e)))
+ # end handle upload csv
+
+ return dict(
+ form=form,
+ table=table,
+ start=start,
+ stop=stop,
+ nrows=nrows,
+ rows=rows,
+ query=request.vars.query,
+ formcsv = formcsv,
+ )
+
+
+# ##########################################################
+# ## edit delete one record
+# ###########################################################
+
+
+def update():
+ (db, table) = get_table(request)
+ keyed = hasattr(db[table],'_primarykey')
+ record = None
+ if keyed:
+ key = [f for f in request.vars if f in db[table]._primarykey]
+ if key:
+ record = db(db[table][key[0]] == request.vars[key[0]], ignore_common_filters=True).select().first()
+ else:
+ record = db(db[table].id == request.args(2),ignore_common_filters=True).select().first()
+
+ if not record:
+ qry = query_by_table_type(table, db)
+ session.flash = T('record does not exist')
+ redirect(URL('select', args=request.args[:1],
+ vars=dict(query=qry)))
+
+ if keyed:
+ for k in db[table]._primarykey:
+ db[table][k].writable=False
+
+ form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'),
+ ignore_rw=ignore_rw and not keyed,
+ linkto=URL('select',
+ args=request.args[:1]), upload=URL(r=request,
+ f='download', args=request.args[:1]))
+
+ if form.accepts(request.vars, session):
+ session.flash = T('done!')
+ qry = query_by_table_type(table, db)
+ redirect(URL('select', args=request.args[:1],
+ vars=dict(query=qry)))
+ return dict(form=form,table=db[table])
+
+
+# ##########################################################
+# ## get global variables
+# ###########################################################
+
+
+def state():
+ return dict()
+
+def ccache():
+ form = FORM(
+ P(TAG.BUTTON(T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")),
+ P(TAG.BUTTON(T("Clear RAM"), _type="submit", _name="ram", _value="ram")),
+ P(TAG.BUTTON(T("Clear DISK"), _type="submit", _name="disk", _value="disk")),
+ )
+
+ if form.accepts(request.vars, session):
+ clear_ram = False
+ clear_disk = False
+ session.flash = ""
+ if request.vars.yes:
+ clear_ram = clear_disk = True
+ if request.vars.ram:
+ clear_ram = True
+ if request.vars.disk:
+ clear_disk = True
+
+ if clear_ram:
+ cache.ram.clear()
+ session.flash += T("Ram Cleared")
+ if clear_disk:
+ cache.disk.clear()
+ session.flash += T("Disk Cleared")
+
+ redirect(URL(r=request))
+
+ try:
+ from guppy import hpy; hp=hpy()
+ except ImportError:
+ hp = False
+
+ import shelve, os, copy, time, math
+ from gluon import portalocker
+
+ ram = {
+ 'entries': 0,
+ 'bytes': 0,
+ 'objects': 0,
+ 'hits': 0,
+ 'misses': 0,
+ 'ratio': 0,
+ 'oldest': time.time(),
+ 'keys': []
+ }
+ disk = copy.copy(ram)
+ total = copy.copy(ram)
+ disk['keys'] = []
+ total['keys'] = []
+
+ def GetInHMS(seconds):
+ hours = math.floor(seconds / 3600)
+ seconds -= hours * 3600
+ minutes = math.floor(seconds / 60)
+ seconds -= minutes * 60
+ seconds = math.floor(seconds)
+
+ return (hours, minutes, seconds)
+
+ for key, value in cache.ram.storage.items():
+ if isinstance(value, dict):
+ ram['hits'] = value['hit_total'] - value['misses']
+ ram['misses'] = value['misses']
+ try:
+ ram['ratio'] = ram['hits'] * 100 / value['hit_total']
+ except (KeyError, ZeroDivisionError):
+ ram['ratio'] = 0
+ else:
+ if hp:
+ ram['bytes'] += hp.iso(value[1]).size
+ ram['objects'] += hp.iso(value[1]).count
+ ram['entries'] += 1
+ if value[0] < ram['oldest']:
+ ram['oldest'] = value[0]
+ ram['keys'].append((key, GetInHMS(time.time() - value[0])))
+
+ locker = open(os.path.join(request.folder,
+ 'cache/cache.lock'), 'a')
+ portalocker.lock(locker, portalocker.LOCK_EX)
+ disk_storage = shelve.open(os.path.join(request.folder, 'cache/cache.shelve'))
+ try:
+ for key, value in disk_storage.items():
+ if isinstance(value, dict):
+ disk['hits'] = value['hit_total'] - value['misses']
+ disk['misses'] = value['misses']
+ try:
+ disk['ratio'] = disk['hits'] * 100 / value['hit_total']
+ except (KeyError, ZeroDivisionError):
+ disk['ratio'] = 0
+ else:
+ if hp:
+ disk['bytes'] += hp.iso(value[1]).size
+ disk['objects'] += hp.iso(value[1]).count
+ disk['entries'] += 1
+ if value[0] < disk['oldest']:
+ disk['oldest'] = value[0]
+ disk['keys'].append((key, GetInHMS(time.time() - value[0])))
+
+ finally:
+ portalocker.unlock(locker)
+ locker.close()
+ disk_storage.close()
+
+ total['entries'] = ram['entries'] + disk['entries']
+ total['bytes'] = ram['bytes'] + disk['bytes']
+ total['objects'] = ram['objects'] + disk['objects']
+ total['hits'] = ram['hits'] + disk['hits']
+ total['misses'] = ram['misses'] + disk['misses']
+ total['keys'] = ram['keys'] + disk['keys']
+ try:
+ total['ratio'] = total['hits'] * 100 / (total['hits'] + total['misses'])
+ except (KeyError, ZeroDivisionError):
+ total['ratio'] = 0
+
+ if disk['oldest'] < ram['oldest']:
+ total['oldest'] = disk['oldest']
+ else:
+ total['oldest'] = ram['oldest']
+
+ ram['oldest'] = GetInHMS(time.time() - ram['oldest'])
+ disk['oldest'] = GetInHMS(time.time() - disk['oldest'])
+ total['oldest'] = GetInHMS(time.time() - total['oldest'])
+
+ def key_table(keys):
+ return TABLE(
+ TR(TD(B(T('Key'))), TD(B(T('Time in Cache (h:m:s)')))),
+ *[TR(TD(k[0]), TD('%02d:%02d:%02d' % k[1])) for k in keys],
+ **dict(_class='cache-keys',
+ _style="border-collapse: separate; border-spacing: .5em;"))
+
+ ram['keys'] = key_table(ram['keys'])
+ disk['keys'] = key_table(disk['keys'])
+ total['keys'] = key_table(total['keys'])
+
+ return dict(form=form, total=total,
+ ram=ram, disk=disk, object_stats=hp != False)
+
+
+
130 controllers/default.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+import os, glob
+
+response.title = 'web2py'
+response.subtitle = 'Full Stack Web Framework, 4th Ed.\nwritten by Massimo Di Pierro in English'
+response.menu = []
+
+def splitter(x):
+ a,b = x.split(':',1)
+ return a.strip(),b.strip()
+
+@cache('folders',None)
+def get_folders():
+ folder = os.path.join(request.folder,'sources')
+ return folder, [f for f in os.listdir(folder)
+ if os.path.isdir(os.path.join(folder,f))]
+FOLDER, FOLDERS = get_folders()
+
+def get_subfolder(book_id):
+ subfolders = [f for f in FOLDERS if f.startswith(book_id)]
+ return subfolders[0] if subfolders else redirect(URL('index'))
+
+def get_info(subfolder):
+ infofile = os.path.join(FOLDER,subfolder,'info.txt')
+ if os.path.exists(infofile):
+ info = dict(splitter(line)
+ for line in open(infofile).readlines()
+ if ':' in line)
+ return info
+ return {}
+
+def get_chapters(subfolder):
+ filename = os.path.join(FOLDER,subfolder,'chapters.txt')
+ chapters = [splitter(line)
+ for line in open(filename).readlines()
+ if ':' in line]
+ return chapters
+
+@cache('menu',None)
+def build_menu():
+ menu = []
+ submenu = []
+ for subfolder in FOLDERS:
+ info = get_info(subfolder)
+ book_id = subfolder.split('-')[0]
+ submenu.append((info['title']+' '+info['language'],None,URL('chapter',args=book_id)))
+ menu.append(('Books',None,None,submenu))
+ return menu
+
+response.menu = build_menu()
+
+def convert2html(book_id,text):
+ extra = {}
+ def url2(*a,**b):
+ b['args'] = [book_id]+b.get('args',[])
+ return URL(*a,**b)
+ def truncate(x): return x[:70]+'...' if len(x)>70 else x
+ extra['verbatim'] = lambda code: cgi.escape(code)
+ extra['cite'] = lambda key: TAG.sup(
+ '[',A(key,_href=URL('reference',args=(book_id,key)),
+ _target='_blank'),']').xml()
+ extra['inxx'] = lambda code: '<div class="inxx">'+code+'</div>'
+ extra['ref'] = lambda code: '[ref:'+code+']'
+ # extra['code'] = lambda code: CODE(code,language='web2py').xml()
+ return MARKMIN(text.replace('\r',''),extra=extra,url=url2)
+
+def index():
+ books = {}
+ for subfolder in FOLDERS:
+ books[subfolder] = get_info(subfolder)
+ return locals()
+
+def chapter():
+ book_id, chapter_id = request.args(0), request.args(1,cast=int,default='0')
+ subfolder = get_subfolder(book_id)
+ info = get_info(subfolder)
+ chapters = get_chapters(subfolder)
+ filename = os.path.join(FOLDER,subfolder,'%.2i.markmin' % chapter_id)
+ content = open(filename).read()
+ content = convert2html(book_id,content)
+ return locals()
+
+def search():
+ book_id = request.args(0) or redirect(URL('index'))
+ search = request.vars.search or redirect(URL('chapter',args=book_id))
+ subfolder = get_subfolder(book_id)
+ info = get_info(subfolder)
+ chapters = get_chapters(subfolder)
+ results = []
+ for chapter in chapters:
+ chapter_id = int(chapter[0])
+ filename = os.path.join(FOLDER,subfolder,'%.2i.markmin' % chapter_id)
+ data = open(filename).read().replace('\r','')
+ k = data.find(search)
+ if k>=0:
+ snippet = data[data.rfind('\n\n',0,k)+1:data.find('\n\n',k)].strip()
+ results.append((chapter[0],chapter[1],convert2html(book_id,snippet)))
+ content = CAT(*[DIV(H2(A(chapter[1],_href=URL('chapter',args=(book_id,chapter[0])))),
+ chapter[2],BR(),
+ A('more',_href=URL('chapter',args=(book_id,chapter[0])),_class="btn"))
+ for chapter in results])
+ if not results:
+ response.flash = "no results"
+ response.view = 'default/chapter.html'
+ return locals()
+
+def image():
+ book_id = request.args(0)
+ key = request.args(1)
+ subfolder = get_subfolder(book_id)
+ filename = os.path.join(FOLDER,subfolder,'images',key)
+ if not os.path.exists(filename):
+ raise HTTP(404)
+ return response.stream(open(filename,'r'))
+
+
+def reference():
+ book_id = request.args(0)
+ key = request.args(1)
+ subfolder = get_subfolder(book_id)
+ filename = os.path.join(FOLDER,subfolder,'references',key)
+ if not os.path.exists(filename):
+ raise HTTP(404)
+ info = dict(splitter(line)
+ for line in open(filename).readlines()
+ if ':' in line)
+ if info['source_url']:
+ redirect(info['source_url'])
+ else:
+ return repr(info)
1  cron/crontab
@@ -0,0 +1 @@
+#crontab
1  cron/crontab.example
@@ -0,0 +1 @@
+#crontab
131 languages/cs.py
@@ -0,0 +1,131 @@
+# coding: utf8
+{
+'!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',
+'Administrative interface': 'pro administrátorské rozhranie kliknite sem',
+'Are you sure you want to delete this object?': 'Opravdu chceš odstranit tento objekt?',
+'Available Databases and Tables': 'Dostupné databáze a tabuľky',
+'Cannot be empty': 'Nemůže být prázdné',
+'Change password': 'Změna hesla',
+'Check to delete': 'Označit ke smazání',
+'Check to delete:': 'Check to delete:',
+'Client IP': 'Client IP',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Current request': 'Aktuální požadavek',
+'Current response': 'Aktuální odpověď',
+'Current session': 'Aktuální session',
+'DB Model': 'DB Model',
+'Database': 'Databáze',
+'Delete:': 'Smazat:',
+'Description': 'Popis',
+'Documentation': 'Dokumentáce',
+'E-mail': 'E-mail',
+'Edit': 'Upravit',
+'Edit Profile': 'Upravit profil',
+'Edit current record': 'Upravit aktuální záznam',
+'First name': 'Křestní jméno',
+'Group %(group_id)s created': 'Skupina %(group_id)s vytvořena',
+'Group ID': 'ID skupiny',
+'Hello World': 'Ahoj světe',
+'Import/Export': 'Import/Export',
+'Index': 'Index',
+'Internal State': 'Vnitřní stav',
+'Invalid Query': 'Neplatná dotaz',
+'Invalid email': 'Neplatný email',
+'Invalid password': 'Nesprávné heslo',
+'Last name': 'Příjmení',
+'Layout': 'Layout',
+'Logged in': 'Přihlášení úspěšné',
+'Logged out': 'Odhlášení úspěšné',
+'Login': 'Login',
+'Lost Password': 'Ztracené heslo?',
+'Menu Model': 'Menu Model',
+'Name': 'Jméno',
+'New Record': 'Nový záznam',
+'New password': 'Nové heslo',
+'No databases in this application': 'V této aplikáci nejsou databáze',
+'Object or table name': 'Objekt či tabulka',
+'Old password': 'Staré heslo',
+'Online examples': 'pro online příklady klikněte sem',
+'Origin': 'Púvod',
+'Password': 'Heslo',
+"Password fields don't match": 'Hesla se neshodují',
+'Powered by': 'Powered by',
+'Query:': 'Dotaz:',
+'Readme': 'Nápověda',
+'Record ID': 'ID záznamu',
+'Register': 'Zaregistrovat se',
+'Registration identifier': 'Registrační identifikátor',
+'Registration key': 'Registrační kľíč',
+'Remember me (for 30 days)': 'Zapamatuj si mne (na 30 dní)',
+'Reset Password key': 'Nastavit registrační kľíč',
+'Retrieve username': 'Retrieve username',
+'Role': 'Role',
+'Rows in Table': 'řádků v tabulce',
+'Rows selected': 'označených řádků',
+'Stylesheet': 'CSS',
+'Submit': 'Odeslat',
+'Sure you want to delete this object?': 'Opravdu chceš smazat tento objekt?',
+'Table name': 'Název tabulky',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" je podmínka jako "db.table1.field1==\'value\'". Něco jako "db.table1.field1==db.table2.field2" má za výsledek SQL JOIN.',
+'The output of the file is a dictionary that was rendered by the view %s': 'Výstup zo souboru je slovník, ktorý byl zobrazený ve view %s',
+'This is a copy of the scaffolding application': 'Toto je kopie skeletu aplikace',
+'Timestamp': 'Časové razítko',
+'Update:': 'Upravit:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použijte (...)&(...) pro AND, (...)|(...) pro OR a ~(...) pro NOT na poskládaní komplexnejších dotazů.',
+'User %(id)s Logged-in': 'Uživatel %(id)s prihlásen',
+'User %(id)s Logged-out': 'Uživatel %(id)s odhlášen',
+'User %(id)s Password changed': 'Uživatel %(id)s zmenil heslo',
+'User %(id)s Profile updated': 'Uživatel %(id)s upravil profil',
+'User %(id)s Registered': 'Uživatel %(id)s se zaregistroval',
+'User %(id)s Username retrieved': 'User %(id)s Username retrieved',
+'User ID': 'ID uživatele',
+'Username': 'Nick',
+'Verify Password': 'Zopakuj heslo',
+'View': 'Zobrazit',
+'Welcome': 'Vítej',
+'Welcome to web2py': 'Vitejte ve web2py',
+'Which called the function %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',
+}
122 languages/default.py
@@ -0,0 +1,122 @@
+# coding: utf8
+{
+'!langcode!': 'en-us',
+'!langname!': 'English (US)',
+'%s %%(shop)': '%s %%(shop)',
+'%s %%(shop[0])': '%s %%(shop[0])',
+'%s %%{quark[0]}': '%s %%{quark[0]}',
+'%s %%{shop[0]}': '%s %%{shop[0]}',
+'%s %%{shop}': '%s %%{shop}',
+'%Y-%m-%d': '%Y-%m-%d',
+'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
+'@markmin\x01**Hello World**': '**Hello World**',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
+'Ajax Recipes': 'Ajax Recipes',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
+'Buy this book': 'Buy this book',
+'Cannot be empty': 'Cannot be empty',
+'Check to delete': 'Check to delete',
+'Client IP': 'Client IP',
+'Community': 'Community',
+'Components and Plugins': 'Components and Plugins',
+'Controller': 'Controller',
+'Copyright': 'Copyright',
+'Created By': 'Created By',
+'Created On': 'Created On',
+'customize me!': 'customize me!',
+'Database': 'Database',
+'DB Model': 'DB Model',
+'Demo': 'Demo',
+'Deployment Recipes': 'Deployment Recipes',
+'Description': 'Description',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
+'Download': 'Download',
+'E-mail': 'E-mail',
+'Email and SMS': 'Email and SMS',
+'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g',
+'enter date and time as %(format)s': 'enter date and time as %(format)s',
+'Errors': 'Errors',
+'FAQ': 'FAQ',
+'First name': 'First name',
+'Forms and Validators': 'Forms and Validators',
+'Free Applications': 'Free Applications',
+'Group %(group_id)s created': 'Group %(group_id)s created',
+'Group ID': 'Group ID',
+'Group uniquely assigned to user %(id)s': 'Group uniquely assigned to user %(id)s',
+'Groups': 'Groups',
+'Hello World': 'Hello World',
+'Hello World ## comment': 'Hello World ',
+'Hello World## comment': 'Hello World',
+'Home': 'Home',
+'How did you get here?': 'How did you get here?',
+'Introduction': 'Introduction',
+'Invalid email': 'Invalid email',
+'Is Active': 'Is Active',
+'Last name': 'Last name',
+'Layout': 'Layout',
+'Layout Plugins': 'Layout Plugins',
+'Layouts': 'Layouts',
+'Live Chat': 'Live Chat',
+'Logged in': 'Logged in',
+'Logged out': 'Logged out',
+'Login': 'Login',
+'Logout': 'Logout',
+'Lost Password': 'Lost Password',
+'Lost password?': 'Lost password?',
+'Menu Model': 'Menu Model',
+'Modified By': 'Modified By',
+'Modified On': 'Modified On',
+'My Sites': 'My Sites',
+'Name': 'Name',
+'Object or table name': 'Object or table name',
+'Online examples': 'Online examples',
+'Origin': 'Origin',
+'Other Plugins': 'Other Plugins',
+'Other Recipes': 'Other Recipes',
+'Overview': 'Overview',
+'Password': 'Password',
+"Password fields don't match": "Password fields don't match",
+'please input your password again': 'please input your password again',
+'Plugins': 'Plugins',
+'Powered by': 'Powered by',
+'Preface': 'Preface',
+'Profile': 'Profile',
+'Python': 'Python',
+'Quick Examples': 'Quick Examples',
+'Recipes': 'Recipes',
+'Record ID': 'Record ID',
+'Register': 'Register',
+'Registration identifier': 'Registration identifier',
+'Registration key': 'Registration key',
+'Registration successful': 'Registration successful',
+'Remember me (for 30 days)': 'Remember me (for 30 days)',
+'Reset Password key': 'Reset Password key',
+'Role': 'Role',
+'Semantic': 'Semantic',
+'Services': 'Services',
+'Stylesheet': 'Stylesheet',
+'Support': 'Support',
+'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',
+'Timestamp': 'Timestamp',
+'Twitter': 'Twitter',
+'User %(id)s Logged-in': 'User %(id)s Logged-in',
+'User %(id)s Logged-out': 'User %(id)s Logged-out',
+'User %(id)s Registered': 'User %(id)s Registered',
+'User ID': 'User ID',
+'value already in database or empty': 'value already in database or empty',
+'Verify Password': 'Verify Password',
+'Videos': 'Videos',
+'View': 'View',
+'Welcome': 'Welcome',
+'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',
+}
260 languages/es.py
@@ -0,0 +1,260 @@
+# coding: utf8
+{
+'!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)',
+'(something like "it-it")': '(algo como "it-it")',
+'A new version of web2py is available': 'Hay una nueva versión de web2py disponible',
+'A new version of web2py is available: %s': 'Hay una nueva versión de web2py disponible: %s',
+'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
+'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
+'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
+'About': 'Acerca de',
+'About application': 'Acerca de la aplicación',
+'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
+'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
+'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',
+'additional code for your application': 'código adicional para su aplicación',
+'admin disabled because no admin password': ' por falta de contraseña',
+'admin disabled because not supported on google app engine': 'admin deshabilitado, no es soportado en GAE',
+'admin disabled because unable to access password file': 'admin deshabilitado, imposible acceder al archivo con la contraseña',
+'and rename it (required):': 'y renombrela (requerido):',
+'and rename it:': ' y renombrelo:',
+'appadmin': 'appadmin',
+'appadmin is disabled because insecure channel': 'admin deshabilitado, el canal no es seguro',
+'application "%s" uninstalled': 'aplicación "%s" desinstalada',
+'application compiled': 'aplicación compilada',
+'application is compiled and cannot be designed': 'la aplicación está compilada y no puede ser modificada',
+'cache': 'cache',
+'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
+'cannot create file': 'no es posible crear archivo',
+'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
+'change password': 'cambie contraseña',
+'check all': 'marcar todos',
+'clean': 'limpiar',
+'click to check for upgrades': 'haga clic para buscar actualizaciones',
+'compile': 'compilar',
+'compiled application removed': 'aplicación compilada removida',
+'controllers': 'controladores',
+'create file with filename:': 'cree archivo con nombre:',
+'create new application:': 'nombre de la nueva aplicación:',
+'crontab': 'crontab',
+'currently saved or': 'actualmente guardado o',
+'customize me!': 'Adaptame!',
+'data uploaded': 'datos subidos',
+'Database': 'base de datos',
+'Database %s select': 'selección en base de datos %s',
+'database administration': 'administración base de datos',
+'db': 'db',
+'defines tables': 'define tablas',
+'delete': 'eliminar',
+'delete all checked': 'eliminar marcados',
+'design': 'modificar',
+'done!': 'listo!',
+'edit': 'editar',
+'edit controller': 'editar controlador',
+'edit profile': 'editar perfil',
+'errors': 'errores',
+'export as csv file': 'exportar como archivo CSV',
+'exposes': 'expone',
+'extends': 'extiende',
+'failed to reload module': 'recarga del módulo ha fallado',
+'file "%(filename)s" created': 'archivo "%(filename)s" creado',
+'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
+'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
+'file "%(filename)s" was not deleted': 'archivo "%(filename)s" no fué eliminado',
+'file "%s" of %s restored': 'archivo "%s" de %s restaurado',
+'file changed on disk': 'archivo modificado en el disco',
+'file does not exist': 'archivo no existe',
+'file saved on %(time)s': 'archivo guardado %(time)s',
+'file saved on %s': 'archivo guardado %s',
+'help': 'ayuda',
+'htmledit': 'htmledit',
+'includes': 'incluye',
+'insert new': 'inserte nuevo',
+'insert new %s': 'inserte nuevo %s',
+'internal error': 'error interno',
+'invalid password': 'contraseña inválida',
+'invalid request': 'solicitud inválida',
+'invalid ticket': 'tiquete inválido',
+'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
+'languages': 'lenguajes',
+'languages updated': 'lenguajes actualizados',
+'loading...': 'cargando...',
+'login': 'inicio de sesión',
+'logout': 'fin de sesión',
+'lost password?': '¿olvido la contraseña?',
+'merge': 'combinar',
+'models': 'modelos',
+'modules': 'módulos',
+'new application "%s" created': 'nueva aplicación "%s" creada',
+'new record inserted': 'nuevo registro insertado',
+'next 100 rows': '100 filas siguientes',
+'or import from csv file': 'o importar desde archivo CSV',
+'or provide application url:': 'o provea URL de la aplicación:',
+'pack all': 'empaquetar todo',
+'pack compiled': 'empaquete compiladas',
+'previous 100 rows': '100 filas anteriores',
+'Record': 'registro',
+'record does not exist': 'el registro no existe',
+'Record id': 'id de registro',
+'register': 'registrese',
+'remove compiled': 'eliminar compiladas',
+'restore': 'restaurar',
+'revert': 'revertir',
+'save': 'guardar',
+'session expired': 'sesión expirada',
+'shell': 'shell',
+'site': 'sitio',
+'some files could not be removed': 'algunos archivos no pudieron ser removidos',
+'state': 'estado',
+'static': 'estáticos',
+'Table': 'tabla',
+'test': 'probar',
+'the application logic, each URL path is mapped in one exposed function in the controller': 'la lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
+'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
+'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
+'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
+'to previous version.': 'a la versión previa.',
+'translation strings for the application': 'cadenas de caracteres de traducción para la aplicación',
+'try': 'intente',
+'try something like': 'intente algo como',
+'unable to create application "%s"': 'no es posible crear la aplicación "%s"',
+'unable to delete file "%(filename)s"': 'no es posible eliminar el archivo "%(filename)s"',
+'unable to parse csv file': 'no es posible analizar el archivo CSV',
+'unable to uninstall "%s"': 'no es posible instalar "%s"',
+'uncheck all': 'desmarcar todos',
+'uninstall': 'desinstalar',
+'update': 'actualizar',
+'update all languages': 'actualizar todos los lenguajes',
+'upload application:': 'subir aplicación:',
+'upload file:': 'suba archivo:',
+'versioning': 'versiones',
+'view': 'vista',
+'views': 'vistas',
+'web2py Recent Tweets': 'Tweets Recientes de web2py',
+'web2py is up to date': 'web2py está actualizado',
+}
168 languages/fr-ca.py
@@ -0,0 +1,168 @@
+# coding: utf8
+{
+'!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é',
+'About': 'À propos',
+'Access Control': "Contrôle d'accès",
+'Administrative interface': "Interface d'administration",
+'Ajax Recipes': 'Recettes Ajax',
+'Are you sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Authentication': 'Authentification',
+'Available Databases and Tables': 'Bases de données et tables disponibles',
+'Buy this book': 'Acheter ce livre',
+'Cannot be empty': 'Ne peut pas être vide',
+'Check to delete': 'Cliquez pour supprimer',
+'Check to delete:': 'Cliquez pour supprimer:',
+'Client IP': 'IP client',
+'Community': 'Communauté',
+'Controller': 'Contrôleur',
+'Copyright': "Droit d'auteur",
+'Current request': 'Demande actuelle',
+'Current response': 'Réponse actuelle',
+'Current session': 'Session en cours',
+'DB Model': 'Modèle DB',
+'Database': 'Base de données',
+'Delete:': 'Supprimer:',
+'Demo': 'Démo',
+'Deployment Recipes': 'Recettes de déploiement ',
+'Description': 'Descriptif',
+'Documentation': 'Documentation',
+'Download': 'Téléchargement',
+'E-mail': 'Courriel',
+'Edit': 'Éditer',
+'Edit This App': 'Modifier cette application',
+'Edit current record': "Modifier l'enregistrement courant",
+'Errors': 'Erreurs',
+'FAQ': 'faq',
+'First name': 'Prénom',
+'Forms and Validators': 'Formulaires et Validateurs',
+'Free Applications': 'Applications gratuites',
+'Function disabled': 'Fonction désactivée',
+'Group %(group_id)s created': '%(group_id)s groupe créé',
+'Group ID': 'Groupe ID',
+'Group uniquely assigned to user %(id)s': "Groupe unique attribué à l'utilisateur %(id)s",
+'Groups': 'Groupes',
+'Hello World': 'Bonjour le monde',
+'Home': 'Accueil',
+'Import/Export': 'Importer/Exporter',
+'Index': 'Index',
+'Internal State': 'État interne',
+'Introduction': 'Présentation',
+'Invalid Query': 'Requête Invalide',
+'Invalid email': 'Courriel invalide',
+'Last name': 'Nom',
+'Layout': 'Mise en page',
+'Layouts': 'layouts',
+'Live chat': 'Clavardage en direct',
+'Logged in': 'Connecté',
+'Login': 'Connectez-vous',
+'Lost Password': 'Mot de passe perdu',
+'Main Menu': 'Menu principal',
+'Menu Model': 'Menu modèle',
+'Name': 'Nom',
+'New Record': 'Nouvel enregistrement',
+'No databases in this application': "Cette application n'a pas de bases de données",
+'Online examples': 'Exemples en ligne',
+'Origin': 'Origine',
+'Other Recipes': 'Autres recettes',
+'Overview': 'Présentation',
+'Password': 'Mot de passe',
+"Password fields don't match": 'Les mots de passe ne correspondent pas',
+'Plugins': 'Plugiciels',
+'Powered by': 'Alimenté par',
+'Preface': 'Préface',
+'Python': 'Python',
+'Query:': 'Requête:',
+'Quick Examples': 'Examples Rapides',
+'Readme': 'Lisez-moi',
+'Recipes': 'Recettes',
+'Record %(id)s created': 'Record %(id)s created',
+'Record %(id)s updated': 'Record %(id)s updated',
+'Record Created': 'Record Created',
+'Record ID': "ID d'enregistrement",
+'Record Updated': 'Record Updated',
+'Register': "S'inscrire",
+'Registration key': "Clé d'enregistrement",
+'Registration successful': 'Inscription réussie',
+'Remember me (for 30 days)': 'Se souvenir de moi (pendant 30 jours)',
+'Request reset password': 'Demande de réinitialiser le mot clé',
+'Reset Password key': 'Réinitialiser le mot clé',
+'Resources': 'Ressources',
+'Role': 'Rôle',
+'Rows in Table': 'Lignes du tableau',
+'Rows selected': 'Lignes sélectionnées',
+'Semantic': 'Sémantique',
+'Services': 'Services',
+'Stylesheet': 'Feuille de style',
+'Submit': 'Soumettre',
+'Support': 'Soutien',
+'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Table name': 'Nom du tableau',
+'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "query" est une condition comme "db.table1.champ1==\'valeur\'". Quelque chose comme "db.table1.champ1==db.table2.champ2" résulte en un JOIN SQL.',
+'The Core': 'Le noyau',
+'The Views': 'Les Vues',
+'The output of the file is a dictionary that was rendered by the view %s': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue %s',
+'This App': 'Cette Appli',
+'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
+'Timestamp': 'Horodatage',
+'Twitter': 'Twitter',
+'Update:': 'Mise à jour:',
+'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Employez (...)&(...) pour AND, (...)|(...) pour OR, and ~(...) pour NOT pour construire des requêtes plus complexes.',
+'User %(id)s Logged-in': 'Utilisateur %(id)s connecté',
+'User %(id)s Registered': 'Utilisateur %(id)s enregistré',
+'User ID': 'ID utilisateur',
+'User Voice': 'User Voice',
+'Verify Password': 'Vérifiez le mot de passe',
+'Videos': 'Vidéos',
+'View': 'Présentation',
+'Web2py': 'Web2py',
+'Welcome': 'Bienvenu',
+'Welcome %s': 'Bienvenue %s',
+'Welcome to web2py': 'Bienvenue à web2py',
+'Which called the function %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',
+}
168 languages/fr.py
@@ -0,0 +1,168 @@
+# coding: utf8
+{
+'!langcode!': 'fr',
+'!langname!': 'Français',
+'"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',
+'%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',
+'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',
+'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:',
+'Client IP': 'IP client',
+'Community': 'Communauté',
+'Components and Plugins': 'Components and Plugins',
+'Controller': 'Contrôleur',
+'Copyright': 'Copyright',
+'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': 'base de données',
+'Database %s select': 'base de données %s select',
+'db': 'db',
+'DB Model': 'Modèle DB',
+'Delete:': 'Supprimer:',
+'Demo': 'Démo',
+'Deployment Recipes': 'Recettes de déploiement',
+'Description': 'Description',
+'design': 'design',
+'Documentation': 'Documentation',
+"Don't know what to do?": "Don't know what to do?",
+'done!': 'fait!',
+'Download': 'Téléchargement',
+'E-mail': 'E-mail',
+'Edit': 'Éditer',
+'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': 'enter an integer between %(min)g and %(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',
+'Free Applications': 'Applications gratuites',
+'Function disabled': 'Fonction désactivée',
+'Group ID': 'Groupe ID',
+'Groups': 'Groups',
+'Hello World': 'Bonjour le monde',
+'Home': 'Accueil',
+'How did you get here?': 'How did you get here?',
+'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': 'Introduction',
+'Invalid email': 'E-mail invalide',
+'Invalid Query': 'Requête Invalide',
+'invalid request': 'requête invalide',
+'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',
+'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?',
+'Main Menu': 'Menu principal',
+'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",
+'Object or table name': 'Object or table name',
+'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 fields don't match": 'Les mots de passe ne correspondent pas',
+'Plugins': 'Plugiciels',
+'Powered by': 'Alimenté par',
+'Preface': 'Préface',
+'previous 100 rows': '100 lignes précédentes',
+'Python': 'Python',
+'Query:': 'Requête:',
+'Quick Examples': 'Examples Rapides',
+'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",
+'Register': "S'inscrire",
+'register': "s'inscrire",
+'Registration identifier': 'Registration identifier',
+'Registration key': "Clé d'enregistrement",
+'Remember me (for 30 days)': 'Se souvenir de moi (pendant 30 jours)',
+'Request reset password': 'Demande de réinitialiser le mot clé',
+'Reset Password key': 'Réinitialiser le mot clé',
+'Resources': 'Ressources',
+'Role': 'Rôle',
+'Rows in Table': 'Lignes du tableau',
+'Rows selected': 'Lignes sélectionnées',
+'Semantic': 'Sémantique',
+'Services': 'Services',
+'state': 'état',
+'Stylesheet': 'Feuille de style',
+'Submit': 'Soumettre',
+'Support': 'Support',
+'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
+'Table': '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 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",
+'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',
+'Verify Password': 'Vérifiez le mot de passe',
+'Videos': 'Vidéos',
+'View': 'Présentation',
+'Web2py': 'Web2py',
+'Welcome': 'Bienvenu',
+'Welcome %s': 'Bienvenue %s',
+'Welcome to web2py': 'Bienvenue à web2py',
+'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",
+}
87 languages/hi.py
@@ -0,0 +1,87 @@
+# coding: utf8
+{
+'!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 चुना हुआ',
+'Administrative interface': 'प्रशासनिक इंटरफेस के लिए यहाँ क्लिक करें',
+'Available Databases and Tables': 'उपलब्ध डेटाबेस और तालिका',
+'Cannot be empty': 'खाली नहीं हो सकता',
+'Change Password': 'पासवर्ड बदलें',
+'Check to delete': 'हटाने के लिए चुनें',
+'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',
+'design': 'रचना करें',
+'done!': 'हो गया!',
+'edit profile': 'edit profile',
+'export as csv file': 'csv फ़ाइल के रूप में निर्यात',
+'insert new': 'नया डालें',
+'insert new %s': 'नया %s डालें',
+'invalid request': 'अवैध अनुरोध',
+'login': 'login',
+'logout': 'logout',
+'new record inserted': 'नया रेकॉर्ड डाला',
+'next 100 rows': 'अगले 100 पंक्तियाँ',
+'or import from csv file': 'या csv फ़ाइल से आयात',
+'previous 100 rows': 'पिछले 100 पंक्तियाँ',
+'Record': 'Record',
+'record does not exist': 'रिकॉर्ड मौजूद नहीं है',
+'Record id': 'रिकॉर्ड पहचानकर्ता (आईडी)',
+'register': 'register',
+'state': 'स्थिति',
+'Table': 'तालिका',
+'unable to parse csv file': 'csv फ़ाइल पार्स करने में असमर्थ',
+}
98 languages/hu.py
@@ -0,0 +1,98 @@
+# coding: utf8
+{
+'!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',
+'Administrative interface': 'az adminisztrációs felületért kattints ide',
+'Available Databases and Tables': 'Elérhető adatbázisok és táblák',
+'Cannot be empty': 'Nem lehet üres',
+'Check to delete': 'Törléshez válaszd ki',
+'Client IP': 'Client IP',
+'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',
+'design': 'design',
+'done!': 'kész!',
+'edit profile': 'profil szerkesztése',
+'export as csv file': 'exportál csv fájlba',
+'insert new': 'új beillesztése',
+'insert new %s': 'új beillesztése %s',
+'invalid request': 'hibás kérés',
+'login': 'belép',
+'logout': 'kilép',
+'lost password': 'elveszett jelszó',
+'new record inserted': 'új bejegyzés felvéve',
+'next 100 rows': 'következő 100 sor',
+'or import from csv file': 'vagy betöltés csv fájlból',
+'previous 100 rows': 'előző 100 sor',
+'Record': 'bejegyzés',
+'record does not exist': 'bejegyzés nem létezik',
+'Record id': 'bejegyzés id',
+'register': 'regisztráció',
+'state': 'állapot',
+'Table': 'tábla',
+'unable to parse csv file': 'nem lehet a csv fájlt beolvasni',
+}
188 languages/it.py
@@ -0,0 +1,188 @@
+# coding: utf8
+{
+'!langcode!': 'it',
+'!langname!': 'Italiano',
+'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" è un\'espressione opzionale come "campo1=\'nuovo valore\'". Non si può fare "update" o "delete" dei risultati di un JOIN ',
+'%d seconds ago': '%d seconds ago',
+'%s %%{row} deleted': '%s righe ("record") cancellate',
+'%s %%{row} updated': '%s righe ("record") modificate',
+'%s selected': '%s selezionato',
+'%Y-%m-%d': '%d/%m/%Y',
+'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
+'@markmin\x01Number of entries: **%s**': 'Number of entries: **%s**',
+'About': 'About',
+'Access Control': 'Access Control',
+'Administrative Interface': 'Administrative Interface',
+'Administrative interface': 'Interfaccia amministrativa',
+'Ajax Recipes': 'Ajax Recipes',
+'appadmin is disabled because insecure channel': 'Amministrazione (appadmin) disabilitata: comunicazione non sicura',
+'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
+'Available Databases and Tables': 'Database e tabelle disponibili',
+'Buy this book': 'Buy this book',
+'cache': 'cache',
+'Cannot be empty': 'Non può essere vuoto',
+'change password': 'Cambia password',
+'Check to delete': 'Seleziona per cancellare',
+'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',
+'Created By': 'Created By',
+'Created On': 'Created On',
+'Current request':