[Jifty-commit] r4348 - in jifty/branches/virtual-models: . lib/Jifty lib/Jifty/Action lib/Jifty/Param lib/Jifty/Plugin lib/Jifty/Plugin/Authentication/Password/Mixin/Model lib/Jifty/Plugin/AutoReference lib/Jifty/Plugin/CompressedCSSandJS lib/Jifty/Plugin/I18N lib/Jifty/Plugin/I18N/Action lib/Jifty/Plugin/OAuth lib/Jifty/Plugin/OAuth/Action lib/Jifty/Plugin/SkeletonApp lib/Jifty/Request lib/Jifty/Script lib/Jifty/View/Static lib/Jifty/Web share/plugins/Jifty/Plugin/AutoReference/web/static/js share/plugins/Jifty/Plugin/I18N share/plugins/Jifty/Plugin/I18N/web share/plugins/Jifty/Plugin/I18N/web/static share/plugins/Jifty/Plugin/I18N/web/static/js share/po share/web/static/js t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Model t/TestApp-Plugin-OAuth/t t/TestApp-Plugin-OnClick t/TestApp-Plugin-OnClick/bin t/TestApp-Plugin-OnClick/doc t/TestApp-Plugin-OnClick/etc t/TestApp-Plugin-OnClick/lib t/TestApp-Plugin-OnClick/lib/TestApp t/TestApp-Plugin-OnClick/lib/TestApp/Plugin t/TestApp-Plugin-OnClick/lib/TestApp/Plugin/OnClick t/TestApp-Plugin-OnClick/log t/TestApp-Plugin-OnClick/share t/TestApp-Plugin-OnClick/share/po t/TestApp-Plugin-OnClick/share/web t/TestApp-Plugin-OnClick/share/web/static t/TestApp-Plugin-OnClick/share/web/static/js t/TestApp-Plugin-OnClick/share/web/templates t/TestApp-Plugin-OnClick/t t/TestApp-Plugin-OnClick/var

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Wed Oct 31 13:27:41 EDT 2007


Author: sterling
Date: Wed Oct 31 13:27:40 2007
New Revision: 4348

Added:
   jifty/branches/virtual-models/lib/Jifty/Plugin/I18N/
   jifty/branches/virtual-models/lib/Jifty/Plugin/I18N.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/I18N/Action/
   jifty/branches/virtual-models/lib/Jifty/Plugin/I18N/Action/SetLang.pm
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/web/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/web/static/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/web/static/js/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/web/static/js/loc.js
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/Makefile.PL
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/bin/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/bin/jifty   (contents, props changed)
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/doc/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/etc/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/etc/config.yml
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/lib/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/lib/TestApp/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/lib/TestApp/Plugin/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/lib/TestApp/Plugin/OnClick/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/log/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/po/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/static/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/static/js/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/content.html
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/content1.html
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/onclick.html
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/t/
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/t/onclick.t
   jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/var/
Modified:
   jifty/branches/virtual-models/   (props changed)
   jifty/branches/virtual-models/AUTHORS
   jifty/branches/virtual-models/META.yml
   jifty/branches/virtual-models/Makefile.PL
   jifty/branches/virtual-models/lib/Jifty/Action/Record.pm
   jifty/branches/virtual-models/lib/Jifty/I18N.pm
   jifty/branches/virtual-models/lib/Jifty/JSON.pm
   jifty/branches/virtual-models/lib/Jifty/Param/Schema.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference/Widget.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Action/AuthorizeRequestToken.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Dispatcher.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/AccessToken.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/RequestToken.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/View.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/View.pm
   jifty/branches/virtual-models/lib/Jifty/Request/Mapper.pm
   jifty/branches/virtual-models/lib/Jifty/Script/Schema.pm
   jifty/branches/virtual-models/lib/Jifty/View/Static/Handler.pm
   jifty/branches/virtual-models/lib/Jifty/Web.pm
   jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/AutoReference/web/static/js/autoreference.js
   jifty/branches/virtual-models/share/po/ja.po
   jifty/branches/virtual-models/share/po/zh_tw.po
   jifty/branches/virtual-models/share/web/static/js/prototype.js
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Dispatcher.pm
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Model/User.pm
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Test.pm
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/00-test-setup.t
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/01-basic.t
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/02-request-token.t
   jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/03-authorize.t

Log:
 r13798 at riddle:  andrew | 2007-10-31 12:06:06 -0500
 Merge down from trunk.
  r13633 at riddle:  andrew | 2007-10-24 10:23:18 -0500
   r13615 at riddle (orig r4283):  clkao | 2007-10-21 11:48:36 -0500
   our version of prototype can't deal with synchronous request.
   r13616 at riddle (orig r4284):  clkao | 2007-10-21 11:52:49 -0500
   Support serving json version of po and localization in javascript
   space.
   
   r13617 at riddle (orig r4285):  audreyt | 2007-10-21 15:08:25 -0500
   * Jifty::Request::Mapper - Avoid uninitialized warnings when
     $args{destination} ends up undefined.
   r13618 at riddle (orig r4286):  audreyt | 2007-10-21 15:25:26 -0500
   * Jifty::I18N::promote_encoding:
   
       Multi-part form data have no notion of charsets, so we return the string
       verbatim here, to avoid the "Unquoted / not allowed in Content-Type"
       warnings when the Base64-encoded MIME boundary string contains "/".
   
     Prompted by this Content-Type header found in real world:
       multipart/form-data; boundary=----WebKitFormBoundaryRqXyEnBQ/5VSsexe
   
     which triggered this error:
       -- 2007/10/22 04:19:30 WARN> Carp.pm:46 Carp::carp
       Unquoted / not allowed in Content-Type! at /usr/local/lib/perl5/site_perl/5.9.5/Jifty/I18N.pm line 226
       -- 2007/10/22 04:19:30 WARN> Carp.pm:46 Carp::carp
       Illegal Content-Type parameter /5VSsexe at /usr/local/lib/perl5/site_perl/5.9.5/Jifty/I18N.pm line 226
   
   r13619 at riddle (orig r4287):  clkao | 2007-10-21 23:09:54 -0500
   zh_tw l10n for Authenication::Password plugin.
   r13620 at riddle (orig r4288):  sunnavy | 2007-10-22 02:44:24 -0500
   typo fix
   r13621 at riddle (orig r4289):  clkao | 2007-10-22 11:05:27 -0500
   rollback r4242 which cached the gzipped js/css even through
   develmode reload.
   
   r13622 at riddle (orig r4290):  clkao | 2007-10-22 11:16:41 -0500
   12:09 < obra> Aaaaaaaaaaaaaaaaaaaaaaaaa
   r13623 at riddle (orig r4291):  audreyt | 2007-10-22 12:03:43 -0500
   * Jifty::I18N - POD fixup.
   r13624 at riddle (orig r4292):  jesse | 2007-10-22 12:07:27 -0500
    r68158 at pinglin:  jesse | 2007-10-17 10:29:38 -0400
    * Added the ability to craft a Jifty button with a "submit" link which submits hardcoded arguments.
   
   r13625 at riddle (orig r4293):  jesse | 2007-10-22 12:07:46 -0500
    r68164 at pinglin:  jesse | 2007-10-17 11:34:30 -0400
    * Fixing long-broken support for the "JIFTY_FASTTEST" env variable
   
   r13626 at riddle (orig r4294):  jesse | 2007-10-22 12:07:51 -0500
    r68165 at pinglin:  jesse | 2007-10-17 11:35:39 -0400
    added a bit more semantic markup to the crud view
   
   r13627 at riddle (orig r4295):  jesse | 2007-10-22 12:10:34 -0500
    r68166 at pinglin:  jesse | 2007-10-17 11:45:22 -0400
    
    * working toward onclick => { submit => { action => $action,    
                                    arguments => { foo => 'value', bar => 'other value'} }}
    
    Jifty's js still needs help
    r68365 at pinglin:  jesse | 2007-10-22 13:06:27 -0400
    * Fixes to not cache compressed css+js while in devel mode.
    * Refactoring js compression code into the plugin where it belongs.
   
   r13628 at riddle (orig r4296):  clkao | 2007-10-23 03:04:22 -0500
   allow switching current language for Localization.
   r13629 at riddle (orig r4297):  ishigaki | 2007-10-23 07:29:43 -0500
   Modules other than Net::OAuth::Request in Net-OAuth distro don't have version
   r13630 at riddle (orig r4298):  sartak | 2007-10-23 11:20:03 -0500
    r44064 at onn:  sartak | 2007-10-23 12:19:36 -0400
    Ah ha, plugins need to be very careful about loading appclass models, because classloader isn't set up for them yet
   
   r13631 at riddle (orig r4299):  ishigaki | 2007-10-23 11:42:30 -0500
   updated ja.po
   r13632 at riddle (orig r4300):  clkao | 2007-10-24 02:08:22 -0500
   loc.js cleanups.
  
  r13634 at riddle:  andrew | 2007-10-24 10:29:05 -0500
  Adding File::Temp 0.15 requirement for cleanup().
  r13635 at riddle:  andrew | 2007-10-24 10:29:46 -0500
  Minor edit: fixing reference to Jifty::Request::Action to Jifty::Action
  r13638 at riddle:  andrew | 2007-10-24 11:23:50 -0500
  Undoing 4302. There is such a class. Thanks to chmrr.
  r13657 at riddle:  andrew | 2007-10-26 10:54:50 -0500
   r13647 at riddle (orig r4304):  alexmv | 2007-10-24 13:02:04 -0500
    r23967 at zoq-fot-pik:  chmrr | 2007-10-24 13:57:17 -0400
     * Menu class is undef by default; fall back to the empty string
   
   r13649 at riddle (orig r4306):  sartak | 2007-10-24 13:07:57 -0500
    r44126 at onn:  sartak | 2007-10-24 14:07:37 -0400
    Bump JDBI dep to 0.45 (Filter::DateTime changes)
   
   r13650 at riddle (orig r4307):  sunnavy | 2007-10-24 15:50:36 -0500
   added TestApp-Plugin-OnClick, initially for the update of prototype.js
   r13651 at riddle (orig r4308):  sartak | 2007-10-24 16:25:05 -0500
    r44156 at onn:  sartak | 2007-10-24 17:24:51 -0400
    Add a hook to change a menu item's label 
   
   r13654 at riddle (orig r4311):  sartak | 2007-10-25 13:28:39 -0500
    r44178 at onn:  sartak | 2007-10-25 14:28:11 -0400
    Remove the unused drop-column logic from jifty schema --setup, since ->columns returns only active cols
   
  
  r13658 at riddle:  andrew | 2007-10-26 14:24:15 -0500
  Fix it so that AutoReference fields show the _brief_description rather than the id in read mode.
  r13659 at riddle:  andrew | 2007-10-26 14:38:32 -0500
  Expanded the previous fix to cover sticky values and the initial value in the input tag.
  r13664 at riddle:  andrew | 2007-10-26 16:06:06 -0500
  Modified the JS to ignore the [id:1] text at the end of the references.
  r13668 at riddle:  andrew | 2007-10-27 01:03:49 -0500
  Fixed AutoReference so that it is possible to set the field to empty if not mandatory.
  r13791 at riddle:  andrew | 2007-10-31 11:49:20 -0500
   r13770 at riddle (orig r4322):  ruz | 2007-10-28 01:24:12 -0500
   * if refers_to is not mandatory field then add 'no_value' option to select box
   r13771 at riddle (orig r4323):  clkao | 2007-10-28 22:50:52 -0500
   Provide an after_include_javascript for plugins to do javascript initialisation.
   r13772 at riddle (orig r4324):  clkao | 2007-10-28 23:13:52 -0500
   Jifty::Plugin::I18N:
   - provides SetLang action
   - provides loc.js and other facilities to l10n your javascript along with po.
   
   r13782 at riddle (orig r4334):  sartak | 2007-10-30 12:08:52 -0500
    r44431 at onn:  sartak | 2007-10-30 13:08:19 -0400
    Get rid of spurious warning in Auth::Password plugin
   
   r13783 at riddle (orig r4335):  alexmv | 2007-10-30 12:16:38 -0500
    r24200 at zoq-fot-pik:  chmrr | 2007-10-30 13:13:53 -0400
     * Fix test count
   
   r13784 at riddle (orig r4336):  alexmv | 2007-10-30 17:22:53 -0500
    r24221 at zoq-fot-pik:  chmrr | 2007-10-30 18:21:04 -0400
     * Work around a "feature" in Hash::Merge < 0.10
   
   r13785 at riddle (orig r4337):  sartak | 2007-10-30 17:34:34 -0500
    r44433 at onn:  sartak | 2007-10-30 14:17:57 -0400
    Wrote most of the authorization tests
   
   r13786 at riddle (orig r4338):  sartak | 2007-10-30 17:34:53 -0500
   
   r13787 at riddle (orig r4339):  sartak | 2007-10-30 17:35:14 -0500
    r44443 at onn:  sartak | 2007-10-30 18:34:06 -0400
    More tests, start implementing callbacks, but failing :)
   
   r13788 at riddle (orig r4340):  agentz | 2007-10-31 03:46:06 -0500
    r2877 at agentz-office:  agentz | 2007-10-31 16:44:52 +0800
    updated my email address in AUTHORS to agentzh at agentzh.org
   
   r13789 at riddle (orig r4341):  clkao | 2007-10-31 04:03:02 -0500
   * I18N::Action::SetLang: scalar::defer is trigger some oddness,
     rewrite available languages as normal runtime code, and cached.
   
  
  r13792 at riddle:  andrew | 2007-10-31 11:57:22 -0500
  Fixing POD coverage errors in the AutoReference plugin.
 


Modified: jifty/branches/virtual-models/AUTHORS
==============================================================================
--- jifty/branches/virtual-models/AUTHORS	(original)
+++ jifty/branches/virtual-models/AUTHORS	Wed Oct 31 13:27:40 2007
@@ -19,7 +19,7 @@
 Paul Fenwick <pjf at perltraining.com.au>
 Edmund von der Burg <evdb at ecclestoad.co.uk>
 Yves Agostini <agostini at univ-metz.fr>
-Agent Zhang <agentzh at gmail.com>
+Agent Zhang <agentzh at agentzh.org>
 Pawel Murias <pmurias at woobling.org>
 Kevin Falcone <falcone at bestpractical.com>
 Andrew Sterling Hanenkamp <sterling at hanenkamp.com>

Modified: jifty/branches/virtual-models/META.yml
==============================================================================
--- jifty/branches/virtual-models/META.yml	(original)
+++ jifty/branches/virtual-models/META.yml	Wed Oct 31 13:27:40 2007
@@ -40,10 +40,10 @@
   Module::CoreList: 0
   Module::Install::Admin: 0.50
   Module::Refresh: 0.09
-  Net::OAuth::AccessTokenRequest: 0.04
-  Net::OAuth::ProtectedResourceRequest: 0.04
+  Net::OAuth::AccessTokenRequest: 0
+  Net::OAuth::ProtectedResourceRequest: 0
   Net::OAuth::Request: 0.04
