diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..39a6f517 --- /dev/null +++ b/.gitignore @@ -0,0 +1,56 @@ +.* +*.pyc +*.pyo +*~ +#* +*.1 +*.bak +*.bak2 +*.svn +*.w2p +*.class +*.rej +*.orig +Thumbs.db +.DS_Store +index.yaml +routes.py +logging.conf +gluon/tests/VERSION +gluon/tests/sql.log +httpserver.log +httpserver.pid +parameters*.py +./deposit +./benchmark +./build +./dist* +./dummy_tests +./optional_contrib +./ssl +./docs +./logs +./*.zip +./gluon/*.1 +./gluon/*.txt +./admin.w2p +./examples.w2p +cron.master +applications/* +!applications/welcome +!applications/welcome/* +!applications/examples +!applications/examples/* +!applications/admin +!applications/admin/* +applications/*/databases/* +applications/*/sessions/* +applications/*/errors/* +applications/*/cache/* +applications/*/uploads/* +applications/*/*.py[oc] +applications/examples/static/epydoc +applications/examples/static/sphinx +applications/admin/cron/cron.master + + diff --git a/VERSION b/VERSION index 493dafef..542b46bc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.4 (2012-01-13 23:00:13) stable +Version 1.99.4 (2012-02-14 08:44:22) stable diff --git a/applications/admin/languages/ja.py b/applications/admin/languages/ja.py new file mode 100644 index 00000000..910e8a67 --- /dev/null +++ b/applications/admin/languages/ja.py @@ -0,0 +1,186 @@ +# coding: utf8 +{ +'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', +'%Y-%m-%d': '%Y-%m-%d', +'(requires internet access)': '(インターネットアクセスが必要)', +'(something like "it-it")': '(例: "it-it")', +'Abort': '中断', +'About application': 'アプリケーションについて', +'About': 'About', +'Additional code for your application': 'アプリケーションに必要な追加記述', +'Admin language': '管理画面の言語', +'administrative interface': '管理画面', +'Administrator Password:': '管理者パスワード:', +'and rename it:': 'ファイル名を変更:', +'appadmin': 'アプリ管理画面', +'application "%s" uninstalled': '"%s"アプリケーションが削除されました', +'application compiled': 'アプリケーションがコンパイルされました', +'Application name:': 'アプリケーション名:', +'Are you sure you want to delete plugin "%s"?': '"%s"プラグインを削除してもよろしいですか?', +'Are you sure you want to delete this object?': 'このオブジェクトを削除してもよろしいですか?', +'Are you sure you want to uninstall application "%s"?': '"%s"アプリケーションを削除してもよろしいですか?', +'arguments': '引数', +'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!': '注意: 実行中のアプリケーションは編集できません!', +'Available databases and tables': '利用可能なデータベースとテーブル一覧', +'back': '戻る', +'Basics': '基本情報', +'Begin': '開始', +'cache': 'cache', +'cannot upload file "%(filename)s"': '"%(filename)s"ファイルをアップロードできません', +'Change admin password': '管理者パスワード変更', +'check all': '全てを選択', +'Check for upgrades': '更新チェック', +'Checking for upgrades...': '更新を確認中...', +'Clean': '一時データ削除', +'Click row to expand traceback': '列をクリックしてトレースバックを展開', +'code': 'コード', +'collapse/expand all': '全て開閉する', +'Compile': 'コンパイル', +'compiled application removed': 'コンパイル済みのアプリケーションが削除されました', +'Controllers': 'コントローラ', +'controllers': 'コントローラ', +'Count': '回数', +'create file with filename:': 'ファイル名:', +'Create': '作成', +'created by': '作成者', +'crontab': 'crontab', +'currently running': '現在実行中', +'currently saved or': '現在保存されているデータ または', +'database administration': 'データベース管理', +'db': 'db', +'defines tables': 'テーブル定義', +'delete all checked': '選択したデータを全て削除', +'delete plugin': 'プラグイン削除', +'Delete this file (you will be asked to confirm deletion)': 'ファイルの削除(確認画面が出ます)', +'Delete': '削除', +'Deploy on Google App Engine': 'Google App Engineにデプロイ', +'Deploy': 'デプロイ', +'design': 'デザイン', +'Detailed traceback description': '詳細なトレースバック内容', +'details': '詳細', +'direction: ltr': 'direction: ltr', +'Disable': '無効', +'docs': 'ドキュメント', +'download layouts': 'レイアウトのダウンロード', +'download plugins': 'プラグインのダウンロード', +'edit all': '全て編集', +'Edit application': 'アプリケーションを編集', +'edit views:': 'ビューの編集:', +'Edit': '編集', +'Editing file "%s"': '"%s"ファイルを編集中', +'Enable': '有効', +'Error logs for "%(app)s"': '"%(app)s"のエラーログ', +'Error snapshot': 'エラー発生箇所', +'Error ticket': 'エラーチケット', +'Error': 'エラー', +'Errors': 'エラー', +'Exception instance attributes': '例外インスタンス引数', +'exposes': '公開', +'exposes:': '公開:', +'extends': '継承', +'File': 'ファイル', +'files': 'ファイル', +'filter': 'フィルタ', +'Frames': 'フレーム', +'Functions with no doctests will result in [passed] tests.': 'doctestsのない関数は自動的にテストをパスします。', +'Generate': 'アプリ生成', +'Get from URL:': 'URLから取得:', +'go!': '実行!', +'Help': 'ヘルプ', +'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'もし上記のレポートにチケット番号が含まれる場合は、doctestを実行する前に、コントローラの実行で問題があったことを示します。これはインデントの問題やその関数の外部で問題があった場合に起きるが一般的です。\n緑色のタイトルは全てのテスト(もし定義されていれば)をパスしたことを示します。その場合、テスト結果は表示されません。', +'includes': 'インクルード', +'index': 'index', +'inspect attributes': '引数の検査', +'Install': 'インストール', +'Installed applications': 'アプリケーション一覧', +'Languages': '言語', +'languages': '言語', +'Last saved on:': '最終保存日時:', +'License for': 'License for', +'loading...': 'ロードしています...', +'locals': 'ローカル', +'Login to the Administrative Interface': '管理画面へログイン', +'Login': 'ログイン', +'Logout': 'ログアウト', +'Models': 'モデル', +'models': 'モデル', +'Modules': 'モジュール', +'modules': 'モジュール', +'New Application Wizard': '新規アプリケーション作成ウィザード', +'New application wizard': '新規アプリケーション作成ウィザード', +'new plugin installed': '新しいプラグインがインストールされました', +'New simple application': '新規アプリケーション', +'No databases in this application': 'このアプリケーションにはデータベースが存在しません', +'NO': 'いいえ', +'online designer': 'オンラインデザイナー', +'Overwrite installed app': 'アプリケーションを上書き', +'Pack all': 'パッケージ化', +'Pack compiled': 'コンパイルデータのパッケージ化', +'pack plugin': 'プラグインのパッケージ化', +'Peeking at file': 'ファイルを参照', +'plugin "%(plugin)s" deleted': '"%(plugin)s"プラグインは削除されました', +'Plugin "%s" in application': '"%s"プラグイン', +'Plugins': 'プラグイン', +'plugins': 'プラグイン', +'Powered by': 'Powered by', +'Reload routes': 'ルーティング再読み込み', +'Remove compiled': 'コンパイルデータの削除', +'request': 'リクエスト', +'response': 'レスポンス', +'restart': '最初からやり直し', +'restore': '復元', +'revert': '一つ前に戻す', +"Run tests in this file (to run all files, you may also use the button labelled 'test')": "このファイルのテストを実行(全てのファイルに対して実行する場合は、'テスト'というボタンを使用できます)", +'Save': '保存', +'Saved file hash:': '保存されたファイルハッシュ:', +'Searching:': '検索中:', +'session expired': 'セッションの有効期限が切れました', +'session': 'セッション', +'shell': 'shell', +'Site': 'サイト', +'skip to generate': 'スキップしてアプリ生成画面へ移動', +'Sorry, could not find mercurial installed': 'インストールされているmercurialが見つかりません', +'Start a new app': '新規アプリの作成', +'Start wizard': 'ウィザードの開始', +'state': 'state', +'Static files': '静的ファイル', +'static': '静的ファイル', +'Step': 'ステップ', +'test': 'テスト', +'Testing application': 'アプリケーションをテスト中', +'The application logic, each URL path is mapped in one exposed function in the controller': 'アプリケーションロジック、それぞれのURLパスはコントローラで公開されている各関数にマッピングされています', +'The data representation, define database tables and sets': 'データの表示方法, テーブルとセットの定義', +'The presentations layer, views are also known as templates': 'プレゼンテーション層、ビューはテンプレートとしても知られています', +'There are no controllers': 'コントローラがありません', +'There are no modules': 'モジュールがありません', +'There are no plugins': 'プラグインはありません', +'There are no translators, only default language is supported': '翻訳がないためデフォルト言語のみをサポートします', +'There are no views': 'ビューがありません', +'These files are served without processing, your images go here': 'これらのファイルは直接参照されます, ここに画像が入ります', +'Ticket ID': 'チケットID', +'to previous version.': '前のバージョンへ戻す。', +'To create a plugin, name a file/folder plugin_[name]': 'ファイル名/フォルダ名 plugin_[名称]としてプラグインを作成してください', +'Traceback': 'トレースバック', +'Translation strings for the application': 'アプリケーションの翻訳文字列', +'Unable to download because:': '以下の理由でダウンロードできません:', +'uncheck all': '全ての選択を解除', +'Uninstall': 'アプリ削除', +'update all languages': '全ての言語を更新', +'Upload a package:': 'パッケージをアップロード:', +'Upload and install packed application': 'パッケージのアップロードとインストール', +'upload file:': 'ファイルをアップロード:', +'upload plugin file:': 'プラグインファイルをアップロード:', +'upload': 'アップロード', +'user': 'ユーザー', +'variables': '変数', +'Version': 'バージョン', +'Versioning': 'バージョン管理', +'Views': 'ビュー', +'views': 'ビュー', +'Web Framework': 'Web Framework', +'web2py is up to date': 'web2pyは最新です', +'web2py Recent Tweets': '最近のweb2pyTweets', +'YES': 'はい', +} diff --git a/applications/admin/languages/ru-ru.py b/applications/admin/languages/ru-ru.py new file mode 100644 index 00000000..5bf12c10 --- /dev/null +++ b/applications/admin/languages/ru-ru.py @@ -0,0 +1,343 @@ +# coding: utf8 +{ +'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "Feld1 = \'newvalue". JOIN Ergebnisse können nicht aktualisiert oder gelöscht werden', +'%Y-%m-%d': '%Y-%m-%d', +'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', +'%s rows deleted': '%s строк удалено', +'%s rows updated': '%s строк обновлено', +'(requires internet access)': '(требует подключения к интернету)', +'(something like "it-it")': '(наподобие "it-it")', +'A new version of web2py is available': 'Доступна новая версия web2py', +'A new version of web2py is available: %s': 'Доступна новая версия web2py: %s', +'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\n': 'Доступна новая версия web2py: Версия 1.85.3 (2010-09-18 07:07:46)\n', +'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: This is an experimental feature and it needs more testing.': 'ВНИМАНИЕ: Это экспериментальная возможность и требует тестирования.', +'ATTENTION: you cannot edit the running application!': 'ВНИМАНИЕ: Вы не можете редактировать работающее приложение!', +'Abort': 'Отмена', +'About': 'О', +'About application': 'О приложении', +'Additional code for your application': 'Допольнительный код для вашего приложения', +'Admin is disabled because insecure channel': 'Админпанель выключена из-за небезопасного соединения', +'Admin is disabled because unsecure channel': 'Админпанель выключен из-за небезопасного соединения', +'Admin language': 'Язык админпанели', +'Administrator Password:': 'Пароль администратора:', +'Application name:': 'Название приложения:', +'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"?', +'Are you sure you want to upgrade web2py now?': 'Вы действительно хотите обновить web2py сейчас?', +'Authentication': 'Аутентификация', +'Available databases and tables': 'Доступные базы данных и таблицы', +'Cannot be empty': 'Не может быть пустым', +'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Невозможно компилировать: в приложении присутствуют ошибки. Отладьте его, исправьте ошибки и попробуйте заново.', +'Change Password': 'Изменить пароль', +'Check to delete': 'Поставьте для удаления', +'Checking for upgrades...': 'Проверка обновлений...', +'Client IP': 'IP клиента', +'Controller': 'Контроллер', +'Controllers': 'Контроллеры', +'Copyright': 'Copyright', +'Create new simple application': 'Создать новое простое приложение', +'Current request': 'Текущий запрос', +'Current response': 'Текущий ответ', +'Current session': 'Текущая сессия', +'DB Model': 'Модель БД', +'DESIGN': 'ДИЗАЙН', +'Database': 'База данных', +'Date and Time': 'Дата и время', +'Delete': 'Удалить', +'Delete:': 'Удалить:', +'Deploy on Google App Engine': 'Развернуть на Google App Engine', +'Description': 'Описание', +'Design for': 'Дизайн для', +'E-mail': 'E-mail', +'EDIT': 'ПРАВКА', +'Edit': 'Правка', +'Edit Profile': 'Правка профиля', +'Edit This App': 'Правка данного приложения', +'Edit application': 'Правка приложения', +'Edit current record': 'Правка текущей записи', +'Editing Language file': 'Правка языкового файла', +'Editing file': 'Правка файла', +'Editing file "%s"': 'Правка файла "%s"', +'Enterprise Web Framework': 'Enterprise Web Framework', +'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)"', +'Exception instance attributes': 'Атрибуты объекта исключения', +'Expand Abbreviation': 'Раскрыть аббревиатуру', +'First name': 'Имя', +'Functions with no doctests will result in [passed] tests.': 'Функции без doctest будут давать [прошел] в тестах.', +'Go to Matching Pair': 'К подходящей паре', +'Group ID': 'ID группы', +'Hello World': 'Привет, Мир', +'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Если отчет выше содержит номер ошибки, это указывает на ошибку при работе контроллера, до попытки выполнить doctest. Причиной чаще является неверные отступы или ошибки в коде вне функции. \nЗеленый заголовок указывает на успешное выполнение всех тестов. В этом случае результаты тестов не показываются.', +'If you answer "yes", be patient, it may take a while to download': 'Если вы ответили "Да", потерпите, загрузка может потребовать времени', +'If you answer yes, be patient, it may take a while to download': 'Если вы ответили "Да", потерпите, загрузка может потребовать времени', +'Import/Export': 'Импорт/Экспорт', +'Index': 'Индекс', +'Installed applications': 'Установленные приложения', +'Internal State': 'Внутренний статус', +'Invalid Query': 'Неверный запрос', +'Invalid action': 'Неверное действие', +'Invalid email': 'Неверный email', +'Key bindings': 'Связываник клавиш', +'Key bindings for ZenConding Plugin': 'Связывание клавиш для плагина ZenConding', +'Language files (static strings) updated': 'Языковые файлы (статичные строки) обновлены', +'Languages': 'Языки', +'Last name': 'Фамилия', +'Last saved on:': 'Последнее сохранение:', +'Layout': 'Верстка', +'License for': 'Лицензия для', +'Login': 'Логин', +'Login to the Administrative Interface': 'Вход в интерфейс администратора', +'Logout': 'Выход', +'Lost Password': 'Забыли пароль', +'Main Menu': 'Главное меню', +'Match Pair': 'Найти пару', +'Menu Model': 'Модель меню', +'Merge Lines': 'Объединить линии', +'Models': 'Модели', +'Modules': 'Модули', +'NO': 'НЕТ', +'Name': 'Название', +'New Record': 'Новая запись', +'New application wizard': 'Мастер нового приложения', +'New simple application': 'Новое простое приложение', +'Next Edit Point': 'Следующее место правки', +'No databases in this application': 'В приложении нет базы данных', +'Origin': 'Оригинал', +'Original/Translation': 'Оригинал/Перевод', +'Password': 'Пароль', +'Peeking at file': 'Просмотр', +'Plugin "%s" in application': 'Плагин "%s" в приложении', +'Plugins': 'Плагины', +'Powered by': 'Обеспечен', +'Previous Edit Point': 'Предыдущее место правки', +'Query:': 'Запрос:', +'Record ID': 'ID записи', +'Register': 'Зарегистрироваться', +'Registration key': 'Ключ регистрации', +'Reset Password key': 'Сброс пароля', +'Resolve Conflict file': 'Решить конфликт в файле', +'Role': 'Роль', +'Rows in table': 'Строк в таблице', +'Rows selected': 'Выбрано строк', +'Save via Ajax': 'Сохранить через Ajax', +'Saved file hash:': 'Хэш сохраненного файла:', +'Searching:': 'Поиск:', +'Static files': 'Статические файлы', +'Stylesheet': 'Таблицы стилей', +'Sure you want to delete this object?': 'Действительно хотите удалить данный объект?', +'TM': 'TM', +'Table name': 'Название таблицы', +'Testing application': 'Тест приложения', +'Testing controller': 'Тест контроллера', +'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" является условием вида "db.table1.field1 == \'значение\'". Что-либо типа "db.table1.field1 db.table2.field2 ==" ведет к SQL JOIN.', +'The application logic, each URL path is mapped in one exposed function in the controller': 'Логика приложения, каждый URL отображается к одной функции в контроллере', +'The data representation, define database tables and sets': 'Представление данных, определите таблицы базы данных и наборы', +'The output of the file is a dictionary that was rendered by the view': 'Выводом файла является словарь, который создан в виде', +'The presentations layer, views are also known as templates': 'Слой презентации, виды так же известны, как шаблоны', +'There are no controllers': 'Отсутствуют контроллеры', +'There are no models': 'Отсутствуют модели', +'There are no modules': 'Отсутствуют модули', +'There are no plugins': 'Отсутствуют плагины', +'There are no static files': 'Отсутствуют статичные файлы', +'There are no translators, only default language is supported': 'Отсутствуют переводчики, поддерживается только стандартный язык', +'There are no views': 'Отсутствуют виды', +'These files are served without processing, your images go here': 'Эти файлы обслуживаются без обработки, ваши изображения попадут сюда', +'This is a copy of the scaffolding application': 'Это копия сгенерированного приложения', +'This is the %(filename)s template': 'Это шаблон %(filename)s', +'Ticket': 'Тикет', +'Timestamp': 'Время', +'To create a plugin, name a file/folder plugin_[name]': 'Для создания плагина назовите файл/папку plugin_[название]', +'Translation strings for the application': 'Строки перевода для приложения', +'Unable to check for upgrades': 'Невозможно проверить обновления', +'Unable to download': 'Невозможно загрузить', +'Unable to download app': 'Невозможно загрузить', +'Update:': 'Обновить:', +'Upload & install packed application': 'Загрузить и установить приложение в архиве', +'Upload a package:': 'Загрузить пакет:', +'Upload existing application': 'Загрузить существующее приложение', +'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Используйте (...)&(...) для AND, (...)|(...) для OR, и ~(...) для NOT при создании сложных запросов.', +'Use an url:': 'Используйте url:', +'User ID': 'ID пользователя', +'Version': 'Версия', +'View': 'Вид', +'Views': 'Виды', +'Welcome %s': 'Добро пожаловать, %s', +'Welcome to web2py': 'Добро пожаловать в web2py', +'Which called the function': 'Который вызвал функцию', +'Wrap with Abbreviation': 'Заключить в аббревиатуру', +'YES': 'ДА', +'You are successfully running web2py': 'Вы успешно запустили web2by', +'You can modify this application and adapt it to your needs': 'Вы можете изменить это приложение и подогнать под свои нужды', +'You visited the url': 'Вы посетили URL', +'About': 'О', +'additional code for your application': 'добавочный код для вашего приложения', +'admin disabled because no admin password': 'админка отключена, потому что отсутствует пароль администратора', +'admin disabled because not supported on google apps engine': 'админка отключена, т.к. не поддерживается на google app engine', +'admin disabled because unable to access password file': 'админка отключена, т.к. невозможно получить доступ к файлу с паролями ', +'administrative interface': 'интерфейс администратора', +'and rename it (required):': 'и переименуйте его (необходимо):', +'and rename it:': ' и переименуйте его:', +'appadmin': 'appadmin', +'appadmin is disabled because insecure channel': 'Appadmin отключен, т.к. соединение не безопасно', +'application "%s" uninstalled': 'Приложение "%s" удалено', +'application compiled': 'Приложение скомпилировано', +'application is compiled and cannot be designed': 'Приложение скомпилировано и дизайн не может быть изменен', +'arguments': 'аргументы', +'back': 'назад', +'beautify': 'Раскрасить', +'cache': 'кэш', +'cache, errors and sessions cleaned': 'Кэш, ошибки и сессии очищены', +'call': 'вызов', +'cannot create file': 'Невозможно создать файл', +'cannot upload file "%(filename)s"': 'Невозможно загрузить файл "%(filename)s"', +'Change admin password': 'Изменить пароль администратора', +'change password': 'изменить пароль', +'check all': 'проверить все', +'Check for upgrades': 'проверить обновления', +'Clean': 'Очистить', +'click here for online examples': 'нажмите здесь для онлайн примеров', +'click here for the administrative interface': 'нажмите здесь для интерфейса администратора', +'click to check for upgrades': 'нажмите для проверки обновления', +'code': 'код', +'collapse/expand all': 'свернуть/развернуть все', +'Compile': 'Компилировать', +'compiled application removed': 'скомпилированное приложение удалено', +'controllers': 'контроллеры', +'Create': 'Создать', +'create file with filename:': 'Создать файл с названием:', +'create new application:': 'создать новое приложение:', +'created by': 'создано', +'crontab': 'crontab', +'currently running': 'сейчас работает', +'currently saved or': 'сейчас сохранено или', +'customize me!': 'настрой меня!', +'data uploaded': 'дата загрузки', +'database': 'база данных', +'database %s select': 'Выбор базы данных %s ', +'database administration': 'администраторирование базы данных', +'db': 'бд', +'defines tables': 'определить таблицы', +'delete': 'удалить', +'delete all checked': 'удалить выбранные', +'delete plugin': 'удалить плагин', +'Deploy': 'Развернуть', +'design': 'дизайн', +'direction: ltr': 'направление: ltr', +'documentation': 'документация', +'done!': 'выполнено!', +'download layouts': 'загрузить шаблоны', +'download plugins': 'загрузить плагины', +'Edit': 'Правка', +'edit controller': 'правка контроллера', +'edit profile': 'правка профиля', +'edit views:': 'правка видов:', +'Errors': 'Ошибка', +'escape': 'escape', +'export as csv file': 'Экспорт в CSV', +'exposes': 'открывает', +'extends': 'расширяет', +'failed to reload module': 'невозможно загрузить модуль', +'file "%(filename)s" created': 'файл "%(filename)s" создан', +'file "%(filename)s" deleted': 'файл "%(filename)s" удален', +'file "%(filename)s" uploaded': 'файл "%(filename)s" загружен', +'file "%(filename)s" was not deleted': 'файл "%(filename)s" не был удален', +'file "%s" of %s restored': 'файл "%s" из %s восстановлен', +'file changed on disk': 'файл изменился на диске', +'file does not exist': 'файл не существует', +'file saved on %(time)s': 'файл сохранен %(time)s', +'file saved on %s': 'файл сохранен %s', +'files': 'файлы', +'filter': 'фильтр', +'Help': 'Помощь', +'htmledit': 'htmledit', +'includes': 'включает', +'index': 'index', +'insert new': 'вставить новый', +'insert new %s': 'вставить новый %s', +'Install': 'Установить', +'internal error': 'внутренняя ошибка', +'invalid password': 'неверный пароль', +'invalid request': 'неверный запрос', +'invalid ticket': 'неверный тикет', +'language file "%(filename)s" created/updated': 'Языковой файл "%(filename)s" создан/обновлен', +'languages': 'языки', +'languages updated': 'языки обновлены', +'loading...': 'загрузка...', +'located in the file': 'расположенный в файле', +'login': 'логин', +'Logout': 'выход', +'lost password?': 'Пароль утерен?', +'merge': 'объединить', +'models': 'модели', +'modules': 'модули', +'new application "%s" created': 'новое приложение "%s" создано', +'new record inserted': 'новая запись вставлена', +'next 100 rows': 'следующие 100 строк', +'or import from csv file': 'или испорт из cvs файла', +'or provide app url:': 'или URL приложения:', +'or provide application url:': 'или URL приложения:', +'Overwrite installed app': 'Переписать на установленное приложение', +'Pack all': 'упаковать все', +'Pack compiled': 'Архив скомпилирован', +'pack plugin': 'Упаковать плагин', +'please wait!': 'подождите, пожалуйста!', +'plugins': 'плагины', +'previous 100 rows': 'предыдущие 100 строк', +'record': 'запись', +'record does not exist': 'запись не существует', +'record id': 'id записи', +'register': 'зарегистрироваться', +'Remove compiled': 'Удалить скомпилированное', +'restore': 'восстановить', +'revert': 'откатиться', +'save': 'сохранить', +'selected': 'выбрано', +'session expired': 'сессия истекла', +'shell': 'shell', +'Site': 'сайт', +'some files could not be removed': 'некоторые файлы нельзя удалить', +'Start wizard': 'запустить мастер', +'state': 'статус', +'static': 'статичные файлы', +'submit': 'Отправить', +'table': 'таблица', +'test': 'тест', +'test_def': 'test_def', +'test_for': 'test_for', +'test_if': 'test_if', +'test_try': 'test_try', +'the application logic, each URL path is mapped in one exposed function in the controller': 'Логика приложения, каждый URL отображается в открытую функцию в контроллере', +'the data representation, define database tables and sets': 'представление данных, определить таблицы и наборы', +'the presentations layer, views are also known as templates': 'слой представления, виды известные так же как шаблоны', +'these files are served without processing, your images go here': 'Эти файлы обслуживаются без обработки, ваши изображения попадут сюда', +'to previous version.': 'на предыдущую версию.', +'translation strings for the application': 'строки перевода для приложения', +'try': 'try', +'try something like': 'попробовать что-либо вида', +'unable to create application "%s"': 'невозможно создать приложение "%s" nicht möglich', +'unable to delete file "%(filename)s"': 'невозможно удалить файл "%(filename)s"', +'unable to parse csv file': 'невозможно разобрать файл csv', +'unable to uninstall "%s"': 'невозможно удалить "%s"', +'uncheck all': 'снять выбор всего', +'Uninstall': 'Удалить', +'update': 'обновить', +'update all languages': 'обновить все языки', +'upgrade web2py now': 'обновить web2py сейчас', +'upload': 'загрузить', +'upload application:': 'загрузить файл:', +'upload file:': 'загрузить файл:', +'upload plugin file:': 'загрузить файл плагина:', +'user': 'пользователь', +'variables': 'переменные', +'versioning': 'версии', +'view': 'вид', +'views': 'виды', +'web2py Recent Tweets': 'последние твиты по web2py', +'web2py is up to date': 'web2py обновлен', +'xml': 'xml', +} + + diff --git a/applications/admin/static/js/web2py.js b/applications/admin/static/js/web2py.js index 0b8dbf5b..64b0f3a1 100644 --- a/applications/admin/static/js/web2py.js +++ b/applications/admin/static/js/web2py.js @@ -23,10 +23,6 @@ function ajax(u,s,t) { String.prototype.reverse = function () { return this.split('').reverse().join('');}; function web2py_ajax_fields(target) { - jQuery('input.integer', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); - jQuery('input.double,input.decimal', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); - var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; - jQuery("input[type='checkbox'].delete", target).live('click',function(){ if(this.checked) if(!confirm(confirm_message)) this.checked=false; }); var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d"; var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S"; jQuery("input.date",target).each(function() {Calendar.setup({inputField:this, ifFormat:date_format, showsTime:false });}); @@ -38,17 +34,26 @@ function web2py_ajax_fields(target) { function web2py_ajax_init(target) { jQuery('.hidden', target).hide(); jQuery('.error', target).hide().slideDown('slow'); - jQuery('.flash', target).click(function(e) { jQuery(this).fadeOut('slow'); e.preventDefault(); }); - // jQuery('input[type=submit]').click(function(){var t=jQuery(this);t.hide();t.after('')}); web2py_ajax_fields(target); }; +function web2py_event_handlers() { + var doc = jQuery(document) + doc.on('click', '.flash', function(e){jQuery(this).fadeOut('slow'); e.preventDefault();}); + doc.on('keyup', 'input.integer', function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); + doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); + var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; + doc.on('click', "input[type='checkbox'].delete", function(){if(this.checked) if(!confirm(confirm_message)) this.checked=false;}); +}; + jQuery(function() { var flash = jQuery('.flash'); flash.hide(); if(flash.html()) flash.slideDown(); web2py_ajax_init(document); + web2py_event_handlers(); }); + function web2py_trap_form(action,target) { jQuery('#'+target+' form').each(function(i){ var form=jQuery(this); @@ -60,6 +65,7 @@ function web2py_trap_form(action,target) { }); }); } + function web2py_trap_link(target) { jQuery('#'+target+' a.w2p_trap').each(function(i){ var link=jQuery(this); @@ -70,11 +76,12 @@ function web2py_trap_link(target) { }); }); } -function web2py_ajax_page(method,action,data,target) { - jQuery.ajax({'type':method,'url':action,'data':data, + +function web2py_ajax_page(method, action, data, target) { + jQuery.ajax({'type':method, 'url':action, 'data':data, 'beforeSend':function(xhr) { - xhr.setRequestHeader('web2py-component-location',document.location); - xhr.setRequestHeader('web2py-component-element',target);}, + xhr.setRequestHeader('web2py-component-location', document.location); + xhr.setRequestHeader('web2py-component-element', target);}, 'complete':function(xhr,text){ var html=xhr.responseText; var content=xhr.getResponseHeader('web2py-component-content'); @@ -87,14 +94,18 @@ function web2py_ajax_page(method,action,data,target) { web2py_trap_form(action,target); web2py_trap_link(target); web2py_ajax_init('#'+target); - if(command) eval(command); - if(flash) jQuery('.flash').html(flash).slideDown(); + if(command) + eval(decodeURIComponent(escape(command))); + if(flash) + jQuery('.flash').html(decodeURIComponent(escape(flash))).slideDown(); } }); } + function web2py_component(action,target) { - jQuery(function(){ web2py_ajax_page('get',action,null,target); }); + jQuery(function(){web2py_ajax_page('get',action,null,target);}); } + function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { var ws = new WebSocket(url); diff --git a/applications/examples/private/content/en/default/documentation/more.markmin b/applications/examples/private/content/en/default/documentation/more.markmin index 81a55093..854e076d 100644 --- a/applications/examples/private/content/en/default/documentation/more.markmin +++ b/applications/examples/private/content/en/default/documentation/more.markmin @@ -6,9 +6,9 @@ - [[Twitter http://twitter.com/#!/web2py]] - [[User Voice http://web2py.uservoice.com/ popup]] -#### Learning -- [[Interactive Demo http://www.web2py.com/demo_admin popup]] -- [[Quick Examples http://www.web2py.com/examples/default/examples]] +#### Learning and Demos +- [[Admin Demo http://www.web2py.com/demo_admin popup]] (web-based IDE) +- [[Welcome App Demo http://www.web2py.com/welcome]] (scaffolding application) - [[Videos http://www.web2py.com/examples/default/videos/]] - [[FAQ http://www.web2py.com/AlterEgo popup]] diff --git a/applications/examples/private/content/en/default/documentation/official.markmin b/applications/examples/private/content/en/default/documentation/official.markmin index 45dd1dbe..76303290 100644 --- a/applications/examples/private/content/en/default/documentation/official.markmin +++ b/applications/examples/private/content/en/default/documentation/official.markmin @@ -3,5 +3,7 @@ - [[**web2py Online Book (english)** http://web2py.com/book popup]] - [[web2py Online Book (spanish) http://www.latinuxpress.com/books/drafts/web2py/ popup]] - [[Buy E-book/Printed Version http://stores.lulu.com/web2py popup]] +- [[web2py Application Development Cookbook http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2py.com&utm_medium=link&utm_content=pod&utm_campaign=mdb_009617]] +- [[Quick Examples http://www.web2py.com/examples/default/examples]] - [[API http://web2py.com/book/default/chapter/04#API popup]] - [[Epydoc (source code documentation) http://www.web2py.com/examples/static/epydoc/index.html popup]] diff --git a/applications/examples/private/content/en/default/what/whyweb2py.markmin b/applications/examples/private/content/en/default/what/whyweb2py.markmin index bb323fed..7f68bc0c 100644 --- a/applications/examples/private/content/en/default/what/whyweb2py.markmin +++ b/applications/examples/private/content/en/default/what/whyweb2py.markmin @@ -9,7 +9,7 @@ - **Secure** [[It prevents the most common types of vulnerabilities http://web2py.com/examples/default/security]] including Cross Site Scripting, Injection Flaws, and Malicious File Execution. - **Enforces good Software Engineering practices** (Model-View-Controller design, Server-side form validation, postbacks) that make the code more readable, scalable, and maintainable. - **Speaks multiple protocols** HTML/XML, RSS/ATOM, RTF, PDF, JSON, AJAX, XML-RPC, CSV, REST, WIKI, Flash/AMF, and Linked Data (RDF). -- **Includes** a SSL-enabled and streaming-capable web server, a relational database, a web-based integrated development environment and web-based management interface, a Database Abstraction Layer that writes SQL for you in real time, internationalization support, multiple authentication methods, role based access control, an error logging and ticketing system, multiple caching methods for scalability, the jQuery library for AJAX and effects. +- **Includes** an SSL-enabled and streaming-capable web server, a relational database, a web-based integrated development environment and web-based management interface, a Database Abstraction Layer that writes SQL for you in real time, internationalization support, multiple authentication methods, role based access control, an error logging and ticketing system, multiple caching methods for scalability, the jQuery library for AJAX and effects, and a [[scaffolding application http://www.web2py.com/welcome]] to jumpstart development. The best way to understand web2py is to try it. You can try it online [[here http://www.web2py.com/demo_admin]] (this online version is identical to the actual web2py although some functions are disabled for security reasons). diff --git a/applications/examples/static/css/examples.css b/applications/examples/static/css/examples.css index 32d71724..707211b6 100644 --- a/applications/examples/static/css/examples.css +++ b/applications/examples/static/css/examples.css @@ -37,7 +37,7 @@ sup { line-height: 2em; vertical-align: top; } -ul { list-style: circle outside;} +ul { list-style: circle outside; padding-left: 30px;} .frame { border: 3px solid #959595; diff --git a/applications/examples/static/css/web2py.css b/applications/examples/static/css/web2py.css index 63a8fcfd..ab9beaf2 100644 --- a/applications/examples/static/css/web2py.css +++ b/applications/examples/static/css/web2py.css @@ -30,6 +30,7 @@ small { font-size: 0.8em; } textarea { width: 600px; } code { font-family: Courier;} input[type=text], input[type=password], select { width: 300px; } +ul { list-style-type: none; margin: 0px; padding: 0px; } /** end **/ /* Sticky footer begin */ @@ -193,7 +194,7 @@ div.error { .web2py_paginator { border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } .web2py_grid a { text-decoration:none;} .web2py_grid table { width: 100% } -.web2py_grid td { white-space:nowrap; } +.web2py_grid td { white-space:normal; } .web2py_grid tbody td { padding: 2px 5px 2px 5px; line-height: 13.5px; diff --git a/applications/examples/static/js/web2py.js b/applications/examples/static/js/web2py.js index 0b8dbf5b..64b0f3a1 100644 --- a/applications/examples/static/js/web2py.js +++ b/applications/examples/static/js/web2py.js @@ -23,10 +23,6 @@ function ajax(u,s,t) { String.prototype.reverse = function () { return this.split('').reverse().join('');}; function web2py_ajax_fields(target) { - jQuery('input.integer', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); - jQuery('input.double,input.decimal', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); - var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; - jQuery("input[type='checkbox'].delete", target).live('click',function(){ if(this.checked) if(!confirm(confirm_message)) this.checked=false; }); var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d"; var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S"; jQuery("input.date",target).each(function() {Calendar.setup({inputField:this, ifFormat:date_format, showsTime:false });}); @@ -38,17 +34,26 @@ function web2py_ajax_fields(target) { function web2py_ajax_init(target) { jQuery('.hidden', target).hide(); jQuery('.error', target).hide().slideDown('slow'); - jQuery('.flash', target).click(function(e) { jQuery(this).fadeOut('slow'); e.preventDefault(); }); - // jQuery('input[type=submit]').click(function(){var t=jQuery(this);t.hide();t.after('')}); web2py_ajax_fields(target); }; +function web2py_event_handlers() { + var doc = jQuery(document) + doc.on('click', '.flash', function(e){jQuery(this).fadeOut('slow'); e.preventDefault();}); + doc.on('keyup', 'input.integer', function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); + doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); + var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; + doc.on('click', "input[type='checkbox'].delete", function(){if(this.checked) if(!confirm(confirm_message)) this.checked=false;}); +}; + jQuery(function() { var flash = jQuery('.flash'); flash.hide(); if(flash.html()) flash.slideDown(); web2py_ajax_init(document); + web2py_event_handlers(); }); + function web2py_trap_form(action,target) { jQuery('#'+target+' form').each(function(i){ var form=jQuery(this); @@ -60,6 +65,7 @@ function web2py_trap_form(action,target) { }); }); } + function web2py_trap_link(target) { jQuery('#'+target+' a.w2p_trap').each(function(i){ var link=jQuery(this); @@ -70,11 +76,12 @@ function web2py_trap_link(target) { }); }); } -function web2py_ajax_page(method,action,data,target) { - jQuery.ajax({'type':method,'url':action,'data':data, + +function web2py_ajax_page(method, action, data, target) { + jQuery.ajax({'type':method, 'url':action, 'data':data, 'beforeSend':function(xhr) { - xhr.setRequestHeader('web2py-component-location',document.location); - xhr.setRequestHeader('web2py-component-element',target);}, + xhr.setRequestHeader('web2py-component-location', document.location); + xhr.setRequestHeader('web2py-component-element', target);}, 'complete':function(xhr,text){ var html=xhr.responseText; var content=xhr.getResponseHeader('web2py-component-content'); @@ -87,14 +94,18 @@ function web2py_ajax_page(method,action,data,target) { web2py_trap_form(action,target); web2py_trap_link(target); web2py_ajax_init('#'+target); - if(command) eval(command); - if(flash) jQuery('.flash').html(flash).slideDown(); + if(command) + eval(decodeURIComponent(escape(command))); + if(flash) + jQuery('.flash').html(decodeURIComponent(escape(flash))).slideDown(); } }); } + function web2py_component(action,target) { - jQuery(function(){ web2py_ajax_page('get',action,null,target); }); + jQuery(function(){web2py_ajax_page('get',action,null,target);}); } + function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { var ws = new WebSocket(url); diff --git a/applications/examples/views/default/index.html b/applications/examples/views/default/index.html index e587719f..46783d29 100644 --- a/applications/examples/views/default/index.html +++ b/applications/examples/views/default/index.html @@ -39,7 +39,7 @@
Start with some quick examples, then read the reference manual, watch videos, and join a user group for discussion. Take advantage of the layouts, plugins, and recipes.
+Start with some quick examples, then read the manual, watch videos, and join a user group for discussion. Take advantage of the layouts, plugins, appliances, and recipes.