-  Net::OAuth::RequestTokenRequest: 0.04
+  Net::OAuth::RequestTokenRequest: 0
   Net::OpenID::Consumer: 0
   Net::Server::Fork: 0
   Net::Server::PreFork: 0

Modified: jifty/branches/virtual-models/Makefile.PL
==============================================================================
--- jifty/branches/virtual-models/Makefile.PL	(original)
+++ jifty/branches/virtual-models/Makefile.PL	Wed Oct 31 13:27:40 2007
@@ -36,6 +36,7 @@
 requires('File::MMagic');
 requires('File::ShareDir' => '0.04');
 requires('File::Spec' => '3.14');
+requires('File::Temp' => '0.15'); # we need cleanup()
 requires('HTML::Entities');
 requires('HTML::Lint');
 requires('HTML::Mason' => 1.3101);           # HTML::Mason::Exceptions HTML::Mason::FakeApache HTML::Mason::MethodMaker HTML::Mason::Request HTML::Mason::Utils
@@ -48,7 +49,7 @@
 requires('Hook::LexWrap');
 requires('IPC::PubSub' => '0.23' );
 requires('IPC::Run3');
-requires('Jifty::DBI' => '0.44' );            # Jifty::DBI::Collection Jifty::DBI::Handle Jifty::DBI::Record::Cachable Jifty::DBI::SchemaGenerator
+requires('Jifty::DBI' => '0.45' );            # Jifty::DBI::Collection Jifty::DBI::Handle Jifty::DBI::Record::Cachable Jifty::DBI::SchemaGenerator
 requires('Locale::Maketext::Extract' => '0.20');
 requires('Locale::Maketext::Lexicon' => '0.60');
 requires('Log::Log4perl' => '1.04');
@@ -172,9 +173,9 @@
     'OAuth Plugin' => [
         -default => 0,
         recommends('Net::OAuth::Request' => '0.04'),
-        recommends('Net::OAuth::RequestTokenRequest' => '0.04'),
-        recommends('Net::OAuth::AccessTokenRequest' => '0.04'),
-        recommends('Net::OAuth::ProtectedResourceRequest' => '0.04'),
+        recommends('Net::OAuth::RequestTokenRequest'),
+        recommends('Net::OAuth::AccessTokenRequest'),
+        recommends('Net::OAuth::ProtectedResourceRequest'),
 
         recommends('Crypt::OpenSSL::RSA'),
         recommends('Digest::HMAC_SHA1'),

Modified: jifty/branches/virtual-models/lib/Jifty/Action/Record.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Action/Record.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Action/Record.pm	Wed Oct 31 13:27:40 2007
@@ -249,6 +249,10 @@
                         collection => $collection
                     }
                 ];
+                unshift @{ $info->{valid_values} }, {
+                    display => _('no value'),
+                    value   => '',
+                } unless $column->mandatory;
             } 
             
             # If the reference is X-to-many instead, skip it

Modified: jifty/branches/virtual-models/lib/Jifty/I18N.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/I18N.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/I18N.pm	Wed Oct 31 13:27:40 2007
@@ -26,7 +26,7 @@
 
 =head2 C<_>
 
-This module provides a method named C<_>, which allows you to quickly and easily include localized strings in your application. The first argument is the string to translated. If that string contains placeholders, the remaining arguments are used to replace the placeholders. The placeholders in the form of "%1" where the number is the number of the argument used to replace it:
+This module provides a method named C<_>, which allows you to quickly and easily include localized strings in your application. The first argument is the string to be translated. If that string contains placeholders, the remaining arguments are used to replace the placeholders. The placeholders in the form of "%1" where the number is the number of the argument used to replace it:
 
   _('Welcome %1 to the %2', 'Bob', 'World');
 
@@ -162,7 +162,7 @@
 
 =head2 get_language_handle
 
-Get the lanauge language for this request.
+Get the language handle for this request.
 
 =cut
 
@@ -173,6 +173,13 @@
     $$DynamicLH = $self->get_handle($lang ? $lang : ()) if $DynamicLH;
 }
 
+=head2 get_current_language
+
+Get the current language for this request, formatted as a Locale::Maketext
+subclass string (i.e., C<zh_tw> instead of C<zh-TW>).
+
+=cut
+
 sub get_current_language {
     return unless $DynamicLH;
 
@@ -221,9 +228,17 @@
     my $class = shift;
     my $string = shift;
     my $content_type = shift;
+    my $charset;
+
+    if ($content_type) {
+        # Multi-part form data have no notion of charsets, so we return the string
+        # verbatim here, to avoid the "Unquoted / not allowed in Content-Type"
+        # warnings when the Base64-encoded MIME boundary string contains "/".
+        return $string if $content_type =~ /^multipart\b/;
 
-    $content_type = Email::MIME::ContentType::parse_content_type($content_type) if $content_type;
-    my $charset = $content_type->{attributes}->{charset} if $content_type;
+        $content_type = Email::MIME::ContentType::parse_content_type($content_type);
+        $charset = $content_type->{attributes}->{charset};
+    }
 
     # XXX TODO Is this the right thing? Maybe we should just return
     # the string as-is.

Modified: jifty/branches/virtual-models/lib/Jifty/JSON.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/JSON.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/JSON.pm	Wed Oct 31 13:27:40 2007
@@ -74,7 +74,7 @@
     local $JSON::Syck::SingleQuote = $args->{singlequote};
     local $JSON::Syck::ImplicitUnicode = 1;
 	my $json = JSON::Syck::Dump($obj);
-	if (! $args->{singlequte}) {
+	if (! $args->{singlequote}) {
 		$json =~ s/\n\n\n/\\n/gs;	# fix syck bug
 		$json =~ s/\n/\\n/gs;		# just to be safe
 		$json =~ s/\r/\\r/gs;

Modified: jifty/branches/virtual-models/lib/Jifty/Param/Schema.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Param/Schema.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Param/Schema.pm	Wed Oct 31 13:27:40 2007
@@ -172,9 +172,17 @@
 =cut
 
 sub merge_params {
+    my @merge = @_;
+
+    # We pull this deref and re-ref trick to un-bless any
+    # Jifty::Params which might exist; Hash::Merge pre-0.10 merged
+    # objects and hahrefs with no complaint, but 0.10 doesn't.
+    for my $m (@merge) {
+        $m->{$_} = {%{$m->{$_}}} for keys %{$m};
+    }
     my $prev_behaviour = Hash::Merge::get_behavior();
     Hash::Merge::specify_behavior( MERGE_PARAM_BEHAVIOUR, "merge_params" );
-    my $rv = Hash::Merge::merge(@_);
+    my $rv = Hash::Merge::merge(@merge);
     Hash::Merge::set_behavior( $prev_behaviour );
     return $rv;
 }

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm	Wed Oct 31 13:27:40 2007
@@ -153,8 +153,6 @@
     $self->regenerate_auth_token;
     if ( $self->id and $self->email and not $self->email_confirmed ) {
         Jifty->app_class('Notification','ConfirmEmail')->new( to => $self )->send;
-    } else {
-        warn  $self->id . " " .$self->email;
     }
 }
 

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference.pm	Wed Oct 31 13:27:40 2007
@@ -31,6 +31,12 @@
 
 Provides a special autocompletion widget for reference columns. See L<Jifty::Plugin::AutoReference::Widget>.
 
+=head1 METHODS
+
+=head2 init
+
+Adds the F<autoreference.js> file to the JavaScript files to send to the browser.
+
 =cut
 
 sub init {
@@ -56,7 +62,6 @@
         );
 
         $collection->unlimit;
-        $collection->rows_per_page(20);
 
         if (length $value) {
             $collection->limit(
@@ -84,9 +89,16 @@
         $collection->columns('id', $brief);
         $collection->order_by(column => $brief);
 
-        Jifty->log->info($collection->build_select_query);
-
         my @choices;
+        if (!length $value && !$column->mandatory) {
+            $collection->rows_per_page(9);
+            push @choices, { label => _('- none -'), value => '' };
+        }
+        
+        else {
+            $collection->rows_per_page(10);
+        }
+
         while (my $record = $collection->next) {
             push @choices, { 
                 label => $record->brief_description.' [id:'.$record->id.']', 

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference/Widget.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference/Widget.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/AutoReference/Widget.pm	Wed Oct 31 13:27:40 2007
@@ -24,6 +24,12 @@
 
 B<WARNING:> As of this writing, it should be noted that this widget does not degrade gracefully. If you need a widget that operates properly even when JavaScript is unavailable, this widget won't do that job at this time.
 
+=head1 METHODS
+
+=head2 render
+
+Overrides the field renderer to force autocompletion to be turned on.
+
 =cut
 
 sub render {
@@ -33,6 +39,53 @@
     return $self->SUPER::render(@_);
 }
 
+sub _record_description {
+    my $self = shift;
+
+    my $value = $self->default_value;
+
+    my $name      = $self->name;
+    my $column    = $self->action->record->column($name);
+    my $reference = $column->refers_to;
+    my $brief     = $reference->can('_brief_description') ?
+                        $reference->_brief_description : 'name';
+
+    my $record = $self->action->record->$name;
+    if ($record and $record->id) {
+        return $record->$brief . ' [id:'. $record->id . ']';
+    }
+    else {
+        return;
+    }
+}
+
+sub _switch_current_value_temporarily(&$) {
+    my $code = shift;
+    my $self = shift;
+    
+    my $description = $self->_record_description;
+
+    if ($self->sticky_value and $self->sticky) {
+        my $old_value = $self->sticky_value;
+        $self->sticky_value($description);
+        $code->();
+        $self->sticky_value($old_value);
+    }
+
+    else {
+        my $old_value = $self->default_value;
+        $self->default_value($description);
+        $code->();
+        $self->default_value($old_value);
+    }
+}
+
+=head2 render_widget
+
+Overrides the widget renderer to draw both a hidden field that stores the actual referenced ID and a text field that is autocompleted using the records brief description.
+
+=cut
+
 sub render_widget {
     my $self = shift;
 
@@ -43,7 +96,9 @@
     $self->_element_id($element_id.'-display');
     my $class = $self->class;
     $self->class(join ' ', ($class||''), 'text');
-    $self->SUPER::render_widget(@_);
+    _switch_current_value_temporarily {
+        $self->SUPER::render_widget(@_);
+    } $self;
     $self->input_name($input_name);
     $self->_element_id($element_id);
     $self->class($class);
@@ -56,6 +111,28 @@
     return '';
 }
 
+=head2 render_value
+
+Overrides the value renderer to show the brief description of the referenced record.
+
+=cut
+
+sub render_value {
+    my $self = shift;
+
+    _switch_current_value_temporarily {
+        $self->SUPER::render_value(@_);
+    } $self;
+
+    return '';
+}
+
+=head2 autocomplete_javascript
+
+Overrides the JavaScript autocompletion widget to use C<Jifty.Plugin.AutoReference> instead of the regular C<Jifty.Autocompleter>.
+
+=cut
+
 sub autocomplete_javascript {
     my $self = shift;
     return qq{new Jifty.Plugin.AutoReference('@{[$self->element_id]}-display','@{[$self->element_id]}','@{[$self->element_id]}-autocomplete')};

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm	Wed Oct 31 13:27:40 2007
@@ -4,8 +4,9 @@
 package Jifty::Plugin::CompressedCSSandJS;
 use base 'Jifty::Plugin';
 
-use Digest::MD5 qw(md5_hex);
+use Digest::MD5 'md5_hex';
 use IPC::Run3 'run3';
+use Compress::Zlib ();
 use IO::Handle ();
 
 =head1 NAME
@@ -22,6 +23,8 @@
         css: 1
         jsmin: /path/to/jsmin
         cdn: 'http://yourcdn.for.static.prefix/'
+        gzip: 1
+
 
 =head1 DESCRIPTION
 
@@ -36,9 +39,24 @@
 Note that you will need to use C<ConfigFileVersion> 2 to be able to
 configure jsmin feature.
 
+The gzip configuration directive, which defaults to enabled, instructs
+Jifty to transparently gzip css and js files as they're served if the client
+indicates it supports that feature.
+
 =cut
 
-__PACKAGE__->mk_accessors(qw(css js jsmin cached_javascript cached_javascript_digest cached_javascript_time cdn ));
+__PACKAGE__->mk_accessors(qw(css js jsmin cdn gzip_enabled
+
+    cached_javascript 
+    cached_javascript_gzip
+    cached_javascript_digest 
+    cached_javascript_time 
+
+    cached_css
+    cached_css_gzip
+    cached_css_time
+    cached_css_digest
+));
 
 =head2 init
 
@@ -54,6 +72,7 @@
 
     my %opt  = @_;
     $self->css( $opt{css} );
+    $self->gzip_enabled( exists $opt{gzip} ? $opt{gzip} : 1);
     $self->js( $opt{js} );
     $self->jsmin( $opt{jsmin} );
     $self->cdn( $opt{cdn} || '');
@@ -63,6 +82,12 @@
         callback  => sub { $self->_include_javascript(@_) },
         abortable => 1,
     ) if $self->js_enabled;
+
+    Jifty::Web->add_trigger(
+        name => 'include_css',
+        callback => sub { $self->_include_css(@_) },
+        abortable => 1,
+    ) if $self->css_enabled;
 }
 
 =head2 js_enabled
@@ -87,6 +112,12 @@
     defined $self->css ? $self->css : 1;
 }
 
+=head2 gzip_enabled
+
+Returns whether gzipping is enabled (which it is by default)
+
+=cut
+
 sub _include_javascript {
     my $self = shift;
 
@@ -97,6 +128,50 @@
     return 0;
 }
 
+sub _include_css {
+    my $self = shift;
+    $self->generate_css;
+    Jifty->web->out(
+    qq{<link rel="stylesheet" type="text/css" href="@{[ $self->cdn ]}/__jifty/css/}
+    . $self->cached_css_digest . '.css" />');
+    return 0;
+}
+
+=head3 generate_css 
+
+
+Checks if the compressed CSS is generated, and if it isn't, generates
+and caches it. (In devel mode, it always regenerates it)
+
+=cut
+
+            
+sub generate_css {
+    my $self = shift;
+            
+    if (not defined $self->cached_css_digest or Jifty->config->framework('DevelMode')) {
+        Jifty->log->debug("Generating CSS...");
+        
+        my @roots = map { Jifty::Util->absolute_path( File::Spec->catdir( $_, 'css' ) ) }
+                        Jifty->handler->view('Jifty::View::Static::Handler')->roots;
+    
+        CSS::Squish->roots( @roots );
+        
+        my $css = CSS::Squish->concatenate(
+            map { CSS::Squish->_resolve_file( $_, @roots ) }
+                @{ Jifty->web->css_files }
+        );
+
+        $self->cached_css( $css );
+        $self->cached_css_digest( md5_hex( $css ) );
+        $self->cached_css_time( time );
+        $self->cached_css_gzip(Compress::Zlib::memGzip( $css));
+
+    }
+}
+
+
+
 =head3 _generate_javascript
 
 Checks if the compressed JS is generated, and if it isn't, generates
@@ -139,6 +214,7 @@
         $self->cached_javascript($js);
         $self->cached_javascript_digest( md5_hex($js) );
         $self->cached_javascript_time(time);
+        $self->cached_javascript_gzip(Compress::Zlib::memGzip( $js));
     }
 }
 

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm	Wed Oct 31 13:27:40 2007
@@ -13,13 +13,10 @@
 which serve out compiled and compressed CSS and Javascript rules.
 
 =cut
-use Compress::Zlib qw();
 use HTTP::Date ();
 
 use Jifty::Dispatcher -base;
 
-our($GZIP_CSS,$GZIP_JS);
-
 
 on '/__jifty/js/*' => run {
     my $arg = $1;
@@ -50,14 +47,12 @@
     # XXX TODO: If we start caching the squished JS in a file somewhere, we
     # can have the static handler serve it, which would take care of gzipping
     # for us.
-    if ( Jifty::View::Static::Handler->client_accepts_gzipped_content ) {
+    if ( $ccjs->gzip_enabled && Jifty::View::Static::Handler->client_accepts_gzipped_content ) {
         Jifty->log->debug("Sending gzipped squished JS");
         Jifty->handler->apache->header_out( "Content-Encoding" => "gzip" );
         Jifty->handler->apache->send_http_header();
         binmode STDOUT;
-
-
-        print $GZIP_JS ||= Compress::Zlib::memGzip( $ccjs->cached_javascript );
+        print $ccjs->cached_javascript_gzip;
 
     } else {
         Jifty->log->debug("Sending squished JS");
@@ -69,17 +64,18 @@
 
 on '/__jifty/css/*' => run {
     my $arg = $1;
-    if ( $arg !~ /^[0-9a-f]{32}\.css$/ ) {
+    my ($ccjs) = Jifty->find_plugin('Jifty::Plugin::CompressedCSSandJS');
+    if ( $arg !~ /^[0-9a-f]{32}\.css$/ || !$ccjs) {
 
         # This doesn't look like a real request for squished CSS,
         # so redirect to a more failsafe place
         Jifty->web->redirect( "/static/css/" . $arg );
     }
 
-    Jifty->web->generate_css;
+    $ccjs->generate_css;
 
     if ( Jifty->handler->cgi->http('If-Modified-Since')
-        and $arg eq Jifty->web->cached_css_digest . '.css' )
+        and $arg eq $ccjs->cached_css_digest . '.css' )
     {
         Jifty->log->debug("Returning 304 for cached css");
         Jifty->handler->apache->header_out( Status => 304 );
@@ -92,16 +88,16 @@
     # XXX TODO: If we start caching the squished CSS in a file somewhere, we
     # can have the static handler serve it, which would take care of gzipping
     # for us.
-    if ( Jifty::View::Static::Handler->client_accepts_gzipped_content ) {
+    if ($ccjs->gzip_enabled && Jifty::View::Static::Handler->client_accepts_gzipped_content ) {
         Jifty->log->debug("Sending gzipped squished CSS");
         Jifty->handler->apache->header_out( "Content-Encoding" => "gzip" );
         Jifty->handler->apache->send_http_header();
         binmode STDOUT;
-        print $GZIP_CSS ||= Compress::Zlib::memGzip( Jifty->web->cached_css);
+        print $ccjs->cached_css_gzip;
     } else {
         Jifty->log->debug("Sending squished CSS");
         Jifty->handler->apache->send_http_header();
-        print Jifty->web->cached_css;
+        print $ccjs->cached_css;
     }
     abort;
 };

Added: jifty/branches/virtual-models/lib/Jifty/Plugin/I18N.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/I18N.pm	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,72 @@
+use strict;
+use warnings;
+
+package Jifty::Plugin::I18N;
+use base 'Jifty::Plugin';
+
+=head1 NAME
+
+Jifty::Plugin::I18N
+
+=head1 SYNOPSIS
+
+# In your jifty config.yml under the framework section:
+
+  L10N:
+    PoDir: share/po
+    AllowedLang:
+      - en
+      - zh_tw
+  Plugins:
+    - I18N:
+        js: 1
+
+
+=head1 DESCRIPTION
+
+This plugin provides additional i18n facility to jifty's core i18n
+features, such as compiling l10n lexicon for client side javascript,
+and a language selector action.
+
+You will still need to manually do the following to make client side l10n work:
+
+=over
+
+=item Extract strings from your js files into your po file
+
+  jifty po --dir share/web/static/js
+
+=item Generate js dictionary
+
+  jifty po --js
+
+=back
+
+=head2 init
+
+=cut
+
+__PACKAGE__->mk_accessors(qw(js));
+
+sub init {
+    my $self = shift;
+    return if $self->_pre_init;
+
+    my %opt  = @_;
+    $self->js( $opt{js} );
+
+    Jifty::Web->add_trigger(
+        name      => 'after_include_javascript',
+        callback  => sub { $self->_i18n_js(@_) },
+    ) if $self->js;
+}
+
+sub _i18n_js {
+    my $self = shift;
+
+    # js l10n init
+    my $current_lang = Jifty::I18N->get_current_language || 'en';
+    Jifty->web->out(qq{<script type="text/javascript">Localization.init({dict_path: '/static/js/dict', lang: '$current_lang'});</script>});
+}
+
+1;

Added: jifty/branches/virtual-models/lib/Jifty/Plugin/I18N/Action/SetLang.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/I18N/Action/SetLang.pm	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,47 @@
+package Jifty::Plugin::I18N::Action::SetLang;
+use strict;
+use DateTime::Locale ();
+
+use base 'Class::Data::Inheritable';
+__PACKAGE__->mk_classdata(_available_languages => undef);
+
+use Jifty::Param::Schema;
+use Jifty::Action schema {
+
+param
+    lang => label is _('Language'),
+    render as 'select',
+    default is defer { Jifty::I18N->get_current_language };
+};
+
+sub available_languages {
+    my $class = shift;
+    return $class->_available_languages if $class->_available_languages;
+
+    $class->_available_languages(
+        [   map { {   display => DateTime::Locale->load($_)->native_name,
+                      value   => $_ } } Jifty::I18N->available_languages ] );
+    return $class->_available_languages;
+}
+
+sub arguments {
+    my $self = shift;
+    my $args = $self->SUPER::arguments;
+
+    # XXX: complete_native_name is way too long
+    $args->{lang}->{valid_values} = $self->available_languages;
+
+    return $args;
+}
+
+sub take_action {
+    my $self = shift;
+    my $lang = $self->argument_value('lang');
+    Jifty->web->session->set(jifty_lang => $lang);
+
+    Jifty::I18N->get_language_handle;
+
+    $self->result->message(_("Hi, we speak %1.", DateTime::Locale->load($lang)->native_name));
+}
+
+1;

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Action/AuthorizeRequestToken.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Action/AuthorizeRequestToken.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Action/AuthorizeRequestToken.pm	Wed Oct 31 13:27:40 2007
@@ -21,6 +21,9 @@
     param 'authorize',
         valid_values are qw(allow deny);
 
+    param 'callback',
+        render as 'hidden';
+
 };
 
 =head2 validate_token
@@ -41,6 +44,11 @@
 
     return $self->validation_error(token => "I don't know of that request token.") unless $request_token->id;
 
+    if ($request_token->valid_until < Jifty::DateTime->now(time_zone => 'GMT')) {
+        $request_token->delete();
+        return $self->validation_error(token => "This request token has expired.");
+    }
+
     return $self->validation_ok('token');
 }
 
@@ -58,6 +66,10 @@
         token => $self->argument_value('token'),
     );
 
+    $self->result->content(token_obj => $token);
+    $self->result->content(token     => $token->token);
+    $self->result->content(callback  => $self->argument_value('callback'));
+
     if ($self->argument_value('authorize') eq 'allow') {
         $token->set_authorized('t');
         $self->result->message("Allowing " . $token->consumer->name . " to access your stuff.");

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Dispatcher.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Dispatcher.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Dispatcher.pm	Wed Oct 31 13:27:40 2007
@@ -94,7 +94,7 @@
     set no_abort => 1;
     my %oauth_params = get_parameters(@params);
 
-    set next => $oauth_params{callback};
+    set callback => $oauth_params{callback};
     set consumer => 'Some application';
     del 'token';
 

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/AccessToken.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/AccessToken.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/AccessToken.pm	Wed Oct 31 13:27:40 2007
@@ -6,8 +6,9 @@
 use base qw( Jifty::Plugin::OAuth::Token Jifty::Record );
 
 # kludge 1: you cannot call Jifty->app_class within schema {}
-my $app_user;
-BEGIN { $app_user = Jifty->app_class('Model', 'User') }
+# kludge 3: due to the loading order, you can't really do this
+#my $app_user;
+#BEGIN { $app_user = Jifty->app_class('Model', 'User') }
 
 use Jifty::DBI::Schema;
 use Jifty::Record schema {

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/RequestToken.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/RequestToken.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/Model/RequestToken.pm	Wed Oct 31 13:27:40 2007
@@ -6,8 +6,9 @@
 use base qw( Jifty::Plugin::OAuth::Token Jifty::Record );
 
 # kludge 1: you cannot call Jifty->app_class within schema {}
-my $app_user;
-BEGIN { $app_user = Jifty->app_class('Model', 'User') }
+# kludge 3: due to the loading order, you can't really do this
+#my $app_user;
+#BEGIN { $app_user = Jifty->app_class('Model', 'User') }
 
 use Jifty::DBI::Schema;
 use Jifty::Record schema {

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/View.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/View.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/OAuth/View.pm	Wed Oct 31 13:27:40 2007
@@ -103,7 +103,10 @@
         class   => 'AuthorizeRequestToken',
     );
 
-    Jifty->web->form->start( call => get 'next' );
+    Jifty->web->form->start();
+    Jifty->web->form->next_page(url => "/oauth/authorized");
+
+    outs $authorize->hidden(callback => get 'callback');
 
     # if the site put the token in the request, then use it
     # otherwise, prompt the user for it
@@ -129,6 +132,44 @@
     Jifty->web->form->end();
 };
 
+=head2 oauth/authorized
+
+Displayed after the user authorizes or denies a request token. Uses a link
+to the callback if provided, otherwise the site's URL.
+
+=cut
+
+template 'oauth/authorized' => page { title => 'XXX' }
+content {
+    my $result    = Jifty->web->response->result('authorize_request_token');
+    my $callback  = $result->content('callback');
+    my $token     = $result->content('token');
+    my $token_obj = $result->content('token_obj');
+
+    $callback ||= $token_obj->consumer->url;
+
+    if (!$callback) {
+        p { "Oops! " . $token_obj->consumer->name . " didn't tell us how to get you back to their service. If you do find your way back, you'll probably need this token: " . $token };
+    }
+    else {
+        $callback .= ($callback =~ /\?/ ? '&' : '?')
+                  .  'oauth_token='
+                  .  $token;
+        set consumer => $token_obj->consumer;
+
+        p {
+            outs 'To return to ';
+            show 'oauth/consumer';
+            outs ', ';
+            hyperlink(
+                label => 'click here',
+                url   => $callback,
+            );
+            outs '.';
+        };
+    }
+};
+
 =head2 oauth/help
 
 This provides a very, very layman description of OAuth for users

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/View.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/View.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/View.pm	Wed Oct 31 13:27:40 2007
@@ -60,8 +60,7 @@
         title { _($title) };
         Jifty->web->include_css;
         Jifty->web->include_javascript;
-      };
-
+    };
 };
 
 private template 'heading_in_wrapper' => sub {

Modified: jifty/branches/virtual-models/lib/Jifty/Request/Mapper.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Request/Mapper.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Request/Mapper.pm	Wed Oct 31 13:27:40 2007
@@ -157,7 +157,7 @@
 
     # Bail unless it's a mapping
     return ( @original )
-        unless $args{destination} =~ /^J:M-(.*)/;
+        unless defined $args{destination} and $args{destination} =~ /^J:M-(.*)/;
 
     my $destination = $1;
 

Modified: jifty/branches/virtual-models/lib/Jifty/Script/Schema.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Script/Schema.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Script/Schema.pm	Wed Oct 31 13:27:40 2007
@@ -440,20 +440,8 @@
         if ($model->can( 'since' ) and defined $model->since and  $appv >= $model->since and $model->since >$dbv ) {
             unshift @{ $UPGRADES{ $model->since } }, $model->printable_table_schema();
         } else {
-            # Go through the columns
+            # Go through the currently-active columns
             for my $col  (grep {not $_->virtual} $model->columns ) {
-
-                # If they're old, drop them
-                if ( defined $col->till and $appv >= $col->till and $col->till > $dbv ) {
-                    push @{ $UPGRADES{ $col->till } }, sub {
-                        my $renamed = $upgradeclass->just_renamed || {};
-
-                        # skip it if this was dropped by a rename
-                        $model->drop_column_in_db($col->name)
-                            unless defined $renamed->{ $model->table }->{'drop'}->{ $col->name };
-                    };
-                }
-
                 # If they're new, add them
                 if ($col->can( 'since' ) and defined $col->since and $appv >= $col->since and $col->since >$dbv ) {
                     unshift @{ $UPGRADES{ $col->since } }, sub {

Modified: jifty/branches/virtual-models/lib/Jifty/View/Static/Handler.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Static/Handler.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Static/Handler.pm	Wed Oct 31 13:27:40 2007
@@ -192,8 +192,9 @@
         # MIME::Types returns application/javascript for .js, but Opera
         # chokes on ajax-fetched JS that has a type other than the one below
         # JSAN.js fetches JS via Ajax when it loads JSAN modules
-        'js' => 'application/x-javascript',
-        'htc' => 'text/x-component',
+        'js'   => 'application/x-javascript',
+        'json' => 'application/json; charset=UTF-8',
+        'htc'  => 'text/x-component',
     );
 
     return ($type_override{$1})

Modified: jifty/branches/virtual-models/lib/Jifty/Web.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Web.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Web.pm	Wed Oct 31 13:27:40 2007
@@ -49,6 +49,7 @@
     scriptaculous/controls.js
     formatDate.js
     template_declare.js
+    loc.js
     jifty.js
     jifty_utils.js
     jifty_subs.js
@@ -1073,23 +1074,15 @@
 =cut
 
 sub include_css {
-    # XXX: move to CompressCSSandJS plugin
     my $self = shift;
-    my ($ccjs) = Jifty->find_plugin('Jifty::Plugin::CompressedCSSandJS');
-    if ( $ccjs && $ccjs->css_enabled ) {
-        $self->generate_css;
-        $self->out(
-            qq{<link rel="stylesheet" type="text/css" href="@{[ $ccjs->cdn ]}/__jifty/css/}
-            . __PACKAGE__->cached_css_digest . '.css" />'
-        );
-    }
-    else {
-        $self->out(
-            '<link rel="stylesheet" type="text/css" '
-            . 'href="/static/css/main.css" />'
-        );
-    }
-    
+
+    # if there's no trigger, 0 is returned.  if aborted/handled, undef
+    # is returned.
+    defined $self->call_trigger( 'include_css', @_ ) or return '';
+
+    $self->out( '<link rel="stylesheet" type="text/css" '
+            . 'href="/static/css/main.css" />' );
+
     return '';
 }
 
@@ -1107,37 +1100,6 @@
     ]);
 }
 
-=head3 generate_css
-
-Checks if the compressed CSS is generated, and if it isn't, generates
-and caches it.
-
-=cut
-
-sub generate_css {
-    my $self = shift;
-
-    if (not defined __PACKAGE__->cached_css_digest
-            or Jifty->config->framework('DevelMode'))
-    {
-        Jifty->log->debug("Generating CSS...");
-        
-        my @roots = map { Jifty::Util->absolute_path( File::Spec->catdir( $_, 'css' ) ) }
-                        Jifty->handler->view('Jifty::View::Static::Handler')->roots;
-
-        CSS::Squish->roots( @roots );
-        
-        my $css = CSS::Squish->concatenate(
-            map { CSS::Squish->_resolve_file( $_, @roots ) }
-                @{ $self->css_files }
-        );
-
-        __PACKAGE__->cached_css( $css );
-        __PACKAGE__->cached_css_digest( md5_hex( $css ) );
-		__PACKAGE__->cached_css_time( time );
-    }
-}
-
 =head3 include_javascript
 
 Returns a C<< <script> >> tag for the compressed Javascript.
@@ -1182,14 +1144,16 @@
 
     # if there's no trigger, 0 is returned.  if aborted/handled, undef
     # is returned.
-    defined $self->call_trigger('include_javascript', @_) or return '';
-
-    for my $file ( @{ __PACKAGE__->javascript_libs } ) {
-        $self->out(
-            qq[<script type="text/javascript" src="/static/js/$file"></script>\n]
-        );
+    if ( defined $self->call_trigger('include_javascript', @_) ) {
+        for my $file ( @{ __PACKAGE__->javascript_libs } ) {
+            $self->out(
+                       qq[<script type="text/javascript" src="/static/js/$file"></script>\n]
+                      );
+        }
     }
 
+    $self->call_trigger('after_include_javascript', @_);
+
     return '';
 }
 
@@ -1201,10 +1165,7 @@
 
 sub add_javascript {
     my $self = shift;
-    Jifty->web->javascript_libs([
-        @{ Jifty->web->javascript_libs },
-        @_
-    ]);
+    Jifty->web->javascript_libs([ @{ Jifty->web->javascript_libs }, @_ ]);
 }
 
 =head3 add_external_javascript URL1, URL2, ...
@@ -1216,9 +1177,7 @@
 sub add_external_javascript {
     my $self = shift;
     Jifty->web->external_javascript_libs([
-        @{ Jifty->web->external_javascript_libs },
-        @_
-    ]);
+        @{ Jifty->web->external_javascript_libs }, @_ ]);
 }
 
 =head2 STATE VARIABLES

Modified: jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm	Wed Oct 31 13:27:40 2007
@@ -33,6 +33,14 @@
 
 Sets or returns the string that the menu item will be displayed as.
 
+=cut
+
+sub label {
+    my $self = shift;
+    $self->{label} = shift if @_;
+    return $self->{label};
+}
+
 =head2 parent [MENU]
 
 Gets or sets the parent L<Jifty::Web::Menu> of this item; this defaults
@@ -233,7 +241,7 @@
     my @kids = $self->children;
     my $id   = Jifty->web->serial;
     Jifty->web->out( qq{<li class="toplevel }
-            . ( $self->active ? 'active' : 'closed' ) .' '.$self->class.' '. qq{">}
+            . ( $self->active ? 'active' : 'closed' ) .' '.($self->class||"").' '. qq{">}
             . qq{<span class="title">} );
     Jifty->web->out( $self->as_link );
     Jifty->web->out(qq{</span>});
@@ -246,7 +254,7 @@
                 . $id
                 . qq{">} );
         for (@kids) {
-            Jifty->web->out(qq{<li class="submenu }.($_->active ? 'active' : '' ).' '. $_->class.qq{">});
+            Jifty->web->out(qq{<li class="submenu }.($_->active ? 'active' : '' ).' '. ($_->class || "").qq{">});
 
             # We should be able to get this as a string.
             # Either stringify the link object or output the label

Modified: jifty/branches/virtual-models/share/plugins/Jifty/Plugin/AutoReference/web/static/js/autoreference.js
==============================================================================
--- jifty/branches/virtual-models/share/plugins/Jifty/Plugin/AutoReference/web/static/js/autoreference.js	(original)
+++ jifty/branches/virtual-models/share/plugins/Jifty/Plugin/AutoReference/web/static/js/autoreference.js	Wed Oct 31 13:27:40 2007
@@ -50,7 +50,8 @@
         request['actions'][this.action.moniker]['active']  = 0;
 
         // Fix up the field to use the real field instead of the hidden one
-        request['actions'][this.action.moniker]['fields'][a['fields']['argument']]['value'] = this.field.value;
+        var value = this.field.value.replace(/\s*\[(?:i(?:d(?::(?:\s*(?:\d+\]?)?)?)?)?)?$/, '')
+        request['actions'][this.action.moniker]['fields'][a['fields']['argument']]['value'] = value;
 
         var options = { postBody: JSON.stringify(request),
             onComplete: this.onComplete.bind(this),

Added: jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/web/static/js/loc.js
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/share/plugins/Jifty/Plugin/I18N/web/static/js/loc.js	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,65 @@
+Localization = Object.extend(new Object(), {
+    init: function(params) {
+        this.lang = params.lang || 'en';
+        if (params["dict_path"]) {
+            this.dict_path = params["dict_path"]
+            this.dict = this.load_dict(this.lang)
+        }
+    },
+    switch_dict: function(lang) {
+        this.dict = this.load_dict(lang);
+    },
+    load_dict: function(lang) {
+        var d;
+        new Ajax.Request(
+            this.dict_path + "/" + lang + ".json",
+            {
+                method: 'get',
+                asynchronous: false,
+                onComplete: function(t, obj) {
+                    eval("d = " + t.responseText || "{}");
+                }
+            }
+        );
+        return d;
+    },
+    loc: function(str) {
+        var dict = this.dict;
+        if (dict[str]) {
+            return dict[str];
+        }
+        return str;
+    },
+
+    get_local_time_for_date: function(time) {
+        system_date = new Date(time);
+        user_date = new Date();
+        delta_minutes = Math.floor((user_date - system_date) / (60 * 1000));
+        if (Math.abs(delta_minutes) <= (7*24*60)) {
+            distance = this.distance_of_time_in_words(delta_minutes);
+            if (delta_minutes < 0) {
+                return distance + _(' from now');
+            } else {
+                return distance + _(' ago');
+            }
+        } else {
+            return system_date.toLocaleDateString();
+        }
+    },
+
+    distance_of_time_in_words: function(minutes) {
+        if (minutes.isNaN) return "";
+        minutes = Math.abs(minutes);
+        if (minutes < 1) return _('less than a minute');
+        if (minutes < 50) return _(minutes + ' minute' + (minutes == 1 ? '' : 's'));
+        if (minutes < 90) return _('about one hour');
+        if (minutes < 1080) return (Math.round(minutes / 60) + ' hours');
+        if (minutes < 1440) return _('one day');
+        if (minutes < 2880) return _('about one day');
+        else return (Math.round(minutes / 1440) + _(' days'))
+    }
+
+});
+
+Localization.dict = {};
+_ = Localization.loc.bind(Localization);

Modified: jifty/branches/virtual-models/share/po/ja.po
==============================================================================
--- jifty/branches/virtual-models/share/po/ja.po	(original)
+++ jifty/branches/virtual-models/share/po/ja.po	Wed Oct 31 13:27:40 2007
@@ -1,727 +1,839 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kenichi Ishigaki <ishigaki at tcool.org>\n"
-"Language-Team: Japanese\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmLostPassword.pm:38
-#. ($appname,$confirm_url)
-msgid ""
-"\n"
-"You're getting this message because you (or somebody claiming to be you)\n"
-"request to reset your password for %1.\n"
-"\n"
-"If you don't want to reset your password just ignore this message.\n"
-"\n"
-"To reset your password, click on the link below:\n"
-"\n"
-"%2\n"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmEmail.pm:41
-#. ($appname,$confirm_url)
-msgid ""
-"\n"
-"You're getting this message because you (or somebody claiming to be you)\n"
-"wants to use %1. \n"
-"\n"
-"We need to make sure that we got your email address right.  Click on the link below to get started:\n"
-"\n"
-"%2\n"
-msgstr ""
-
-#: lib/Jifty/Action/Record/Search.pm:125
-msgid "!=>< allowed"
-msgstr "! = > < は利用できません"
-
-#: lib/Jifty/Notification.pm:94
-#. ($appname, Jifty->config->framework('AdminEmail')
-msgid "%1 <%2>"
-msgstr ""
-
-#: lib/Jifty/Action/Record/Search.pm:115
-#. ($label)
-msgid "%1 after"
-msgstr "%1 より後"
-
-#: lib/Jifty/Action/Record/Search.pm:116
-#. ($label)
-msgid "%1 before"
-msgstr "%1 より前"
-
-#: lib/Jifty/Action/Record/Search.pm:112
-#. ($label)
-msgid "%1 contains"
-msgstr "%1 を含む"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:141
-#. ($collection-> count)
-msgid "%1 entries"
-msgstr "%1 件"
-
-#: lib/Jifty/Action/Record/Search.pm:123
-#. ($label)
-msgid "%1 greater or equal to"
-msgstr "%1 と同じかそれ以上"
-
-#: lib/Jifty/Action/Record/Search.pm:121
-#. ($label)
-msgid "%1 greater than"
-msgstr "%1 より大きい"
-
-#: lib/Jifty/Action/Record/Search.pm:108
-#. ($label)
-msgid "%1 is not"
-msgstr "%1 以外"
-
-#: lib/Jifty/Action/Record/Search.pm:113
-#. ($label)
-msgid "%1 lacks"
-msgstr "%1 を含まない"
-
-#: lib/Jifty/Action/Record/Search.pm:124
-#. ($label)
-msgid "%1 less or equal to"
-msgstr "%1 と同じかそれ以下"
-
-#: lib/Jifty/Action/Record/Search.pm:122
-#. ($label)
-msgid "%1 less than"
-msgstr "%1 より小さい"
-
-#: share/web/templates/__jifty/error/mason_internal_error:31 share/web/templates/__jifty/error/mason_internal_error:35 share/web/templates/__jifty/error/mason_internal_error:39
-#. ($path, $line)
-#. ($file, $line)
-msgid "%1 line %2"
-msgstr "%1 %2行目"
-
-#: share/web/templates/__jifty/halo:119
-#. ($_->[3])
-msgid "%1 seconds"
-msgstr "%1 秒"
-
-#: lib/Jifty/Action/Record/Search.pm:117
-#. ($label)
-msgid "%1 since"
-msgstr "%1 と同じかそれ以降"
-
-#: lib/Jifty/Action/Record/Search.pm:118
-#. ($label)
-msgid "%1 until"
-msgstr "%1 と同じかそれ以前"
-
-#: lib/Jifty/Action/Record/Search.pm:77
-msgid "(any)"
-msgstr "(指定なし)"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm:58
-msgid ". Your email address has now been confirmed."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:96
-msgid "A link to reset your password has been sent to your email account."
-msgstr ""
-
-#: lib/Jifty/Notification.pm:96
-#. ($appname)
-msgid "A notification from %1!"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:443
-msgid "Actions"
-msgstr "操作"
-
-#: lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm:28
-msgid "Administration"
-msgstr ""
-
-#: lib/Jifty/View/Declare/Helpers.pm:363 share/web/templates/_elements/wrapper:11
-msgid "Administration mode is enabled."
-msgstr "管理モードが有効になっています"
-
-#: lib/Jifty/View/Declare/Helpers.pm:360 share/web/templates/_elements/wrapper:11
-msgid "Alert"
-msgstr "注意"
-
-#: lib/Jifty/Action/Record/Create.pm:82
-msgid "An error occurred.  Try again later"
-msgstr "エラーが発生しました。しばらく待ってから再度試してみてください"
-
-#: lib/Jifty/Action/Record/Search.pm:129
-msgid "Any field contains"
-msgstr "検索したい文字列"
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:131
-msgid "Anyway, the software has logged this error."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:19
-msgid "Authentication token"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:489 lib/Jifty/Plugin/AdminUI/View-not-yet.pm:59
-msgid "Back to the admin console"
-msgstr "管理画面に戻る"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:461
-msgid "Back to the application"
-msgstr "アプリケーションに戻る"
-
-#: share/web/templates/__jifty/halo:117
-msgid "Bindings"
-msgstr ""
-
-#: share/web/templates/helpers/calendar.html:4
-#. (_ &><body class="calpopup"><a href="#" onclick="window.close()
-msgid "Calendar"
-msgstr "カレンダー"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:338
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: share/web/templates/__jifty/halo:81
-msgid "Children"
-msgstr ""
-
-#: share/web/templates/helpers/calendar.html:4
-msgid "Close window"
-msgstr "閉じる"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:382
-msgid "Confirm delete?"
-msgstr "本当に削除しますか"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:97
-msgid "Confirmation resent."
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:213
-msgid "Create"
-msgstr "作成"
-
-#: lib/Jifty/Action/Record/Create.pm:81
-#. (ref($record)
-msgid "Create of %1 failed: %2"
-msgstr "%1 の作成に失敗しました: %2"
-
-#: lib/Jifty/Action/Record/Create.pm:105
-msgid "Created"
-msgstr "作成しました"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:415
-msgid "Database Administration"
-msgstr "データベース管理"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:380
-msgid "Delete"
-msgstr "削除"
-
-#: lib/Jifty/Action/Record/Delete.pm:76
-msgid "Deleted"
-msgstr "削除しました"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:458 lib/Jifty/Plugin/AdminUI/View-not-yet.pm:486 lib/Jifty/Plugin/AdminUI/View-not-yet.pm:56
-msgid "Done?"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:388 share/web/templates/__jifty/halo:126 share/web/templates/__jifty/halo:20
-msgid "Edit"
-msgstr "編集"
-
-#: lib/Jifty/Mason/Halo.pm:104
-#. ($comp_name)
-msgid "Edit %1"
-msgstr "%1 を編集"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:23 lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:32
-msgid "Email"
-msgstr ""
-
-#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:33
-msgid "Email address"
-msgstr ""
-
-#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:35
-msgid "Email address confirmed?"
-msgstr ""
-
-#: lib/Jifty/Action.pm:1158
-msgid "Foo cannot contain -, *, +, or ?."
-msgstr ""
-
-#: lib/Jifty/Action.pm:1152
-msgid "Foo cannot contain uppercase letters."
-msgstr ""
-
-#: lib/Jifty/Action.pm:1136
-msgid "Foo values are always in lowercase."
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:27
-msgid "For one reason or another, you got to a web page that caused a bit of an error. And then you got to our 'basic' error handler. Which means we haven't written a pretty, easy to understand error message for you just yet. The message we do have is :"
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:138 share/web/templates/dhandler:7
-msgid "Go back home..."
-msgstr "ホームページに戻ります…"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:34
-msgid "Hashed Password"
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:44
-msgid "Head on back home"
-msgstr ""
-
-#: lib/Jifty/I18N.pm:19 lib/Jifty/I18N.pm:23
-#. ('World')
-msgid "Hello, %1!"
-msgstr ""
-
-#: lib/Jifty/Plugin/SkeletonApp/View.pm:31 share/web/templates/_elements/sidebar:5
-#. ($u->$method()
-msgid "Hiya, %1."
-msgstr "%1 さん、こんにちは"
-
-#: lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm:23
-msgid "Home"
-msgstr ""
-
-#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:30
-msgid "How should I display your name to other users?"
-msgstr ""
-
-#: lib/Jifty/Action.pm:1090
-msgid "I changed $field for you"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:64
-msgid "I'm not sure how this happened."
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:62
-msgid "Internal error"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:78 lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:79
-msgid "It doesn't look like there's an account by that name."
-msgstr ""
-
-#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:89
-msgid "It looks like somebody else is using that address. Is there a chance you have another account?"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:75
-msgid "It looks like you already have an account. Perhaps you want to <a href=\"/login\">log in</a> instead?"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:75
-msgid "It looks like you didn't enter the same password into both boxes. Give it another shot?"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:82
-msgid "It looks like you're already confirmed."
-msgstr ""
-
-#:
-msgid "Jifty Developer Documentation Online"
-msgstr "開発者向けオンラインドキュメント"
-
-#:
-msgid "Jifty Pod Online"
-msgstr "オンラインドキュメント"
-
-#: lib/Jifty/View/Declare/Helpers.pm:375 share/web/templates/_elements/wrapper:18
-msgid "Loading..."
-msgstr "読込み中…"
-
-#: lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm:106
-msgid "Login"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:55
-msgid "Login with a password"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:40
-msgid "Login!"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm:123
-msgid "Logout"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:63
-msgid "Lost your password?"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:46 lib/Jifty/Plugin/AdminUI/View-not-yet.pm:473
-#. ($object_type)
-msgid "Manage records: [_1]"
-msgstr ""
-
-#: share/web/templates/__jifty/error/mason_internal_error:1
-msgid "Mason error"
-msgstr "Mason エラー"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:429
-msgid "Models"
-msgstr "モデル"
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:81
-msgid "New password"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:172
-msgid "Next Page"
-msgstr "次のページ"
-
-#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:29
-msgid "Nickname"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:52
-msgid "No account yet? It's quick and easy. "
-msgstr ""
-
-#: lib/Jifty/Action/Record/Search.pm:130
-msgid "No field contains"
-msgstr "排除したい文字列"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:139
-msgid "No items found"
-msgstr "見つかりませんでした"
-
-#: lib/Jifty/Web.pm:302
-msgid "No request to handle"
-msgstr "処理できるリクエストがありません"
-
-#:
-msgid "Online Documentation"
-msgstr "オンラインドキュメント"
-
-#: lib/Jifty/Plugin/OnlineDocs/Dispatcher.pm:26
-msgid "Online docs"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:134
-#. ($page, $collection->pager->last_page)
-msgid "Page %1 of %2"
-msgstr "%1 / %2 ページ"
-
-#: share/web/templates/__jifty/halo:1
-msgid "Page info"
-msgstr ""
-
-#: share/web/templates/__jifty/halo:72
-msgid "Parent"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:29 lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:32 lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:26
-msgid "Password"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:88
-msgid "Passwords need to be at least six characters long"
-msgstr ""
-
-#: lib/Jifty/Record.pm:272 lib/Jifty/Record.pm:351 lib/Jifty/Record.pm:70
-msgid "Permission denied"
-msgstr "権限がありません"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:66
-msgid "Please email us!"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:163
-msgid "Previous Page"
-msgstr "前のページ"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:65
-msgid "Really, really sorry."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:37
-msgid "Remember me?"
-msgstr ""
-
-#: share/web/templates/__jifty/halo:69
-#. ($frame->{'render_time'})
-msgid "Rendered in %1s"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:78
-msgid "Reset lost password"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:53
-msgid "Run the action"
-msgstr "実行"
-
-#: share/web/templates/__jifty/halo:111
-msgid "SQL Statements"
-msgstr "SQL文"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:327
-msgid "Save"
-msgstr "保存"
-
-#:
-msgid "Schema"
-msgstr "スキーマ"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:304
-msgid "Search"
-msgstr "検索"
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:119
-msgid "Send"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:97
-msgid "Send a link to reset your password"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:109 lib/Jifty/Plugin/Authentication/Password/View.pm:114
-msgid "Send a password reminder"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm:111
-msgid "Sign up"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:53
-msgid "Sign up for an account!"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:30 lib/Jifty/Plugin/Authentication/Password/View.pm:35
-msgid "Signup"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:108
-#. ($msg)
-msgid "Something bad happened and we couldn't create your account: %1"
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:149
-msgid "Something went awry"
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:124 share/web/templates/dhandler:1
-msgid "Something's not quite right"
-msgstr "原因不明のエラーです"
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:132
-msgid "Sorry about this."
-msgstr ""
-
-#:
-msgid "Table of Contents"
-msgstr "目次"
-
-#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:82
-#. ($new_email)
-msgid "That %1 doesn't look like an email address."
-msgstr ""
-
-#: lib/Jifty/Action.pm:878
-msgid "That doesn't look like a correct value"
-msgstr "値が不適切なようです"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:71 lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:72 lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:70
-msgid "That doesn't look like an email address."
-msgstr ""
-
-#: lib/Jifty/Action/Record.pm:249
-msgid "That doesn't look right, but I don't know why"
-msgstr "原因不明のエラーです"
-
-#: lib/Jifty/Action/Record.pm:181
-msgid "The passwords you typed didn't match each other"
-msgstr "パスワードが一致しません"
-
-#: lib/Jifty/Web.pm:365
-msgid "There was an error completing the request.  Please try again later."
-msgstr "リクエストの処理中にエラーが発生しました。しばらく待ってから再度試してみてください"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:81
-msgid "There was an error setting your password."
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:37
-msgid "There's a pretty good chance that error message doesn't mean anything to you, but we'd rather you have a little bit of information about what went wrong than nothing. We've logged this error, so we know we need to write something friendly explaining just what happened and how to fix it."
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:419
-msgid "This console lets you manage the records in your Jifty database. Below, you should see a list of all your database tables. Feel free to go through and add, delete or modify records."
-msgstr "ここでは Jifty データベースのレコードを管理できます。下にデータベースの全テーブルが一覧されているはずですので、自由に表示・作成・削除・修正してください。"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:425
-msgid "To disable this administrative console, add \"AdminMode: 0\" under the \"framework:\" settings in the config file (etc/config.yml)."
-msgstr "この管理画面を無効にするには、設定ファイル(etc/config.yml)の \"framework:\" の項目の下に \"AdminMode: 0\" を追加してください。"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:127
-msgid "Toggle search"
-msgstr "検索の切り替え"
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:173 share/web/templates/__jifty/error/mason_internal_error:6
-msgid "Try again"
-msgstr "再度試してみてください"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:108
-msgid "Try again later. We're really, really sorry."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:53
-msgid "Type that again?"
-msgstr ""
-
-#: lib/Jifty/Action/Record/Update.pm:156
-msgid "Updated"
-msgstr "更新しました"
-
-#: share/web/templates/__jifty/halo:93
-msgid "Variables"
-msgstr ""
-
-#: lib/Jifty.pm:27
-msgid "W00t"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:114
-msgid "We've sent a confirmation message to your email box."
-msgstr ""
-
-#: lib/Jifty/I18N.pm:31
-#. ('Bob', 'World')
-msgid "Welcome %1 to the %2"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:181
-#. ($user->name)
-msgid "Welcome back, %1."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmEmail.pm:40
-#. ($appname)
-msgid "Welcome to %1!"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:113
-#. (Jifty->config->framework('ApplicationName')
-msgid "Welcome to %1, %2."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm:57
-#. (Jifty->config->framework('ApplicationName')
-msgid "Welcome to %1, %2. "
-msgstr ""
-
-#: lib/Jifty/Plugin/SkeletonApp/View.pm:75 share/web/templates/index.html:1
-msgid "Welcome to your new Jifty application"
-msgstr "Jifty の新規アプリケーションです"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:63
-msgid "You don't exist."
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:130
-msgid "You got to a page that we don't think exists."
-msgstr ""
-
-#: share/web/templates/dhandler:5
-msgid "You got to a page that we don't think exists.  Anyway, the software has logged this error. Sorry about this."
-msgstr "このページは存在しません。エラーとして記録しておきました。ご不便をお詫びいたします"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm:44
-msgid "You have already confirmed your account."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:98
-msgid "You lost your password. A link to reset it will be sent to the following email address:"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:115
-msgid "You lost your password. A reminder will be send to the following mail:"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:152
-msgid "You may have mistyped your email address or password. Give it another shot."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:146
-msgid "You may have mistyped your email or password. Give it another shot."
-msgstr ""
-
-#: lib/Jifty/Action.pm:865
-msgid "You need to fill in this field"
-msgstr "必須項目です"
-
-#: lib/Jifty/Plugin/SkeletonApp/View.pm:75 share/web/templates/index.html:3
-#. ('http://hdl.loc.gov/loc.pnp/cph.3c13461')
-msgid "You said you wanted a pony. (Source %1)"
-msgstr "こんなのが欲しかったんでしょう?(出典:%1)"
-
-#: lib/Jifty/Plugin/Authentication/Password/View.pm:69
-msgid "You're already logged in."
-msgstr ""
-
-#: lib/Jifty/Plugin/SkeletonApp/View.pm:34 share/web/templates/_elements/sidebar:7
-msgid "You're not currently signed in."
-msgstr "ログインしていません"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:38
-msgid "Your browser can remember your login for you"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:87
-msgid "Your password has been reset.  Welcome back."
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:28
-msgid "Your password should be at least six characters"
-msgstr ""
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:246
-msgid "asc"
-msgstr "昇順"
-
-#: lib/Jifty/Plugin/AdminUI/View-not-yet.pm:264
-msgid "desc"
-msgstr "降順"
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:31
-msgid "email address"
-msgstr ""
-
-#: lib/Jifty/Plugin/ErrorTemplates/View.pm:46
-msgid "for now, and try to forget that we let you down."
-msgstr ""
-
-#: lib/Jifty/Manual/PageRegions.pod:188
-msgid "text of the link"
-msgstr ""
-
-#: lib/Jifty/Manual/PageRegions.pod:225
-msgid "text of the link that hides"
-msgstr ""
-
-#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:37
-msgid "type your password again"
-msgstr ""
-
-#: lib/Jifty/Action.pm:1050
-msgid "warning"
-msgstr ""
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Kenichi Ishigaki <ishigaki at tcool.org>\n"
+"Language-Team: Japanese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmLostPassword.pm:38
+#. ($appname,$confirm_url)
+msgid ""
+"\n"
+"You're getting this message because you (or somebody claiming to be you)\n"
+"request to reset your password for %1.\n"
+"\n"
+"If you don't want to reset your password just ignore this message.\n"
+"\n"
+"To reset your password, click on the link below:\n"
+"\n"
+"%2\n"
+msgstr ""
+"\n"
+"%1 用のパスワードをリセットします。\n"
+"\n"
+"もしこのメールに心当たりがなく、パスワードをリセットする\n"
+"必要がない場合は無視してください。\n"
+"\n"
+"本当にリセットする場合は下のリンクをクリックしてください。\n"
+"\n"
+"%2\n"
+
+#: lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmEmail.pm:41
+#. ($appname,$confirm_url)
+msgid ""
+"\n"
+"You're getting this message because you (or somebody claiming to be you)\n"
+"wants to use %1. \n"
+"\n"
+"We need to make sure that we got your email address right.  Click on the link below to get started:\n"
+"\n"
+"%2\n"
+msgstr ""
+"\n"
+"%1 へのご登録ありがとうございます。\n"
+"\n"
+"メールアドレスが正しいか確認させていただきます。下のリンクをクリックしてください。\n"
+"\n"
+"%2\n"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/View.pm:43
+msgid ""
+" id is 'facebook_link' };\n"
+"        span { _(\"Login to Facebook now to link it with your current account!\") };\n"
+"        a {{ href is $plugin->get_link_url };\n"
+"            img {{ src is 'http://static.ak.facebook.com/images/devsite/facebook_login.gif', border is '0' "
+msgstr ""
+
+#: lib/Jifty/Plugin/Authentication/Facebook/View.pm:26
+msgid ""
+" id is 'facebook_login' };\n"
+"        span { _(\"Login to Facebook now to get started!\") };\n"
+"        a {{ href is $plugin->get_login_url };\n"
+"            img {{ src is 'http://static.ak.facebook.com/images/devsite/facebook_login.gif', border is '0' "
+msgstr ""
+
+#: lib/Jifty/Action/Record/Search.pm:172
+msgid "!=>< allowed"
+msgstr "! = > < は利用できません"
+
+#: lib/Jifty/Notification.pm:108 lib/Jifty/Notification.pm:125
+#. ($appname, Jifty->config->framework('AdminEmail')
+msgid "%1 <%2>"
+msgstr "%1 <%2>"
+
+#: lib/Jifty/Action/Record/Search.pm:143
+#. ($label)
+msgid "%1 after"
+msgstr "%1 より後"
+
+#: lib/Jifty/Action/Record/Search.pm:146
+#. ($label)
+msgid "%1 before"
+msgstr "%1 より前"
+
+#: lib/Jifty/Action/Record/Search.pm:133
+#. ($label)
+msgid "%1 contains"
+msgstr "%1 を含む"
+
+#:
+msgid "%1 entries"
+msgstr "%1 件"
+
+#: lib/Jifty/Action/Record/Search.pm:166
+#. ($label)
+msgid "%1 greater or equal to"
+msgstr "%1 と同じかそれ以上"
+
+#: lib/Jifty/Action/Record/Search.pm:160
+#. ($label)
+msgid "%1 greater than"
+msgstr "%1 より大きい"
+
+#: lib/Jifty/Action/Record/Search.pm:121
+#. ($label)
+msgid "%1 is not"
+msgstr "%1 以外"
+
+#: lib/Jifty/Action/Record/Search.pm:136
+#. ($label)
+msgid "%1 lacks"
+msgstr "%1 を含まない"
+
+#: lib/Jifty/Action/Record/Search.pm:169
+#. ($label)
+msgid "%1 less or equal to"
+msgstr "%1 と同じかそれ以下"
+
+#: lib/Jifty/Action/Record/Search.pm:163
+#. ($label)
+msgid "%1 less than"
+msgstr "%1 より小さい"
+
+#: share/web/templates/__jifty/error/mason_internal_error:31 share/web/templates/__jifty/error/mason_internal_error:35 share/web/templates/__jifty/error/mason_internal_error:39
+#. ($path, $line)
+#. ($file, $line)
+msgid "%1 line %2"
+msgstr "%1 %2行目"
+
+#: share/web/templates/__jifty/halo:119
+#. ($_->[3])
+msgid "%1 seconds"
+msgstr "%1 秒"
+
+#: lib/Jifty/Action/Record/Search.pm:149
+#. ($label)
+msgid "%1 since"
+msgstr "%1 と同じかそれ以降"
+
+#: lib/Jifty/Action/Record/Search.pm:152
+#. ($label)
+msgid "%1 until"
+msgstr "%1 と同じかそれ以前"
+
+#: lib/Jifty/Action/Record/Search.pm:81
+msgid "(any)"
+msgstr "(指定なし)"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm:58
+msgid ". Your email address has now been confirmed."
+msgstr "メールアドレスの確認が完了しました。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:96
+msgid "A link to reset your password has been sent to your email account."
+msgstr "お使いのメールアカウントにパスワードをリセットするリンクを送信しました。"
+
+#: lib/Jifty/Notification.pm:110 lib/Jifty/Notification.pm:127
+#. ($appname)
+msgid "A notification from %1!"
+msgstr "%1 からのお知らせです!"
+
+#:
+msgid "Actions"
+msgstr "操作"
+
+#: lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm:33
+msgid "Administration"
+msgstr "管理"
+
+#: lib/Jifty/View/Declare/Page.pm:176 share/web/templates/_elements/wrapper:11
+msgid "Administration mode is enabled."
+msgstr "管理モードが有効になっています。"
+
+#: lib/Jifty/View/Declare/Page.pm:173 share/web/templates/_elements/wrapper:11
+msgid "Alert"
+msgstr "注意"
+
+#: lib/Jifty/Action/Record/Create.pm:92
+msgid "An error occurred.  Try again later"
+msgstr "エラーが発生しました。しばらく待ってから再度試してみてください"
+
+#: lib/Jifty/Action/Record/Search.pm:177
+msgid "Any field contains"
+msgstr "検索したい文字列"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:131
+msgid "Anyway, the software has logged this error."
+msgstr "ともあれ、エラーは記録しました。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:53
+msgid "Authentication token"
+msgstr "認証トークン"
+
+#:
+msgid "Back to the admin console"
+msgstr "管理画面に戻る"
+
+#:
+msgid "Back to the application"
+msgstr "アプリケーションに戻る"
+
+#: share/web/templates/__jifty/halo:117
+msgid "Bindings"
+msgstr "バインディング"
+
+#: share/web/templates/helpers/calendar.html:4
+#. (_ &><body class="calpopup"><a href="#" onclick="window.close()
+msgid "Calendar"
+msgstr "カレンダー"
+
+#: lib/Jifty/View/Declare/CRUD.pm:419
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: share/web/templates/__jifty/halo:81
+msgid "Children"
+msgstr "子"
+
+#: share/web/templates/helpers/calendar.html:4
+msgid "Close window"
+msgstr "閉じる"
+
+#:
+msgid "Confirm delete?"
+msgstr "本当に削除しますか?"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:94
+msgid "Confirmation resent."
+msgstr "確認メールを再送しました。"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:65
+msgid "Continue"
+msgstr "次"
+
+#: lib/Jifty/View/Declare/CRUD.pm:675
+msgid "Create"
+msgstr "作成"
+
+#: lib/Jifty/Action/Record/Create.pm:91
+#. (ref($record)
+msgid "Create of %1 failed: %2"
+msgstr "%1 の作成に失敗しました: %2"
+
+#: lib/Jifty/Action/Record/Create.pm:118
+msgid "Created"
+msgstr "作成しました"
+
+#:
+msgid "Database Administration"
+msgstr "データベース管理"
+
+#: lib/Jifty/View/Declare/CRUD.pm:429
+msgid "Delete"
+msgstr "削除"
+
+#: lib/Jifty/Action/Record/Delete.pm:82
+msgid "Deleted"
+msgstr "削除しました"
+
+#: lib/Jifty/View/Declare/CRUD.pm:349 share/web/templates/__jifty/halo:126 share/web/templates/__jifty/halo:20
+msgid "Edit"
+msgstr "編集"
+
+#: lib/Jifty/Mason/Halo.pm:104
+#. ($comp_name)
+msgid "Edit %1"
+msgstr "%1 を編集"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:23 lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:32
+msgid "Email"
+msgstr "メール"
+
+#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:52
+msgid "Email address"
+msgstr "メールアドレス"
+
+#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:54
+msgid "Email address confirmed?"
+msgstr "確認済?"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:209
+msgid "Fill in your address below, and we'll send out another confirmation email to you. "
+msgstr "メールアドレスをご記入ください。再度確認メールを送信します。"
+
+#: lib/Jifty/Action.pm:1312
+msgid "Foo cannot contain -, *, +, or ?."
+msgstr "-、*、+、?は利用できません。"
+
+#: lib/Jifty/Action.pm:1306
+msgid "Foo cannot contain uppercase letters."
+msgstr "大文字は利用できません。"
+
+#: lib/Jifty/Action.pm:1285
+msgid "Foo values are always in lowercase."
+msgstr "かならず小文字で記入してください。"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:27
+msgid "For one reason or another, you got to a web page that caused a bit of an error. And then you got to our 'basic' error handler. Which means we haven't written a pretty, easy to understand error message for you just yet. The message we do have is :"
+msgstr "なんらかの理由でページにエラーが発生しました。現時点ではわかりやすい綺麗なエラーメッセージを表示できません。実際のエラーメッセージは次の通りです: "
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:138 share/web/templates/dhandler:7
+msgid "Go back home..."
+msgstr "ホームページに戻る…"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:35
+msgid "Go for it!"
+msgstr "登録する!"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:34
+msgid "Hashed Password"
+msgstr "パスワードハッシュ"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:44
+msgid "Head on back home"
+msgstr "ホームページに戻る"
+
+#: lib/Jifty/I18N.pm:19 lib/Jifty/I18N.pm:23
+#. ('World')
+msgid "Hello, %1!"
+msgstr "%1 さん、こんにちは!"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/Action/LoginFacebookUser.pm:103
+#. (Jifty->web->current_user->user_object->facebook_name)
+msgid "Hi %1!"
+msgstr "%1 さん、こんにちは!"
+
+#: lib/Jifty/Plugin/SkeletonApp/View.pm:31 share/web/templates/_elements/sidebar:4
+#. ($u->username)
+#. (Jifty->web->current_user->username)
+msgid "Hiya, %1."
+msgstr "%1 さん、こんにちは"
+
+#: lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm:26
+msgid "Home"
+msgstr "ホーム"
+
+#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:49
+msgid "How should I display your name to other users?"
+msgstr "ほかのユーザに公開する名前を決めてください。"
+
+#: lib/Jifty/Action.pm:1212
+msgid "I changed $field for you"
+msgstr "$fieldを変更しました"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:64
+msgid "I'm not sure how this happened."
+msgstr "原因は不明です。"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:59
+msgid "If the username provided conflicts with an existing username or contains invalid characters, you will have to give us a new one."
+msgstr "ユーザ名が既に登録されている場合、または利用できない文字が含まれている場合は新しいユーザ名を登録していただきます。"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:27
+msgid "If you have a Livejournal or other OpenID account, you don't even need to sign up. Just log in."
+msgstr "LivejournalなどのOpenIDアカウントをお持ちの場合は、サインアップは不要です。ログインしてください。"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:62
+msgid "Internal error"
+msgstr "内部エラー"
+
+#: lib/Jifty/Plugin/OpenID/Action/AuthenticateOpenID.pm:59
+msgid "Invalid OpenID URL.  Please check to make sure it is correct.  (@{[$csr->err]})"
+msgstr "OpenID URLが正しくありません。ご確認ください。(@{[$csr->err]})"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:63 lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:75 lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:79
+msgid "It doesn't look like there's an account by that name."
+msgstr "そのようなアカウントは存在しないようです。"
+
+#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:106
+msgid "It looks like somebody else is using that address. Is there a chance you have another account?"
+msgstr "そのアドレスは既に使われているようです。別のアカウントをお持ちではありませんか?"
+
+#: lib/Jifty/Plugin/OpenID/Dispatcher.pm:43
+msgid "It looks like someone is already using that OpenID."
+msgstr "そのOpenIDは既に使われているようです。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:75
+msgid "It looks like you already have an account. Perhaps you want to <a href=\"/login\">log in</a> instead?"
+msgstr "既にアカウントをお持ちのようです。<a href=\"/login\">ログイン</a>してください。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:75
+msgid "It looks like you didn't enter the same password into both boxes. Give it another shot?"
+msgstr "パスワードが一致しません。もう一度入力してください。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:79
+msgid "It looks like you're already confirmed."
+msgstr "確認済みのようです。"
+
+#:
+msgid "Jifty Developer Documentation Online"
+msgstr "開発者向けオンラインドキュメント"
+
+#:
+msgid "Jifty Pod Online"
+msgstr "オンラインドキュメント"
+
+#: lib/Jifty/View/Declare/Page.pm:194 share/web/templates/_elements/wrapper:18
+msgid "Loading..."
+msgstr "読込み中…"
+
+#: lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm:132 lib/Jifty/Plugin/Authentication/Password/View.pm:88
+msgid "Login"
+msgstr "ログイン"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/View.pm:24
+msgid "Login to Facebook now to get started!"
+msgstr "Facebookを始めよう!"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/View.pm:41
+msgid "Login to Facebook now to link it with your current account!"
+msgstr "お使いのアカウントをFacebookにリンクさせましょう!"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:82
+msgid "Login with a password"
+msgstr "パスワードでログイン"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:17
+msgid "Login with your OpenID"
+msgstr "OpenIDでログイン"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:57
+msgid "Login!"
+msgstr "ログイン!"
+
+#: lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm:151
+msgid "Logout"
+msgstr "ログアウト"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:90
+msgid "Lost your password?"
+msgstr "パスワードをお忘れですか?"
+
+#: share/web/templates/__jifty/error/mason_internal_error:1
+msgid "Mason error"
+msgstr "Mason エラー"
+
+#:
+msgid "Models"
+msgstr "モデル"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:114
+msgid "New password"
+msgstr "新しいパスワード"
+
+#: lib/Jifty/View/Declare/CRUD.pm:631
+msgid "Next Page"
+msgstr "次のページ"
+
+#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:48
+msgid "Nickname"
+msgstr "ニックネーム"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:79
+msgid "No account yet? It's quick and easy. "
+msgstr "登録はお済みですか?"
+
+#: lib/Jifty/Action/Record/Search.pm:178
+msgid "No field contains"
+msgstr "排除したい文字列"
+
+#:
+msgid "No items found"
+msgstr "見つかりませんでした"
+
+#: lib/Jifty/View/Declare/CRUD.pm:550
+msgid "No items found."
+msgstr "見つかりませんでした。"
+
+#: lib/Jifty/Web.pm:308
+msgid "No request to handle"
+msgstr "処理できるリクエストがありません"
+
+#: lib/Jifty/Plugin/UUID/Widget.pm:37
+msgid "No value yet"
+msgstr "値がありません"
+
+#:
+msgid "Online Documentation"
+msgstr "オンラインドキュメント"
+
+#: lib/Jifty/Plugin/OnlineDocs/Dispatcher.pm:26
+msgid "Online docs"
+msgstr "オンラインドキュメント"
+
+#: lib/Jifty/Plugin/OpenID/Action/AuthenticateOpenID.pm:27
+msgid "OpenID URL"
+msgstr "OpenID URL"
+
+#: lib/Jifty/Plugin/OpenID/Action/VerifyOpenID.pm:54
+msgid "OpenID verification failed.  It looks like you cancelled the OpenID verification request."
+msgstr "OpenIDの確認に失敗しました。確認をキャンセルされませんでしたか。"
+
+#: lib/Jifty/Plugin/OpenID/Action/VerifyOpenID.pm:63
+msgid "OpenID verification failed: "
+msgstr "OpenIDの確認に失敗しました: "
+
+#: lib/Jifty/View/Declare/CRUD.pm:598
+#. ($page, $collection->pager->last_page)
+msgid "Page %1 of %2"
+msgstr "%1 / %2 ページ"
+
+#: share/web/templates/__jifty/halo:1
+msgid "Page info"
+msgstr "ページ情報"
+
+#: share/web/templates/__jifty/halo:72
+msgid "Parent"
+msgstr "親"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:29 lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:32 lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:59
+msgid "Password"
+msgstr "パスワード"
+
+#: lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:134
+msgid "Passwords need to be at least six characters long"
+msgstr "パスワードは最低6文字以上にしてください"
+
+#: lib/Jifty/Record.pm:485 lib/Jifty/Record.pm:564 lib/Jifty/Record.pm:71
+msgid "Permission denied"
+msgstr "権限がありません"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:66
+msgid "Please email us!"
+msgstr "メールをお送りください!"
+
+#: lib/Jifty/View/Declare/CRUD.pm:620
+msgid "Previous Page"
+msgstr "前のページ"
+
+#: lib/Jifty/View/Declare/CRUD.pm:432
+msgid "Really delete?"
+msgstr "本当に削除しますか?"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:65
+msgid "Really, really sorry."
+msgstr "本当に申し訳ないです。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:37
+msgid "Remember me?"
+msgstr "記憶しますか?"
+
+#: share/web/templates/__jifty/halo:69
+#. ($frame->{'render_time'})
+msgid "Rendered in %1s"
+msgstr "描画時間: %1秒"
+
+#:
+msgid "Run the action"
+msgstr "実行"
+
+#: share/web/templates/__jifty/halo:111
+msgid "SQL Statements"
+msgstr "SQL文"
+
+#: lib/Jifty/View/Declare/CRUD.pm:410
+msgid "Save"
+msgstr "保存"
+
+#:
+msgid "Schema"
+msgstr "スキーマ"
+
+#: lib/Jifty/View/Declare/CRUD.pm:298
+msgid "Search"
+msgstr "検索"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:150 lib/Jifty/Plugin/Authentication/Password/View.pm:180
+msgid "Send"
+msgstr "送信"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:175
+msgid "Send a password reminder"
+msgstr "通知メールを送信する"
+
+#: lib/Jifty/Plugin/Feedback/View.pm:21
+msgid "Send us feedback!"
+msgstr "ご意見ご感想をお寄せください!"
+
+#: lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm:137 lib/Jifty/Plugin/Authentication/Password/View.pm:42 lib/Jifty/Plugin/Authentication/Password/View.pm:47
+msgid "Sign up"
+msgstr "サインアップ"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:80
+msgid "Sign up for an account!"
+msgstr "サインアップする"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:108
+#. ($msg)
+msgid "Something bad happened and we couldn't create your account: %1"
+msgstr "問題が発生したためアカウントを作成できませんでした: %1"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:149
+msgid "Something went awry"
+msgstr "問題が発生しました"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:124 share/web/templates/dhandler:1
+msgid "Something's not quite right"
+msgstr "原因不明のエラーです"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:132
+msgid "Sorry about this."
+msgstr "申し訳ないです。"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/Action/LoginFacebookUser.pm:62
+msgid "Sorry, something weird happened (we couldn't create a user for you).  Try again later."
+msgstr "問題が発生したため、ユーザの作成に失敗しました。お手数ですがあとでもう一度試してみてください。"
+
+#:
+msgid "Table of Contents"
+msgstr "目次"
+
+#: lib/Jifty/Plugin/Feedback/View.pm:23
+#. (Jifty->config->framework('ApplicationName')
+msgid "Tell us what's good, what's bad, and what else you want %1 to do!"
+msgstr "%1へのご意見、ご感想、ご要望をお寄せください。"
+
+#: lib/Jifty/Plugin/User/Mixin/Model/User.pm:99
+#. ($new_email)
+msgid "That %1 doesn't look like an email address."
+msgstr "%1は正しいメールアドレスではないようです。"
+
+#: lib/Jifty/Action.pm:975
+msgid "That doesn't look like a correct value"
+msgstr "値が不適切なようです"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:68 lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm:72 lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:70
+msgid "That doesn't look like an email address."
+msgstr "正しいメールアドレスではないようです。"
+
+#: lib/Jifty/Action/Record.pm:300
+msgid "That doesn't look right, but I don't know why"
+msgstr "原因不明のエラーです"
+
+#: lib/Jifty/Plugin/OpenID/Dispatcher.pm:48
+msgid "The OpenID '$openid' has been linked to your account."
+msgstr "OpenID '$openid'をお使いのアカウントにリンクさせました。"
+
+#: lib/Jifty/Action/Record.pm:205
+msgid "The passwords you typed didn't match each other"
+msgstr "パスワードが一致しません"
+
+#: lib/Jifty/Web.pm:429
+msgid "There was an error completing the request.  Please try again later."
+msgstr "リクエストの処理中にエラーが発生しました。あとでもう一度試してみてください。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:81
+msgid "There was an error setting your password."
+msgstr "パスワードの設定中にエラーが発生しました。"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:37
+msgid "There's a pretty good chance that error message doesn't mean anything to you, but we'd rather you have a little bit of information about what went wrong than nothing. We've logged this error, so we know we need to write something friendly explaining just what happened and how to fix it."
+msgstr "このエラーメッセージはみなさんにはあまり意味がないかもしれませんが、何もないよりは多少なりとも何が起こっているかお知らせした方が安心していただけると思っています。このエラーは記録しましたので、今度はわかりやすいメッセージを用意したり問題を解決できるようにいたします。"
+
+#:
+msgid "This console lets you manage the records in your Jifty database. Below, you should see a list of all your database tables. Feel free to go through and add, delete or modify records."
+msgstr "ここでは Jifty データベースのレコードを管理できます。下にデータベースの全テーブルが一覧されているはずですので、自由に表示・作成・削除・修正してください。"
+
+#:
+msgid "To disable this administrative console, add \"AdminMode: 0\" under the \"framework:\" settings in the config file (etc/config.yml)."
+msgstr "この管理画面を無効にするには、設定ファイル(etc/config.yml)の \"framework:\" の項目の下に \"AdminMode: 0\" を追加してください。"
+
+#: lib/Jifty/View/Declare/CRUD.pm:518
+msgid "Toggle search"
+msgstr "検索の切り替え"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:173 share/web/templates/__jifty/error/mason_internal_error:6
+msgid "Try again"
+msgstr "もう一度試してみてください"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:108
+msgid "Try again later. We're really, really sorry."
+msgstr "もう一度試してみてください。お手数をおかけして申し訳ないです。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:53
+msgid "Type that again?"
+msgstr "もう一度入力してください。"
+
+#: lib/Jifty/Action/Record/Update.pm:170
+msgid "Updated"
+msgstr "更新しました"
+
+#: share/web/templates/__jifty/halo:93
+msgid "Variables"
+msgstr "変数"
+
+#: lib/Jifty.pm:27
+msgid "W00t"
+msgstr "OK"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:53
+msgid "We need you to set a username or quickly check the one associated with your OpenID. Your username is what other people will see when you ask questions or make suggestions"
+msgstr "ユーザ名を設定するか、お使いのOpenIDに関連づけられたユーザ名をすぐに確認してください。このユーザ名は質問や提案をするときに表示されます"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:114
+msgid "We've sent a confirmation message to your email box."
+msgstr "お使いのメールボックスに確認のメールを送信しました。"
+
+#: lib/Jifty/I18N.pm:31
+#. ('Bob', 'World')
+msgid "Welcome %1 to the %2"
+msgstr "%1さん、%2へようこそ"
+
+#: lib/Jifty/Plugin/OpenID/Dispatcher.pm:64
+msgid "Welcome back, "
+msgstr "おかえりなさい"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:182
+#. ($user->name)
+msgid "Welcome back, %1."
+msgstr "%1さん、おかえりなさい"
+
+#: lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmEmail.pm:40
+#. ($appname)
+msgid "Welcome to %1!"
+msgstr "%1へようこそ!"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm:57 lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:113
+#. (Jifty->config->framework('ApplicationName')
+msgid "Welcome to %1, %2."
+msgstr "%2さん、%1へようこそ"
+
+#: lib/Jifty/Plugin/SkeletonApp/View.pm:81 share/web/templates/index.html:1
+msgid "Welcome to your new Jifty application"
+msgstr "Jifty の新規アプリケーションへようこそ"
+
+#: lib/Jifty/Plugin/OpenID/Action/CreateOpenIDUser.pm:104
+msgid "Welcome, "
+msgstr "ようこそ"
+
+#: lib/Jifty/Plugin/OpenID/View.pm:42
+msgid "You already logged in."
+msgstr "ログイン済みです。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:63
+msgid "You don't exist."
+msgstr "そのようなユーザは存在しません。"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:130
+msgid "You got to a page that we don't think exists."
+msgstr "このページは存在しません。"
+
+#: share/web/templates/dhandler:5
+msgid "You got to a page that we don't think exists.  Anyway, the software has logged this error. Sorry about this."
+msgstr "このページは存在しません。エラーとして記録しておきました。ご不便をお詫びいたします。"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm:44
+msgid "You have already confirmed your account."
+msgstr "アカウントは確認済みです。"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:146
+msgid "You lost your password. A link to reset it will be sent to the following email address:"
+msgstr "パスワードをリセットします。このメールアドレスに通知を送ります:"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:176
+msgid "You lost your password. A reminder will be send to the following mail:"
+msgstr "このメールアドレスに通知を送ります:"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:146 lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:152
+msgid "You may have mistyped your email or password. Give it another shot."
+msgstr "メールアドレスかパスワードが間違っているようです。もう一度入力してください。"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/Action/LinkFacebookUser.pm:40
+msgid "You must be logged in to link your user to your Facebook account."
+msgstr "Facebookアカウントとリンクさせるにはログインする必要があります。"
+
+#: lib/Jifty/Action.pm:962
+msgid "You need to fill in this field"
+msgstr "必須項目です"
+
+#: lib/Jifty/Plugin/SkeletonApp/View.pm:81 share/web/templates/index.html:3
+#. ('http://hdl.loc.gov/loc.pnp/cph.3c13461')
+msgid "You said you wanted a pony. (Source %1)"
+msgstr "こんなのが欲しかったんでしょう?(出典:%1)"
+
+#: lib/Jifty/Plugin/Authentication/Password/View.pm:96
+msgid "You're already logged in."
+msgstr "ログイン済みです。"
+
+#: lib/Jifty/Plugin/SkeletonApp/View.pm:34 share/web/templates/_elements/sidebar:6
+msgid "You're not currently signed in."
+msgstr "サインインしていません。"
+
+#: lib/Jifty/Plugin/Authentication/Facebook/Action/LinkFacebookUser.pm:72
+#. (Jifty->web->current_user->user_object->facebook_name)
+msgid "Your account has been successfully linked to your Facebook user %1!"
+msgstr "アカウントをFacebookのユーザ%1にリンクさせました!"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:38
+msgid "Your browser can remember your login for you"
+msgstr "お使いのブラウザはログインを記憶させることができます"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:87
+msgid "Your password has been reset.  Welcome back."
+msgstr "パスワードをリセットしました。おかえりなさい"
+
+#: lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm:61
+msgid "Your password should be at least six characters"
+msgstr "パスワードは最低6文字以上にしてください"
+
+#:
+msgid "asc"
+msgstr "昇順"
+
+#:
+msgid "desc"
+msgstr "降順"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:31
+msgid "email address"
+msgstr "メールアドレス"
+
+#: lib/Jifty/Plugin/ErrorTemplates/View.pm:46
+msgid "for now, and try to forget that we let you down."
+msgstr "。ご不便をおかけして申し訳ないです。"
+
+#: lib/Jifty/Manual/PageRegions.pod:188
+msgid "text of the link"
+msgstr "リンクテキスト"
+
+#: lib/Jifty/Manual/PageRegions.pod:225
+msgid "text of the link that hides"
+msgstr "隠すリンクテキスト"
+
+#: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:37
+msgid "type your password again"
+msgstr "もう一度パスワードを入力してください"
+
+#: lib/Jifty/Action.pm:1172
+msgid "warning"
+msgstr "警告"

Modified: jifty/branches/virtual-models/share/po/zh_tw.po
==============================================================================
--- jifty/branches/virtual-models/share/po/zh_tw.po	(original)
+++ jifty/branches/virtual-models/share/po/zh_tw.po	Wed Oct 31 13:27:40 2007
@@ -796,15 +796,15 @@
 
 #: lib/Jifty/Plugin/Authentication/Password/View.pm:146
 msgid "You lost your password. A link to reset it will be sent to the following email address:"
-msgstr ""
+msgstr "您忘記密碼了.我們會寄送一個重設密碼的連結到下面的電郵地址:"
 
 #: lib/Jifty/Plugin/Authentication/Password/View.pm:176
 msgid "You lost your password. A reminder will be send to the following mail:"
-msgstr ""
+msgstr "您忘記密碼了.我們會寄送一份提示到下面的電郵地址:"
 
 #: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:146 lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:152
 msgid "You may have mistyped your email or password. Give it another shot."
-msgstr ""
+msgstr "你可以打錯了電郵或密碼.請再試一次"
 
 #: lib/Jifty/Plugin/Authentication/Facebook/Action/LinkFacebookUser.pm:40
 msgid "You must be logged in to link your user to your Facebook account."

Modified: jifty/branches/virtual-models/share/web/static/js/prototype.js
==============================================================================
--- jifty/branches/virtual-models/share/web/static/js/prototype.js	(original)
+++ jifty/branches/virtual-models/share/web/static/js/prototype.js	Wed Oct 31 13:27:40 2007
@@ -645,9 +645,9 @@
         this.options.asynchronous);
 
       if (this.options.asynchronous) {
-        this.transport.onreadystatechange = this.onStateChange.bind(this);
         setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
       }
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
 
       this.setRequestHeaders();
 

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Dispatcher.pm
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Dispatcher.pm	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Dispatcher.pm	Wed Oct 31 13:27:40 2007
@@ -5,19 +5,20 @@
 
 my @login_required = qw{
     oauth/authorize
+    nuke/?
 };
 
 my $login_required = join '|', map {"^$_"} @login_required;
 $login_required = qr/$login_required/;
 
-before '*' => run {
+before '**' => run {
     if (Jifty->web->current_user->id) {
         my $top = Jifty->web->navigation;
         $top->child( _('Pick!')    => url => '/pick' );
         $top->child( _('Choices')  => url => '/choices' );
     }
     elsif ($1 =~ $login_required) {
-        tangent 'login';
+        tangent '/login';
     }
 };
 

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Model/User.pm
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Model/User.pm	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Model/User.pm	Wed Oct 31 13:27:40 2007
@@ -1,11 +1,18 @@
-package TestApp::Plugin::OAuth::Model::User;
-use base qw/Jifty::Record/;
+use strict;
+use warnings;
 
+package TestApp::Plugin::OAuth::Model::User;
 use Jifty::DBI::Schema;
-use Jifty::Record schema {
+
+use TestApp::Plugin::OAuth::Record schema {
     column 'tasty' =>
-        type is 'boolean';
+        type is 'boolean',
+        default is 'f';
+
 };
 
+use Jifty::Plugin::User::Mixin::Model::User;
+use Jifty::Plugin::Authentication::Password::Mixin::Model::User;
+
 1;
 

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Test.pm
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Test.pm	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/lib/TestApp/Plugin/OAuth/Test.pm	Wed Oct 31 13:27:40 2007
@@ -8,7 +8,9 @@
 use Crypt::OpenSSL::RSA;
 use Digest::HMAC_SHA1 'hmac_sha1';
 
-our @EXPORT = qw($timestamp $url $mech $pubkey $seckey response_is sign get_latest_token);
+our @EXPORT = qw($timestamp $url $mech $pubkey $seckey $token_obj
+                 response_is sign get_latest_token
+                 allow_ok deny_ok _authorize_request_token);
 
 sub setup {
     my $class = shift;
@@ -21,6 +23,7 @@
 our $mech;
 our $pubkey = slurp('t/id_rsa.pub');
 our $seckey = slurp('t/id_rsa');
+our $token_obj;
 
 sub response_is {
     ++$timestamp;
@@ -66,12 +69,13 @@
     local $Test::Builder::Level = $Test::Builder::Level + 1;
     main::is($r->code, $code, $testname);
 
-    my $token = get_latest_token();
+    undef $token_obj;
+    get_latest_token();
     if ($code == 200) {
-        main::ok($token, "Successfully loaded a token object with token ".$token->token.".");
+        main::ok($token_obj, "Successfully loaded a token object with token ".$token_obj->token.".");
     }
     else {
-        main::ok(!$token, "Did not get a token");
+        main::ok(!$token_obj, "Did not get a token");
     }
 }
 
@@ -158,7 +162,7 @@
     if ($mech->uri =~ /request_token/) {
         $package .= 'RequestToken';
     }
-    elsif ($mech->uri =~ /request_token/) {
+    elsif ($mech->uri =~ /access_token/) {
         $package .= 'AccessToken';
     }
     else {
@@ -166,7 +170,7 @@
         return;
     }
 
-    my $token_obj = $package->new(current_user => Jifty::CurrentUser->superuser);
+    $token_obj = $package->new(current_user => Jifty::CurrentUser->superuser);
     $token_obj->load_by_cols(token => $token);
 
     if (!$token_obj->id) {
@@ -177,5 +181,47 @@
     return $token_obj;
 }
 
+sub allow_ok {
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+    my $error = _authorize_request_token('Allow');
+    ok(0, $error), return if $error;
+
+    my $name = $token_obj->consumer->name;
+    $mech->content_contains("Allowing $name to access your stuff");
+}
+
+sub deny_ok {
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+    my $error = _authorize_request_token('Deny');
+    ok(0, $error), return if $error;
+
+    my $name = $token_obj->consumer->name;
+    $mech->content_contains("Denying $name the right to access your stuff");
+}
+
+sub _authorize_request_token {
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+    my $which_button = shift
+        or die "You did not specify a button to click to _authorize_request_token";
+
+    my $token = shift || $token_obj->token;
+    $token = $token->token if ref $token;
+
+    $mech->get('/oauth/authorize')
+        or return "Unable to navigate to /oauth/authorize";;
+    $mech->content =~ /If you trust this application/
+        or return "Content did not much qr/If you trust this application/";
+    my $moniker = $mech->moniker_for('TestApp::Plugin::OAuth::Action::AuthorizeRequestToken')
+        or return "Unable to find moniker for AuthorizeRequestToken";
+    $mech->fill_in_action($moniker, token => $token)
+        or return "Unable to fill in the AuthorizeRequestToken action";
+    $mech->click_button(value => $which_button)
+        or return "Unable to click $which_button button";
+    return;
+}
+
 1;
 

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/00-test-setup.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/00-test-setup.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/00-test-setup.t	Wed Oct 31 13:27:40 2007
@@ -7,7 +7,7 @@
 
 use TestApp::Plugin::OAuth::Test;
 
-if (eval { require Net::OAuth::Request; 1 }) {
+if (eval { require Net::OAuth::Request; require Crypt::OpenSSL::RSA; 1 }) {
     plan tests => 9;
 }
 else {

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/01-basic.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/01-basic.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/01-basic.t	Wed Oct 31 13:27:40 2007
@@ -7,7 +7,7 @@
 
 use Jifty::Test;
 
-if (eval { require Net::OAuth::Request; 1 }) {
+if (eval { require Net::OAuth::Request; require Crypt::OpenSSL::RSA; 1 }) {
     plan tests => 9;
 }
 else {
@@ -29,5 +29,5 @@
 $mech->content_like(qr{http://oauth\.net/}, "oauth page mentions OAuth homepage");
 
 $mech->get_ok($URL . '/oauth/authorize');
-$mech->content_like(qr{If you trust this application}, "oauth authorization page exists without fancy headers");
+$mech->content_unlike(qr{If you trust this application}, "/oauth/authorize requires being logged in");
 

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/02-request-token.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/02-request-token.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/02-request-token.t	Wed Oct 31 13:27:40 2007
@@ -7,7 +7,7 @@
 
 use TestApp::Plugin::OAuth::Test;
 
-if (eval { require Net::OAuth::Request; 1 }) {
+if (eval { require Net::OAuth::Request; require Crypt::OpenSSL::RSA; 1 }) {
     plan tests => 56;
 }
 else {

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/03-authorize.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/03-authorize.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OAuth/t/03-authorize.t	Wed Oct 31 13:27:40 2007
@@ -7,8 +7,8 @@
 
 use TestApp::Plugin::OAuth::Test;
 
-if (eval { require Net::OAuth::Request; 1 }) {
-    plan tests => 7;
+if (eval { require Net::OAuth::Request; require Crypt::OpenSSL::RSA; 1 }) {
+    plan tests => 40;
 }
 else {
     plan skip_all => "Net::OAuth isn't installed";
@@ -27,7 +27,7 @@
 my ($ok, $msg) = $consumer->create(
     consumer_key => 'foo',
     secret       => 'bar',
-    name         => 'FooBar industries',
+    name         => 'FooBar Industries',
     url          => 'http://foo.bar.example.com',
     rsa_key      => $pubkey,
 );
@@ -51,4 +51,192 @@
     oauth_signature_method => 'PLAINTEXT',
 );
 # }}}
+# try to navigate to protected pages while not logged in {{{
+$mech->get_ok('/oauth/authorize');
+$mech->content_unlike(qr/If you trust this application/);
+
+$mech->get_ok('/nuke/the/whales');
+$mech->content_unlike(qr/Press the shiny red button/);
+# }}}
+# log in {{{
+my $u = TestApp::Plugin::OAuth::Model::User->new(current_user => TestApp::Plugin::OAuth::CurrentUser->superuser);
+$u->create( name => 'You Zer', email => 'youzer at example.com', password => 'secret', email_confirmed => 1);
+ok($u->id, "New user has valid id set");
+
+$mech->get_ok('/login');
+$mech->fill_in_action_ok($mech->moniker_for('TestApp::Plugin::OAuth::Action::Login'), email => 'youzer at example.com', password => 'secret');
+$mech->submit;
+$mech->save_content('m2.html');
+$mech->content_contains('Logout');
+# }}}
+# try to navigate to protected pages while logged in {{{
+$mech->get_ok('/oauth/authorize');
+$mech->content_like(qr/If you trust this application/);
+
+$mech->get_ok('/nuke/the/whales');
+$mech->content_like(qr/Press the shiny red button/);
+# }}}
+# deny an unknown access token {{{
+my $error = _authorize_request_token('Deny', 'deadbeef');
+if ($error) {
+    ok(0, $error);
+}
+else {
+    $mech->content_contains("I don't know of that request token.");
+}
+# }}}
+# allow an unknown access token {{{
+$error = _authorize_request_token('Allow', 'hamburger');
+if ($error) {
+    ok(0, $error);
+}
+else {
+    $mech->content_contains("I don't know of that request token.");
+}
+# }}}
+# deny the above request token {{{
+deny_ok();
+# }}}
+# try to use the denied request token {{{
+$error = _authorize_request_token('Deny');
+if ($error) {
+    ok(0, $error);
+}
+else {
+    $mech->content_contains("I don't know of that request token.");
+}
+# }}}
+# get another request token as a known consumer (PLAINTEXT) {{{
+response_is(
+    code                   => 200,
+    testname               => "200 - plaintext signature",
+    consumer_secret        => 'bar',
+    oauth_consumer_key     => 'foo',
+    oauth_signature_method => 'PLAINTEXT',
+);
+# }}}
+# allow the above request token {{{
+allow_ok();
+# }}}
+# try to allow again {{{
+$error = _authorize_request_token('Allow');
+if ($error) {
+    ok(0, $error);
+}
+else {
+    $mech->content_contains("I don't know of that request token.");
+}
+# }}}
+# get another request token as a known consumer (PLAINTEXT) {{{
+response_is(
+    code                   => 200,
+    testname               => "200 - plaintext signature",
+    consumer_secret        => 'bar',
+    oauth_consumer_key     => 'foo',
+    oauth_signature_method => 'PLAINTEXT',
+);
+# }}}
+# expire the token, try to allow it {{{
+my $late = Jifty::DateTime->now(time_zone => 'GMT')->subtract(minutes => 10);
+$token_obj->set_valid_until($late);
+
+$error = _authorize_request_token('Allow');
+if ($error) {
+    ok(0, $error);
+}
+else {
+    $mech->content_contains("This request token has expired.");
+}
+# }}}
+# try again, it should be deleted {{{
+$error = _authorize_request_token('Allow');
+if ($error) {
+    ok(0, $error);
+}
+else {
+    $mech->content_contains("I don't know of that request token.");
+}
+# }}}
+
+# get another request token as a known consumer (PLAINTEXT) {{{
+response_is(
+    code                   => 200,
+    testname               => "200 - plaintext signature",
+    consumer_secret        => 'bar',
+    oauth_consumer_key     => 'foo',
+    oauth_signature_method => 'PLAINTEXT',
+);
+# }}}
+# deny it with a request parameter {{{
+$mech->get_ok('/oauth/authorize?oauth_token=' . $token_obj->token);
+$mech->content_like(qr/If you trust this application/);
+$mech->content_unlike(qr/should have provided it/, "token hint doesn't show up if we already have it");
+
+$mech->form_number(1);
+$mech->click_button(value => 'Deny');
+
+$mech->content_contains("Denying FooBar Industries the right to access your stuff");
+# }}}
+# get another request token as a known consumer (PLAINTEXT) {{{
+response_is(
+    code                   => 200,
+    testname               => "200 - plaintext signature",
+    consumer_secret        => 'bar',
+    oauth_consumer_key     => 'foo',
+    oauth_signature_method => 'PLAINTEXT',
+);
+# }}}
+# allow it with a request parameter {{{
+$mech->get_ok('/oauth/authorize?oauth_token=' . $token_obj->token);
+$mech->content_like(qr/If you trust this application/);
+$mech->content_unlike(qr/should have provided it/, "token hint doesn't show up if we already have it");
+
+$mech->form_number(1);
+$mech->click_button(value => 'Allow');
+
+$mech->content_contains("Allowing FooBar Industries to access your stuff");
+# }}}
+# get another request token as a known consumer (PLAINTEXT) {{{
+response_is(
+    code                   => 200,
+    testname               => "200 - plaintext signature",
+    consumer_secret        => 'bar',
+    oauth_consumer_key     => 'foo',
+    oauth_signature_method => 'PLAINTEXT',
+);
+# }}}
+# deny it with a callback {{{
+$mech->get_ok('/oauth/authorize?oauth_callback=http%3A%2f%2fgoogle.com');
+$mech->content_like(qr/If you trust this application/);
+
+$mech->fill_in_action_ok($mech->moniker_for('TestApp::Plugin::OAuth::Action::AuthorizeRequestToken'), token => $token_obj->token);
+$mech->click_button(value => 'Deny');
+
+$mech->content_contains("Denying FooBar Industries the right to access your stuff");
+$mech->content_contains("Click here");
+$mech->content_contains("http://google.com?oauth_token=" . $token_obj->token);
+$mech->content_contains("to return to FooBar Industries");
+# }}}
+# get another request token as a known consumer (PLAINTEXT) {{{
+response_is(
+    code                   => 200,
+    testname               => "200 - plaintext signature",
+    consumer_secret        => 'bar',
+    oauth_consumer_key     => 'foo',
+    oauth_signature_method => 'PLAINTEXT',
+);
+# }}}
+# deny it with a callback + request params {{{
+$mech->get_ok('/oauth/authorize?oauth_token='.$token_obj->token.'&oauth_callback=http%3A%2f%2fgoogle.com%3ffoo%3d=bar');
+$mech->content_like(qr/If you trust this application/);
+$mech->content_unlike(qr/should have provided it/, "token hint doesn't show up if we already have it");
+
+$mech->form_number(1);
+$mech->click_button(value => 'Deny');
+
+$mech->content_contains("Denying FooBar Industries the right to access your stuff");
+$mech->content_contains("Click here");
+$mech->content_contains("http://google.com?foo=bar&oauth_token=" . $token_obj->token);
+$mech->content_contains("to return to FooBar Industries");
+# }}}
 

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/Makefile.PL
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/Makefile.PL	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,7 @@
+use inc::Module::Install;
+
+name        'TestApp::Plugin::OnClick';
+version     '0.01';
+requires    'Jifty' => '0.70824';
+
+WriteAll;

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/bin/jifty
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/bin/jifty	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,11 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+use File::Basename qw(dirname); 
+use UNIVERSAL::require;
+
+use Jifty;
+use Jifty::Script;
+
+local $SIG{INT} = sub { warn "Stopped\n"; exit; };
+Jifty::Script->dispatch();

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/etc/config.yml
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/etc/config.yml	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,59 @@
+--- 
+framework: 
+  AdminMode: 1
+  ApplicationClass: TestApp::Plugin::OnClick
+  ApplicationName: TestApp-Plugin-OnClick
+  ApplicationUUID: 45E1B0FE-820A-11DC-9905-76B28F38D863
+  ConfigFileVersion: 2
+  Database: 
+    CheckSchema: 1
+    Database: testapp_plugin_onclick
+    Driver: SQLite
+    Host: localhost
+    Password: ''
+    RecordBaseClass: Jifty::DBI::Record::Cachable
+    User: ''
+    Version: 0.0.1
+  DevelMode: 1
+  L10N: 
+    PoDir: share/po
+  LogLevel: INFO
+  Mailer: Sendmail
+  MailerArgs: []
+
+  Plugins: 
+    - LetMe: {}
+
+    - SkeletonApp: {}
+
+    - REST: {}
+
+    - Halo: {}
+
+    - ErrorTemplates: {}
+
+    - OnlineDocs: {}
+
+    - CompressedCSSandJS: {}
+
+    - AdminUI: {}
+
+  PubSub: 
+    Backend: Memcached
+    Enable: ~
+  SkipAccessControl: 0
+  TemplateClass: TestApp::Plugin::OnClick::View
+  Web: 
+    BaseURL: http://localhost
+    DataDir: var/mason
+    Globals: []
+
+    MasonConfig: 
+      autoflush: 0
+      default_escape_flags: h
+      error_format: text
+      error_mode: fatal
+    Port: 8888
+    ServeStaticFiles: 1
+    StaticRoot: share/web/static
+    TemplateRoot: share/web/templates

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/content.html
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/content.html	Wed Oct 31 13:27:40 2007
@@ -0,0 +1 @@
+content

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/content1.html
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/content1.html	Wed Oct 31 13:27:40 2007
@@ -0,0 +1 @@
+yatta

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/onclick.html
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/share/web/templates/onclick.html	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,20 @@
+<&|/_elements/wrapper, title => _('Welcome to your new Jifty application') &>
+
+args:<% Jifty->web->request->arguments->{'J:V-region-content'} || ''%>
+
+<% Jifty->web->link(
+               label   => 'content',
+               id => 'replace_content',
+               onclick => {
+                   replace_with => '/content1.html',
+                   region => 'content',
+               },
+           ) %>
+
+<% Jifty->web->region( 
+    name     => 'content', 
+    path     => '/content.html',
+) %>
+
+
+</&>

Added: jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/t/onclick.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-OnClick/t/onclick.t	Wed Oct 31 13:27:40 2007
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+use lib 't/lib';
+use Jifty::SubTest;
+use Jifty::Test tests => 6;
+use Jifty::Test::WWW::Selenium;
+use utf8;
+
+my $server  = Jifty::Test->make_server;
+my $sel = Jifty::Test::WWW::Selenium->rc_ok( $server );
+my $URL = $server->started_ok;
+
+$sel->open_ok("/onclick.html");
+$sel->click_ok("//a[\@id='replace_content']");
+
+my $html = $sel->get_html_source;
+
+like( $html, qr/yatta/, 'replace content correctly' );
+unlike( $html, qr{args:/content1\.html}, 'replaced by javascript' );
+
+$sel->stop;
+


More information about the Jifty-commit mailing list