Skip to content
This repository
Browse code

* Fixed #1282 - Use S.? instead of S.?? all around Lift

  • Loading branch information...
commit a771f8b46bbe5c27d05811d4e882d55f704c1dd2 1 parent 7962c84
Diego Medina authored

Showing 22 changed files with 142 additions and 142 deletions. Show diff stats Hide diff stats

  1. 4  persistence/ldap/src/main/scala/net/liftweb/ldap/LDAPProtoUser.scala
  2. 2  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedEmail.scala
  3. 12  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedPassword.scala
  4. 18  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedPostalCode.scala
  5. 2  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedUniqueId.scala
  6. 2  persistence/mapper/src/main/scala/net/liftweb/mapper/ProtoUser.scala
  7. 4  persistence/mongodb-record/src/main/scala/net/liftweb/mongodb/record/field/MongoPasswordField.scala
  8. 4  persistence/mongodb-record/src/test/scala/net/liftweb/mongodb/record/MongoFieldSpec.scala
  9. 36  persistence/proto/src/main/scala/net/liftweb/proto/Crudify.scala
  10. 136  persistence/proto/src/main/scala/net/liftweb/proto/ProtoUser.scala
  11. 2  persistence/record/src/main/scala/net/liftweb/record/ProtoUser.scala
  12. 2  persistence/record/src/main/scala/net/liftweb/record/field/CountryField.scala
  13. 2  persistence/record/src/main/scala/net/liftweb/record/field/EmailField.scala
  14. 2  persistence/record/src/main/scala/net/liftweb/record/field/NumericField.scala
  15. 6  persistence/record/src/main/scala/net/liftweb/record/field/PasswordField.scala
  16. 12  persistence/record/src/main/scala/net/liftweb/record/field/PostalCodeField.scala
  17. 4  persistence/record/src/test/scala/net/liftweb/record/FieldSpec.scala
  18. 2  web/webkit/src/main/scala/net/liftweb/http/LiftRules.scala
  19. 4  web/webkit/src/main/scala/net/liftweb/http/LiftScreen.scala
  20. 6  web/webkit/src/main/scala/net/liftweb/http/SHtml.scala
  21. 8  web/wizard/src/main/scala/net/liftweb/wizard/Wizard.scala
  22. 14  web/wizard/src/test/scala/net/liftweb/wizard/WizardSpec.scala
4  persistence/ldap/src/main/scala/net/liftweb/ldap/LDAPProtoUser.scala
@@ -88,7 +88,7 @@ trait MetaLDAPProtoUser[ModelType <: LDAPProtoUser[ModelType]] extends MetaMegaP
88 88
         <form method="post" action={S.uri}>
89 89
             <table>
90 90
                 <tr>
91  
-                    <td colspan="2">{S.??("log.in")}</td>
  91
+                    <td colspan="2">{S.?("log.in")}</td>
92 92
                 </tr>
93 93
                 <tr>
94 94
                     <td>Username</td><td><user:name /></td>
@@ -115,7 +115,7 @@ trait MetaLDAPProtoUser[ModelType <: LDAPProtoUser[ModelType]] extends MetaMegaP
115 115
         Helpers.bind("user", loginXhtml,
116 116
                     "name" -> (JsCmds.FocusOnLoad(<input type="text" name="username"/>)),
117 117
                     "password" -> (<input type="password" name="password"/>),
118  
-                    "submit" -> (<input type="submit" value={S.??("log.in")}/>))
  118
+                    "submit" -> (<input type="submit" value={S.?("log.in")}/>))
119 119
     }
120 120
 
121 121
     def ldapLogin(username: String, password: String): Boolean = {
2  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedEmail.scala
@@ -34,7 +34,7 @@ abstract class MappedEmail[T<:Mapper[T]](owner: T, maxLen: Int) extends MappedSt
34 34
   override def setFilter = notNull _ :: toLower _ :: trim _ :: super.setFilter
35 35
 
36 36
   override def validate =
37  
-    (if (MappedEmail.emailPattern.matcher(i_is_!).matches) Nil else List(FieldError(this, Text(S.??("invalid.email.address"))))) :::
  37
+    (if (MappedEmail.emailPattern.matcher(i_is_!).matches) Nil else List(FieldError(this, Text(S.?("invalid.email.address"))))) :::
38 38
     super.validate
39 39
 
40 40
 }
12  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedPassword.scala
@@ -57,10 +57,10 @@ extends MappedField[String, T] {
57 57
 
58 58
   protected def real_i_set_!(value : String) : String = {
59 59
     password() = value match {
60  
-      case "*" | null | MappedPassword.blankPw if (value.length < 3) => {invalidPw = true ; invalidMsg = S.??("password.must.be.set") ; "*"}
  60
+      case "*" | null | MappedPassword.blankPw if (value.length < 3) => {invalidPw = true ; invalidMsg = S.?("password.must.be.set") ; "*"}
61 61
       case MappedPassword.blankPw => {return "*"}
62 62
       case _ if (value.length > 4) => {invalidPw = false; hash("{"+value+"} salt={"+salt_i.get+"}")}
63  
-      case _ => {invalidPw = true ; invalidMsg = S.??("password.too.short"); "*"}
  63
+      case _ => {invalidPw = true ; invalidMsg = S.?("password.too.short"); "*"}
64 64
     }
65 65
     this.dirty_?( true)
66 66
     "*"
@@ -69,7 +69,7 @@ extends MappedField[String, T] {
69 69
   def setList(in: List[String]): Boolean =
70 70
   in match {
71 71
     case x1 :: x2 :: Nil if x1 == x2 => this.set(x1) ; true
72  
-    case _ => invalidPw = true; invalidMsg = S.??("passwords.do.not.match"); false
  72
+    case _ => invalidPw = true; invalidMsg = S.?("passwords.do.not.match"); false
73 73
   }
74 74
 
75 75
 
@@ -77,7 +77,7 @@ extends MappedField[String, T] {
77 77
     f match {
78 78
       case a : Array[String] if (a.length == 2 && a(0) == a(1)) => {this.set(a(0))}
79 79
       case l : List[String] if (l.length == 2 && l.head == l(1)) => {this.set(l.head)}
80  
-      case _ => {invalidPw = true; invalidMsg = S.??("passwords.do.not.match")}
  80
+      case _ => {invalidPw = true; invalidMsg = S.?("passwords.do.not.match")}
81 81
     }
82 82
     is
83 83
   }
@@ -93,7 +93,7 @@ extends MappedField[String, T] {
93 93
   override def validate : List[FieldError] = {
94 94
     if (!invalidPw && password.get != "*") Nil
95 95
     else if (invalidPw) List(FieldError(this, Text(invalidMsg)))
96  
-    else List(FieldError(this, Text(S.??("password.must.be.set"))))
  96
+    else List(FieldError(this, Text(S.?("password.must.be.set"))))
97 97
   }
98 98
 
99 99
   def real_convertToJDBCFriendly(value: String): Object = hash("{"+value+"} salt={"+salt_i.get+"}")
@@ -124,7 +124,7 @@ extends MappedField[String, T] {
124 124
   override def _toForm: Box[NodeSeq] = {
125 125
     S.fmapFunc({s: List[String] => this.setFromAny(s)}){funcName =>
126 126
       Full(<span>{appendFieldId(<input type={formInputType} name={funcName}
127  
-            value={is.toString}/>)}&nbsp;{S.??("repeat")}&nbsp;<input
  127
+            value={is.toString}/>)}&nbsp;{S.?("repeat")}&nbsp;<input
128 128
             type={formInputType} name={funcName}
129 129
             value={is.toString}/></span>)
130 130
     }
18  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedPostalCode.scala
@@ -69,7 +69,7 @@ object Countries extends Enumeration(1) {
69 69
 
70 70
   class I18NCountry extends Val {
71 71
     override def toString() =
72  
-    S.??("country_" + id)
  72
+    S.?("country_" + id)
73 73
   }
74 74
 }
75 75
 
@@ -125,8 +125,8 @@ abstract class MappedPostalCode[T <: Mapper[T]](owner: T, country: MappedCountry
125 125
 
126 126
   private def genericCheck(zip: String): List[FieldError] = {
127 127
     zip match {
128  
-      case null => List(FieldError(this, Text(S.??("invalid.postal.code"))))
129  
-      case s if s.length < 3 => List(FieldError(this, Text(S.??("invalid.postal.code"))))
  128
+      case null => List(FieldError(this, Text(S.?("invalid.postal.code"))))
  129
+      case s if s.length < 3 => List(FieldError(this, Text(S.?("invalid.postal.code"))))
130 130
       case _ => Nil
131 131
     }
132 132
   }
@@ -135,22 +135,22 @@ abstract class MappedPostalCode[T <: Mapper[T]](owner: T, country: MappedCountry
135 135
 
136 136
   override def validations = country.is match {
137 137
     case Countries.USA =>  valRegex(REPat.compile("[0-9]{5}(\\-[0-9]{4})?"),
138  
-                                    S.??("invalid.zip.code")) _ :: super.validations
  138
+                                    S.?("invalid.zip.code")) _ :: super.validations
139 139
 
140 140
     case Countries.Sweden => valRegex(REPat.compile("[0-9]{3}[ ]?[0-9]{2}"),
141  
-                                      S.??("invalid.postal.code")) _ :: super.validations
  141
+                                      S.?("invalid.postal.code")) _ :: super.validations
142 142
 
143 143
     case Countries.Australia => valRegex(REPat.compile("(0?|[1-9])[0-9]{3}"),
144  
-                                         S.??("invalid.postal.code")) _ :: super.validations
  144
+                                         S.?("invalid.postal.code")) _ :: super.validations
145 145
 
146 146
     case Countries.Canada => valRegex(REPat.compile("[A-Z][0-9][A-Z][ ][0-9][A-Z][0-9]"),
147  
-                                      S.??("invalid.postal.code")) _ :: super.validations
  147
+                                      S.?("invalid.postal.code")) _ :: super.validations
148 148
 
149 149
     case Countries.Germany => valRegex(REPat.compile("[0-9]{5}"),
150  
-                                       S.??("invalid.postal.code")) _ :: super.validations
  150
+                                       S.?("invalid.postal.code")) _ :: super.validations
151 151
 
152 152
     case Countries.UK =>  valRegex(REPat.compile("[A-Z]{1,2}[0-9R][0-9A-Z]?[0-9][ABD-HJLNP-UW-Z]{2}"),
153  
-                                     S.??("invalid.postal.code")) _ :: super.validations
  153
+                                     S.?("invalid.postal.code")) _ :: super.validations
154 154
 
155 155
     case _ => genericCheck _ :: super.validations
156 156
   }
2  persistence/mapper/src/main/scala/net/liftweb/mapper/MappedUniqueId.scala
@@ -59,7 +59,7 @@ object Genders extends Enumeration {
59 59
 
60 60
   class I18NGender(id : Int, name: String) extends Val(id, name) {
61 61
     override def toString = {
62  
-      S.??(name)
  62
+      S.?(name)
63 63
     }
64 64
   }
65 65
 }
2  persistence/mapper/src/main/scala/net/liftweb/mapper/ProtoUser.scala
@@ -114,7 +114,7 @@ trait ProtoUser[T <: ProtoUser[T]] extends KeyedMapper[Long, T] with UserIdAsStr
114 114
 
115 115
   protected class MyEmail(obj: T, size: Int) extends MappedEmail(obj, size) {
116 116
     override def dbIndexed_? = true
117  
-    override def validations = valUnique(S.??("unique.email.address")) _ :: super.validations
  117
+    override def validations = valUnique(S.?("unique.email.address")) _ :: super.validations
118 118
     override def displayName = fieldOwner.emailDisplayName
119 119
     override val fieldId = Some(Text("txtEmail"))
120 120
   }
4  persistence/mongodb-record/src/main/scala/net/liftweb/mongodb/record/field/MongoPasswordField.scala
@@ -80,9 +80,9 @@ class MongoPasswordField[OwnerType <: BsonRecord[OwnerType]](rec: OwnerType, min
80 80
 
81 81
   private def validatePassword(pwd: Password): List[FieldError] = pwd match {
82 82
     case null | Password("", _) | Password("*", _) | Password(MongoPasswordField.blankPw, _) =>
83  
-      Text(S.??("password.must.be.set"))
  83
+      Text(S.?("password.must.be.set"))
84 84
     case Password(pwd, _) if pwd.length < minLen =>
85  
-      Text(S.??("password.too.short"))
  85
+      Text(S.?("password.too.short"))
86 86
     case _ => Nil
87 87
   }
88 88
 
4  persistence/mongodb-record/src/test/scala/net/liftweb/mongodb/record/MongoFieldSpec.scala
@@ -259,7 +259,7 @@ object MongoFieldSpec extends Specification("MongoField Specification") with Mon
259 259
       val rec = PasswordTestRecord.createRecord
260 260
       rec.password.setPassword("")
261 261
       rec.validate must_== (
262  
-        FieldError(rec.password, Text(S.??("password.must.be.set"))) ::
  262
+        FieldError(rec.password, Text(S.?("password.must.be.set"))) ::
263 263
         Nil
264 264
       )
265 265
     }
@@ -268,7 +268,7 @@ object MongoFieldSpec extends Specification("MongoField Specification") with Mon
268 268
       val rec = PasswordTestRecord.createRecord
269 269
       rec.password.setPassword("ab")
270 270
       rec.validate must_== (
271  
-        FieldError(rec.password, Text(S.??("password.too.short"))) ::
  271
+        FieldError(rec.password, Text(S.?("password.too.short"))) ::
272 272
         Nil
273 273
       )
274 274
     }
36  persistence/proto/src/main/scala/net/liftweb/proto/Crudify.scala
@@ -229,7 +229,7 @@ trait Crudify {
229 229
          */
230 230
         val text = new Loc.LinkText(calcLinkText _)
231 231
 
232  
-        def calcLinkText(in: TheCrudType): NodeSeq = Text(S.??("crudify.menu.view.displayName", displayName))
  232
+        def calcLinkText(in: TheCrudType): NodeSeq = Text(S.?("crudify.menu.view.displayName", displayName))
233 233
 
234 234
         /**
235 235
          * Rewrite the request and emit the type-safe parameter
@@ -264,7 +264,7 @@ trait Crudify {
264 264
           def name = "Edit "+Prefix
265 265
 
266 266
           override val snippets: SnippetTest = {
267  
-            case ("crud.edit", Full(wp: TheCrudType)) => crudDoForm(wp, S.??("Save"))
  267
+            case ("crud.edit", Full(wp: TheCrudType)) => crudDoForm(wp, S.?("Save"))
268 268
           }
269 269
 
270 270
           def defaultValue = Empty
@@ -276,7 +276,7 @@ trait Crudify {
276 276
            */
277 277
           val text = new Loc.LinkText(calcLinkText _)
278 278
 
279  
-          def calcLinkText(in: TheCrudType): NodeSeq = Text(S.??("crudify.menu.edit.displayName", displayName))
  279
+          def calcLinkText(in: TheCrudType): NodeSeq = Text(S.?("crudify.menu.edit.displayName", displayName))
280 280
 
281 281
           /**
282 282
            * Rewrite the request and emit the type-safe parameter
@@ -307,7 +307,7 @@ trait Crudify {
307 307
   /**
308 308
    * The String displayed for menu editing
309 309
    */
310  
-  def editMenuName = S.??("Edit")+" "+displayName
  310
+  def editMenuName = S.?("Edit")+" "+displayName
311 311
 
312 312
   /**
313 313
    * This is the template that's used to render the page after the
@@ -345,7 +345,7 @@ trait Crudify {
345 345
   </lift:crud.edit>
346 346
   }
347 347
 
348  
-  def editButton = S.??("Save")
  348
+  def editButton = S.?("Save")
349 349
 
350 350
   /**
351 351
    * Override this method to change how fields are displayed for delete
@@ -406,7 +406,7 @@ trait Crudify {
406 406
            */
407 407
           val text = new Loc.LinkText(calcLinkText _)
408 408
 
409  
-          def calcLinkText(in: TheCrudType): NodeSeq = Text(S.??("crudify.menu.delete.displayName", displayName))
  409
+          def calcLinkText(in: TheCrudType): NodeSeq = Text(S.?("crudify.menu.delete.displayName", displayName))
410 410
 
411 411
           /**
412 412
            * Rewrite the request and emit the type-safe parameter
@@ -440,7 +440,7 @@ trait Crudify {
440 440
   def deleteMenuLocParams: List[Loc.LocParam[TheCrudType]] = Nil
441 441
 
442 442
 
443  
-  def deleteMenuName = S.??("Delete")+" "+displayName
  443
+  def deleteMenuName = S.?("Delete")+" "+displayName
444 444
 
445 445
   /**
446 446
    * This is the template that's used to render the page after the
@@ -476,10 +476,10 @@ trait Crudify {
476 476
     </table>
477 477
   </lift:crud.delete>
478 478
 
479  
-  def deleteButton = S.??("Delete")
  479
+  def deleteButton = S.?("Delete")
480 480
 
481 481
 
482  
-  def createMenuName = S.??("Create")+" "+displayName
  482
+  def createMenuName = S.?("Create")+" "+displayName
483 483
 
484 484
   /**
485 485
    * This is the template that's used to render the page after the
@@ -515,9 +515,9 @@ trait Crudify {
515 515
     </table>
516 516
   </lift:crud.create>
517 517
 
518  
-  def createButton = S.??("Create")
  518
+  def createButton = S.?("Create")
519 519
 
520  
-  def viewMenuName = S.??("View")+" "+displayName
  520
+  def viewMenuName = S.?("View")+" "+displayName
521 521
 
522 522
   /**
523 523
    * This is the template that's used to render the page after the
@@ -544,7 +544,7 @@ trait Crudify {
544 544
     </table>
545 545
   </lift:crud.view>
546 546
 
547  
-  def showAllMenuName = S.??("List")+" "+displayName
  547
+  def showAllMenuName = S.?("List")+" "+displayName
548 548
 
549 549
   /**
550 550
    * This is the template that's used to render the page after the
@@ -574,9 +574,9 @@ trait Crudify {
574 574
         <crud:row>
575 575
           <tr>
576 576
             <crud:row_item><td><crud:value/></td></crud:row_item>
577  
-            <td><a crud:view_href="">{S.??("View")}</a></td>
578  
-            <td><a crud:edit_href="">{S.??("Edit")}</a></td>
579  
-            <td><a crud:delete_href="">{S.??("Delete")}</a></td>
  577
+            <td><a crud:view_href="">{S.?("View")}</a></td>
  578
+            <td><a crud:edit_href="">{S.?("Edit")}</a></td>
  579
+            <td><a crud:delete_href="">{S.?("Delete")}</a></td>
580 580
           </tr>
581 581
         </crud:row>
582 582
       </tbody>
@@ -589,8 +589,8 @@ trait Crudify {
589 589
     </table>
590 590
   </lift:crud.all>
591 591
 
592  
-  def nextWord = S.??("Next")
593  
-  def previousWord = S.??("Previous")
  592
+  def nextWord = S.?("Next")
  593
+  def previousWord = S.?("Previous")
594 594
 
595 595
   lazy val listPath = Prefix ::: List(ListItems)
596 596
 
@@ -721,7 +721,7 @@ trait Crudify {
721 721
   lazy val locSnippets = new DispatchLocSnippets {
722 722
     val dispatch: PartialFunction[String, NodeSeq => NodeSeq] = {
723 723
       case "crud.all" => doCrudAll
724  
-      case "crud.create" => crudDoForm(create, S.??("Created"))
  724
+      case "crud.create" => crudDoForm(create, S.?("Created"))
725 725
     }
726 726
 
727 727
   }
136  persistence/proto/src/main/scala/net/liftweb/proto/ProtoUser.scala
@@ -326,12 +326,12 @@ trait ProtoUser {
326 326
   /**
327 327
    * A Menu.LocParam to test if the user is logged in
328 328
    */
329  
-  lazy val testLogginIn = If(loggedIn_? _, S.??("must.be.logged.in")) ;
  329
+  lazy val testLogginIn = If(loggedIn_? _, S.?("must.be.logged.in")) ;
330 330
 
331 331
   /**
332 332
    * A Menu.LocParam to test if the user is a super user
333 333
    */
334  
-  lazy val testSuperUser = If(superUser_? _, S.??("must.be.super.user"))
  334
+  lazy val testSuperUser = If(superUser_? _, S.?("must.be.super.user"))
335 335
 
336 336
   /**
337 337
    * A Menu.LocParam for testing if the user is logged in and if they're not,
@@ -358,7 +358,7 @@ trait ProtoUser {
358 358
    * The menu item for login (make this "Empty" to disable)
359 359
    */
360 360
   def loginMenuLoc: Box[Menu] =
361  
-    Full(Menu(Loc("Login" + menuNameSuffix, loginPath, S.??("login"), loginMenuLocParams ::: globalUserLocParams)))
  361
+    Full(Menu(Loc("Login" + menuNameSuffix, loginPath, S.?("login"), loginMenuLocParams ::: globalUserLocParams)))
362 362
 
363 363
 
364 364
   /**
@@ -372,7 +372,7 @@ trait ProtoUser {
372 372
    * Overwrite in order to add custom LocParams. Attention: Not calling super will change the default behavior!
373 373
    */
374 374
   protected def loginMenuLocParams: List[LocParam[Unit]] =
375  
-    If(notLoggedIn_? _, S.??("already.logged.in")) ::
  375
+    If(notLoggedIn_? _, S.?("already.logged.in")) ::
376 376
     Template(() => wrapIt(login)) ::
377 377
     Nil
378 378
 
@@ -386,7 +386,7 @@ trait ProtoUser {
386 386
    * The menu item for logout (make this "Empty" to disable)
387 387
    */
388 388
   def logoutMenuLoc: Box[Menu] =
389  
-    Full(Menu(Loc("Logout" + menuNameSuffix, logoutPath, S.??("logout"), logoutMenuLocParams ::: globalUserLocParams)))
  389
+    Full(Menu(Loc("Logout" + menuNameSuffix, logoutPath, S.?("logout"), logoutMenuLocParams ::: globalUserLocParams)))
390 390
 
391 391
   /**
392 392
    * The LocParams for the menu item for logout.
@@ -401,7 +401,7 @@ trait ProtoUser {
401 401
    * The menu item for creating the user/sign up (make this "Empty" to disable)
402 402
    */
403 403
   def createUserMenuLoc: Box[Menu] =
404  
-    Full(Menu(Loc("CreateUser" + menuNameSuffix, signUpPath, S.??("sign.up"), createUserMenuLocParams ::: globalUserLocParams)))
  404
+    Full(Menu(Loc("CreateUser" + menuNameSuffix, signUpPath, S.?("sign.up"), createUserMenuLocParams ::: globalUserLocParams)))
405 405
 
406 406
   /**
407 407
    * The LocParams for the menu item for creating the user/sign up.
@@ -409,14 +409,14 @@ trait ProtoUser {
409 409
    */
410 410
   protected def createUserMenuLocParams: List[LocParam[Unit]] =
411 411
     Template(() => wrapIt(signupFunc.map(_()) openOr signup)) ::
412  
-    If(notLoggedIn_? _, S.??("logout.first")) ::
  412
+    If(notLoggedIn_? _, S.?("logout.first")) ::
413 413
     Nil
414 414
 
415 415
   /**
416 416
    * The menu item for lost password (make this "Empty" to disable)
417 417
    */
418 418
   def lostPasswordMenuLoc: Box[Menu] =
419  
-    Full(Menu(Loc("LostPassword" + menuNameSuffix, lostPasswordPath, S.??("lost.password"), lostPasswordMenuLocParams ::: globalUserLocParams))) // not logged in
  419
+    Full(Menu(Loc("LostPassword" + menuNameSuffix, lostPasswordPath, S.?("lost.password"), lostPasswordMenuLocParams ::: globalUserLocParams))) // not logged in
420 420
 
421 421
   /**
422 422
    * The LocParams for the menu item for lost password.
@@ -424,14 +424,14 @@ trait ProtoUser {
424 424
    */
425 425
   protected def lostPasswordMenuLocParams: List[LocParam[Unit]] =
426 426
     Template(() => wrapIt(lostPassword)) ::
427  
-    If(notLoggedIn_? _, S.??("logout.first")) ::
  427
+    If(notLoggedIn_? _, S.?("logout.first")) ::
428 428
     Nil
429 429
 
430 430
   /**
431 431
    * The menu item for resetting the password (make this "Empty" to disable)
432 432
    */
433 433
   def resetPasswordMenuLoc: Box[Menu] =
434  
-    Full(Menu(Loc("ResetPassword" + menuNameSuffix, (passwordResetPath, true), S.??("reset.password"), resetPasswordMenuLocParams ::: globalUserLocParams))) //not Logged in
  434
+    Full(Menu(Loc("ResetPassword" + menuNameSuffix, (passwordResetPath, true), S.?("reset.password"), resetPasswordMenuLocParams ::: globalUserLocParams))) //not Logged in
435 435
 
436 436
   /**
437 437
    * The LocParams for the menu item for resetting the password.
@@ -440,14 +440,14 @@ trait ProtoUser {
440 440
   protected def resetPasswordMenuLocParams: List[LocParam[Unit]] =
441 441
     Hidden ::
442 442
     Template(() => wrapIt(passwordReset(snarfLastItem))) ::
443  
-    If(notLoggedIn_? _, S.??("logout.first")) ::
  443
+    If(notLoggedIn_? _, S.?("logout.first")) ::
444 444
     Nil
445 445
 
446 446
   /**
447 447
    * The menu item for editing the user (make this "Empty" to disable)
448 448
    */
449 449
   def editUserMenuLoc: Box[Menu] =
450  
-    Full(Menu(Loc("EditUser" + menuNameSuffix, editPath, S.??("edit.user"), editUserMenuLocParams ::: globalUserLocParams)))
  450
+    Full(Menu(Loc("EditUser" + menuNameSuffix, editPath, S.?("edit.user"), editUserMenuLocParams ::: globalUserLocParams)))
451 451
 
452 452
   /**
453 453
    * The LocParams for the menu item for editing the user.
@@ -462,7 +462,7 @@ trait ProtoUser {
462 462
    * The menu item for changing password (make this "Empty" to disable)
463 463
    */
464 464
   def changePasswordMenuLoc: Box[Menu] =
465  
-    Full(Menu(Loc("ChangePassword" + menuNameSuffix, changePasswordPath, S.??("change.password"), changePasswordMenuLocParams ::: globalUserLocParams)))
  465
+    Full(Menu(Loc("ChangePassword" + menuNameSuffix, changePasswordPath, S.?("change.password"), changePasswordMenuLocParams ::: globalUserLocParams)))
466 466
 
467 467
   /**
468 468
    * The LocParams for the menu item for changing password.
@@ -477,7 +477,7 @@ trait ProtoUser {
477 477
    * The menu item for validating a user (make this "Empty" to disable)
478 478
    */
479 479
   def validateUserMenuLoc: Box[Menu] =
480  
-    Full(Menu(Loc("ValidateUser" + menuNameSuffix, (validateUserPath, true), S.??("validate.user"), validateUserMenuLocParams ::: globalUserLocParams)))
  480
+    Full(Menu(Loc("ValidateUser" + menuNameSuffix, (validateUserPath, true), S.?("validate.user"), validateUserMenuLocParams ::: globalUserLocParams)))
481 481
 
482 482
   /**
483 483
    * The LocParams for the menu item for validating a user.
@@ -486,7 +486,7 @@ trait ProtoUser {
486 486
   protected def validateUserMenuLocParams: List[LocParam[Unit]] =
487 487
     Hidden ::
488 488
     Template(() => wrapIt(validateUser(snarfLastItem))) ::
489  
-    If(notLoggedIn_? _, S.??("logout.first")) ::
  489
+    If(notLoggedIn_? _, S.?("logout.first")) ::
490 490
     Nil
491 491
 
492 492
   /**
@@ -546,13 +546,13 @@ trait ProtoUser {
546 546
   (for (r <- S.request) yield r.path.wholePath.last) openOr ""
547 547
 
548 548
   lazy val ItemList: List[MenuItem] =
549  
-  List(MenuItem(S.??("sign.up"), signUpPath, false),
550  
-       MenuItem(S.??("log.in"), loginPath, false),
551  
-       MenuItem(S.??("lost.password"), lostPasswordPath, false),
  549
+  List(MenuItem(S.?("sign.up"), signUpPath, false),
  550
+       MenuItem(S.?("log.in"), loginPath, false),
  551
+       MenuItem(S.?("lost.password"), lostPasswordPath, false),
552 552
        MenuItem("", passwordResetPath, false),
553  
-       MenuItem(S.??("change.password"), changePasswordPath, true),
554  
-       MenuItem(S.??("log.out"), logoutPath, true),
555  
-       MenuItem(S.??("edit.profile"), editPath, true),
  553
+       MenuItem(S.?("change.password"), changePasswordPath, true),
  554
+       MenuItem(S.?("log.out"), logoutPath, true),
  555
+       MenuItem(S.?("edit.profile"), editPath, true),
556 556
        MenuItem("", validateUserPath, false))
557 557
 
558 558
   var onLogIn: List[TheUserType => Unit] = Nil
@@ -638,7 +638,7 @@ trait ProtoUser {
638 638
 
639 639
   def signupXhtml(user: TheUserType) = {
640 640
     (<form method="post" action={S.uri}><table><tr><td
641  
-              colspan="2">{ S.??("sign.up") }</td></tr>
  641
+              colspan="2">{ S.?("sign.up") }</td></tr>
642 642
           {localForm(user, false, signupFields)}
643 643
           <tr><td>&nbsp;</td><td><user:submit/></td></tr>
644 644
                                         </table></form>)
@@ -648,23 +648,23 @@ trait ProtoUser {
648 648
   def signupMailBody(user: TheUserType, validationLink: String): Elem = {
649 649
     (<html>
650 650
         <head>
651  
-          <title>{S.??("sign.up.confirmation")}</title>
  651
+          <title>{S.?("sign.up.confirmation")}</title>
652 652
         </head>
653 653
         <body>
654  
-          <p>{S.??("dear")} {user.getFirstName},
  654
+          <p>{S.?("dear")} {user.getFirstName},
655 655
             <br/>
656 656
             <br/>
657  
-            {S.??("sign.up.validation.link")}
  657
+            {S.?("sign.up.validation.link")}
658 658
             <br/><a href={validationLink}>{validationLink}</a>
659 659
             <br/>
660 660
             <br/>
661  
-            {S.??("thank.you")}
  661
+            {S.?("thank.you")}
662 662
           </p>
663 663
         </body>
664 664
      </html>)
665 665
   }
666 666
 
667  
-  def signupMailSubject = S.??("sign.up.confirmation")
  667
+  def signupMailSubject = S.?("sign.up.confirmation")
668 668
 
669 669
   /**
670 670
    * Send validation email to the user.  The XHTML version of the mail
@@ -708,11 +708,11 @@ trait ProtoUser {
708 708
     theUser.save
709 709
     if (!skipEmailValidation) {
710 710
       sendValidationEmail(theUser)
711  
-      S.notice(S.??("sign.up.message"))
  711
+      S.notice(S.?("sign.up.message"))
712 712
       func()
713 713
     } else {
714 714
       logUserIn(theUser, () => {      
715  
-        S.notice(S.??("welcome"))
  715
+        S.notice(S.?("welcome"))
716 716
         func()
717 717
       })
718 718
     }
@@ -754,7 +754,7 @@ trait ProtoUser {
754 754
 
755 755
     def innerSignup = bind("user",
756 756
                            signupXhtml(theUser),
757  
-                           "submit" -> signupSubmitButton(S.??("sign.up"), testSignup _))
  757
+                           "submit" -> signupSubmitButton(S.?("sign.up"), testSignup _))
758 758
 
759 759
     innerSignup
760 760
   }
@@ -778,32 +778,32 @@ trait ProtoUser {
778 778
     case Full(user) if !user.validated_? =>
779 779
       user.setValidated(true).resetUniqueId().save
780 780
       logUserIn(user, () => {
781  
-        S.notice(S.??("account.validated"))
  781
+        S.notice(S.?("account.validated"))
782 782
         S.redirectTo(homePage)
783 783
       })
784 784
 
785  
-    case _ => S.error(S.??("invalid.validation.link")); S.redirectTo(homePage)
  785
+    case _ => S.error(S.?("invalid.validation.link")); S.redirectTo(homePage)
786 786
   }
787 787
 
788 788
   /**
789 789
    * How do we prompt the user for the username.  By default,
790  
-   * it's S.??("email.address"), you can can change it to something else
  790
+   * it's S.?("email.address"), you can can change it to something else
791 791
    */
792  
-  def userNameFieldString: String = S.??("email.address")
  792
+  def userNameFieldString: String = S.?("email.address")
793 793
 
794 794
   /**
795 795
    * The string that's generated when the user name is not found.  By
796  
-   * default: S.??("email.address.not.found")
  796
+   * default: S.?("email.address.not.found")
797 797
    */
798  
-  def userNameNotFoundString: String = S.??("email.address.not.found")
  798
+  def userNameNotFoundString: String = S.?("email.address.not.found")
799 799
 
800 800
   def loginXhtml = {
801 801
     (<form method="post" action={S.uri}><table><tr><td
802  
-              colspan="2">{S.??("log.in")}</td></tr>
  802
+              colspan="2">{S.?("log.in")}</td></tr>
803 803
           <tr><td>{userNameFieldString}</td><td><user:email /></td></tr>
804  
-          <tr><td>{S.??("password")}</td><td><user:password /></td></tr>
  804
+          <tr><td>{S.?("password")}</td><td><user:password /></td></tr>
805 805
           <tr><td><a href={lostPasswordPath.mkString("/", "/", "")}
806  
-                >{S.??("recover.password")}</a></td><td><user:submit /></td></tr></table>
  806
+                >{S.?("recover.password")}</a></td><td><user:submit /></td></tr></table>
807 807
      </form>)
808 808
   }
809 809
   
@@ -849,7 +849,7 @@ trait ProtoUser {
849 849
             }
850 850
 
851 851
             logUserIn(user, () => {
852  
-              S.notice(S.??("logged.in"))
  852
+              S.notice(S.?("logged.in"))
853 853
 
854 854
               preLoginState()
855 855
 
@@ -858,16 +858,16 @@ trait ProtoUser {
858 858
           }
859 859
 
860 860
         case Full(user) if !user.validated_? =>
861  
-          S.error(S.??("account.validation.error"))
  861
+          S.error(S.?("account.validation.error"))
862 862
 
863  
-        case _ => S.error(S.??("invalid.credentials"))
  863
+        case _ => S.error(S.?("invalid.credentials"))
864 864
       }
865 865
     }
866 866
 
867 867
     bind("user", loginXhtml,
868 868
          "email" -> (FocusOnLoad(<input type="text" name="username"/>)),
869 869
          "password" -> (<input type="password" name="password"/>),
870  
-         "submit" -> loginSubmitButton(S.??("log.in")))
  870
+         "submit" -> loginSubmitButton(S.?("log.in")))
871 871
   }
872 872
 
873 873
   def loginSubmitButton(name: String, func: () => Any = () => {}): NodeSeq = {
@@ -881,7 +881,7 @@ trait ProtoUser {
881 881
   def lostPasswordXhtml = {
882 882
     (<form method="post" action={S.uri}>
883 883
         <table><tr><td
884  
-              colspan="2">{S.??("enter.email")}</td></tr>
  884
+              colspan="2">{S.?("enter.email")}</td></tr>
885 885
           <tr><td>{userNameFieldString}</td><td><user:email /></td></tr>
886 886
           <tr><td>&nbsp;</td><td><user:submit /></td></tr>
887 887
         </table>
@@ -891,17 +891,17 @@ trait ProtoUser {
891 891
   def passwordResetMailBody(user: TheUserType, resetLink: String): Elem = {
892 892
     (<html>
893 893
         <head>
894  
-          <title>{S.??("reset.password.confirmation")}</title>
  894
+          <title>{S.?("reset.password.confirmation")}</title>
895 895
         </head>
896 896
         <body>
897  
-          <p>{S.??("dear")} {user.getFirstName},
  897
+          <p>{S.?("dear")} {user.getFirstName},
898 898
             <br/>
899 899
             <br/>
900  
-            {S.??("click.reset.link")}
  900
+            {S.?("click.reset.link")}
901 901
             <br/><a href={resetLink}>{resetLink}</a>
902 902
             <br/>
903 903
             <br/>
904  
-            {S.??("thank.you")}
  904
+            {S.?("thank.you")}
905 905
           </p>
906 906
         </body>
907 907
      </html>)
@@ -919,7 +919,7 @@ trait ProtoUser {
919 919
     List(xmlToMailBodyType(passwordResetMailBody(user, resetLink)))
920 920
 
921 921
 
922  
-  def passwordResetEmailSubject = S.??("reset.password.request")
  922
+  def passwordResetEmailSubject = S.?("reset.password.request")
923 923
 
924 924
   /**
925 925
    * Send password reset email to the user.  The XHTML version of the mail
@@ -941,12 +941,12 @@ trait ProtoUser {
941 941
                          generateResetEmailBodies(user, resetLink) :::
942 942
                          (bccEmail.toList.map(BCC(_)))) :_*)
943 943
 
944  
-        S.notice(S.??("password.reset.email.sent"))
  944
+        S.notice(S.?("password.reset.email.sent"))
945 945
         S.redirectTo(homePage)
946 946
 
947 947
       case Full(user) =>
948 948
         sendValidationEmail(user)
949  
-        S.notice(S.??("account.validation.resent"))
  949
+        S.notice(S.?("account.validation.resent"))
950 950
         S.redirectTo(homePage)
951 951
 
952 952
       case _ => S.error(userNameNotFoundString)
@@ -956,7 +956,7 @@ trait ProtoUser {
956 956
   def lostPassword = {
957 957
     bind("user", lostPasswordXhtml,
958 958
          "email" -> SHtml.text("", sendPasswordReset _),
959  
-         "submit" -> lostPasswordSubmitButton(S.??("send.it")))
  959
+         "submit" -> lostPasswordSubmitButton(S.?("send.it")))
960 960
   }
961 961
 
962 962
   def lostPasswordSubmitButton(name: String, func: () => Any = () => {}): NodeSeq = {
@@ -965,9 +965,9 @@ trait ProtoUser {
965 965
 
966 966
   def passwordResetXhtml = {
967 967
     (<form method="post" action={S.uri}>
968  
-        <table><tr><td colspan="2">{S.??("reset.your.password")}</td></tr>
969  
-          <tr><td>{S.??("enter.your.new.password")}</td><td><user:pwd/></td></tr>
970  
-          <tr><td>{S.??("repeat.your.new.password")}</td><td><user:pwd/></td></tr>
  968
+        <table><tr><td colspan="2">{S.?("reset.your.password")}</td></tr>
  969
+          <tr><td>{S.?("enter.your.new.password")}</td><td><user:pwd/></td></tr>
  970
+          <tr><td>{S.?("repeat.your.new.password")}</td><td><user:pwd/></td></tr>
971 971
           <tr><td>&nbsp;</td><td><user:submit/></td></tr>
972 972
         </table>
973 973
      </form>)
@@ -978,7 +978,7 @@ trait ProtoUser {
978 978
     case Full(user) =>
979 979
       def finishSet() {
980 980
         user.validate match {
981  
-          case Nil => S.notice(S.??("password.changed"))
  981
+          case Nil => S.notice(S.?("password.changed"))
982 982
             user.resetUniqueId().save
983 983
             logUserIn(user, () => S.redirectTo(homePage))
984 984
 
@@ -988,8 +988,8 @@ trait ProtoUser {
988 988
       bind("user", passwordResetXhtml,
989 989
            "pwd" -> SHtml.password_*("",(p: List[String]) =>
990 990
           user.setPasswordFromListString(p)),
991  
-           "submit" -> resetPasswordSubmitButton(S.??("set.password"), finishSet _))
992  
-    case _ => S.error(S.??("password.link.invalid")); S.redirectTo(homePage)
  991
+           "submit" -> resetPasswordSubmitButton(S.?("set.password"), finishSet _))
  992
+    case _ => S.error(S.?("password.link.invalid")); S.redirectTo(homePage)
993 993
   }
994 994
 
995 995
   def resetPasswordSubmitButton(name: String, func: () => Any = () => {}): NodeSeq = {
@@ -998,10 +998,10 @@ trait ProtoUser {
998 998
 
999 999
   def changePasswordXhtml = {
1000 1000
     (<form method="post" action={S.uri}>
1001  
-        <table><tr><td colspan="2">{S.??("change.password")}</td></tr>
1002  
-          <tr><td>{S.??("old.password")}</td><td><user:old_pwd /></td></tr>
1003  
-          <tr><td>{S.??("new.password")}</td><td><user:new_pwd /></td></tr>
1004  
-          <tr><td>{S.??("repeat.password")}</td><td><user:new_pwd /></td></tr>
  1001
+        <table><tr><td colspan="2">{S.?("change.password")}</td></tr>
  1002
+          <tr><td>{S.?("old.password")}</td><td><user:old_pwd /></td></tr>
  1003
+          <tr><td>{S.?("new.password")}</td><td><user:new_pwd /></td></tr>
  1004
+          <tr><td>{S.?("repeat.password")}</td><td><user:new_pwd /></td></tr>
1005 1005
           <tr><td>&nbsp;</td><td><user:submit /></td></tr>
1006 1006
         </table>
1007 1007
      </form>)
@@ -1013,11 +1013,11 @@ trait ProtoUser {
1013 1013
     var newPassword: List[String] = Nil
1014 1014
 
1015 1015
     def testAndSet() {
1016  
-      if (!user.testPassword(Full(oldPassword))) S.error(S.??("wrong.old.password"))
  1016
+      if (!user.testPassword(Full(oldPassword))) S.error(S.?("wrong.old.password"))
1017 1017
       else {
1018 1018
         user.setPasswordFromListString(newPassword)
1019 1019
         user.validate match {
1020  
-          case Nil => user.save; S.notice(S.??("password.changed")); S.redirectTo(homePage)
  1020
+          case Nil => user.save; S.notice(S.?("password.changed")); S.redirectTo(homePage)
1021 1021
           case xs => S.error(xs)
1022 1022
         }
1023 1023
       }
@@ -1026,7 +1026,7 @@ trait ProtoUser {
1026 1026
     bind("user", changePasswordXhtml,
1027 1027
          "old_pwd" -> SHtml.password("", s => oldPassword = s),
1028 1028
          "new_pwd" -> SHtml.password_*("", LFuncHolder(s => newPassword = s)),
1029  
-         "submit" -> changePasswordSubmitButton(S.??("change"), testAndSet _))
  1029
+         "submit" -> changePasswordSubmitButton(S.?("change"), testAndSet _))
1030 1030
   }
1031 1031
 
1032 1032
   def changePasswordSubmitButton(name: String, func: () => Any = () => {}): NodeSeq = {
@@ -1035,7 +1035,7 @@ trait ProtoUser {
1035 1035
 
1036 1036
   def editXhtml(user: TheUserType) = {
1037 1037
     (<form method="post" action={S.uri}>
1038  
-        <table><tr><td colspan="2">{S.??("edit")}</td></tr>
  1038
+        <table><tr><td colspan="2">{S.?("edit")}</td></tr>
1039 1039
           {localForm(user, true, editFields)}
1040 1040
           <tr><td>&nbsp;</td><td><user:submit/></td></tr>
1041 1041
         </table>
@@ -1068,7 +1068,7 @@ trait ProtoUser {
1068 1068
       theUser.validate match {
1069 1069
         case Nil =>
1070 1070
           theUser.save
1071  
-          S.notice(S.??("profile.updated"))
  1071
+          S.notice(S.?("profile.updated"))
1072 1072
           S.redirectTo(homePage)
1073 1073
 
1074 1074
         case xs => S.error(xs) ; editFunc(Full(innerEdit _))
@@ -1076,7 +1076,7 @@ trait ProtoUser {
1076 1076
     }
1077 1077
 
1078 1078
     def innerEdit = bind("user", editXhtml(theUser),
1079  
-                         "submit" -> editSubmitButton(S.??("save"), testEdit _))
  1079
+                         "submit" -> editSubmitButton(S.?("save"), testEdit _))
1080 1080
 
1081 1081
     innerEdit
1082 1082
   }
2  persistence/record/src/main/scala/net/liftweb/record/ProtoUser.scala
@@ -112,7 +112,7 @@ trait ProtoUser[T <: ProtoUser[T]] extends Record[T] {
112 112
   lazy val email: EmailField[T] = new MyEmail(this, 48)
113 113
 
114 114
   protected class MyEmail(obj: T, size: Int) extends EmailField(obj, size) {
115  
-    override def validations = valUnique(S.??("unique.email.address")) _ :: super.validations
  115
+    override def validations = valUnique(S.?("unique.email.address")) _ :: super.validations
116 116
     override def displayName = owner.emailDisplayName
117 117
     override val fieldId = Some(Text("txtEmail"))
118 118
   }
2  persistence/record/src/main/scala/net/liftweb/record/field/CountryField.scala
@@ -62,7 +62,7 @@ object Countries extends Enumeration(1) {
62 62
 
63 63
   class I18NCountry extends Val {
64 64
     override def toString() =
65  
-      S.??("country_" + id)
  65
+      S.?("country_" + id)
66 66
   }
67 67
 }
68 68
 
2  persistence/record/src/main/scala/net/liftweb/record/field/EmailField.scala
@@ -37,7 +37,7 @@ trait EmailTypedField extends TypedField[String] {
37 37
   private def validateEmail(emailValue: ValueType): List[FieldError] =
38 38
     toBoxMyType(emailValue) match {
39 39
       case Full(email) if EmailField.validEmailAddr_?(email) => Nil
40  
-      case _ => Text(S.??("invalid.email.address"))
  40
+      case _ => Text(S.?("invalid.email.address"))
41 41
     }
42 42
 
43 43
   override def validations = validateEmail _ :: Nil
2  persistence/record/src/main/scala/net/liftweb/record/field/NumericField.scala
@@ -53,7 +53,7 @@ trait NumericTypedField[MyType] extends TypedField[MyType] {
53 53
       case _ => Full(elem)
54 54
     }
55 55
 
56  
-  override def noValueErrorMessage = S.??("number.required")
  56
+  override def noValueErrorMessage = S.?("number.required")
57 57
 
58 58
   def asJs = valueBox.map(v => JsRaw(String.valueOf(v))) openOr JsNull
59 59
 
6  persistence/record/src/main/scala/net/liftweb/record/field/PasswordField.scala
@@ -71,7 +71,7 @@ trait PasswordTypedField extends TypedField[String] {
71 71
       case (h1: String) :: (h2: String) :: Nil if h1 == h2 => setBoxPlain(Full(h1))
72 72
       case (hash: String) if(hash.startsWith("$2a$")) => setBox(Full(hash))
73 73
       case Full(hash: String) if(hash.startsWith("$2a$")) => setBox(Full(hash))
74  
-      case _ => {invalidPw = true; invalidMsg = S.??("passwords.do.not.match"); Failure(invalidMsg)}
  74
+      case _ => {invalidPw = true; invalidMsg = S.?("passwords.do.not.match"); Failure(invalidMsg)}
75 75
     }
76 76
   }
77 77
 
@@ -86,7 +86,7 @@ trait PasswordTypedField extends TypedField[String] {
86 86
     else List(FieldError(this, Text(notOptionalErrorMessage)))
87 87
   }
88 88
 
89  
-  override def notOptionalErrorMessage = S.??("password.must.be.set")
  89
+  override def notOptionalErrorMessage = S.?("password.must.be.set")
90 90
 
91 91
   private def elem = S.fmapFunc(SFuncHolder(this.setFromAny(_))){
92 92
     funcName => <input type="password"
@@ -104,7 +104,7 @@ trait PasswordTypedField extends TypedField[String] {
104 104
     pwdValue match {
105 105
       case Empty|Full(""|null) if !optional_? => { invalidPw = true ; invalidMsg = notOptionalErrorMessage }
106 106
       case Full(s) if s == "" || s == PasswordField.blankPw || s.length < PasswordField.minPasswordLength => 
107  
-        { invalidPw = true ; invalidMsg = S.??("password.too.short") }
  107
+        { invalidPw = true ; invalidMsg = S.?("password.too.short") }
108 108
       case _ => { invalidPw = false; invalidMsg = "" }
109 109
     }
110 110
     invalidPw
12  persistence/record/src/main/scala/net/liftweb/record/field/PostalCodeField.scala
@@ -37,17 +37,17 @@ trait PostalCodeTypedField extends StringTypedField {
37 37
   override def validations = validatePostalCode _ :: Nil
38 38
 
39 39
   def validatePostalCode(in: ValueType): List[FieldError] = country.value match {
40  
-    case Countries.USA       => valRegex(RegexPattern.compile("[0-9]{5}(\\-[0-9]{4})?"), S.??("invalid.zip.code"))(in)
41  
-    case Countries.Sweden    => valRegex(RegexPattern.compile("[0-9]{3}[ ]?[0-9]{2}"), S.??("invalid.postal.code"))(in)
42  
-    case Countries.Australia => valRegex(RegexPattern.compile("(0?|[1-9])[0-9]{3}"), S.??("invalid.postal.code"))(in)
43  
-    case Countries.Canada    => valRegex(RegexPattern.compile("[A-Z][0-9][A-Z][ ][0-9][A-Z][0-9]"), S.??("invalid.postal.code"))(in)
  40
+    case Countries.USA       => valRegex(RegexPattern.compile("[0-9]{5}(\\-[0-9]{4})?"), S.?("invalid.zip.code"))(in)
  41
+    case Countries.Sweden    => valRegex(RegexPattern.compile("[0-9]{3}[ ]?[0-9]{2}"), S.?("invalid.postal.code"))(in)
  42
+    case Countries.Australia => valRegex(RegexPattern.compile("(0?|[1-9])[0-9]{3}"), S.?("invalid.postal.code"))(in)
  43
+    case Countries.Canada    => valRegex(RegexPattern.compile("[A-Z][0-9][A-Z][ ][0-9][A-Z][0-9]"), S.?("invalid.postal.code"))(in)
44 44
     case _ => genericCheck(in)
45 45
   }
46 46
 
47 47
   private def genericCheck(zip: ValueType): List[FieldError] = {
48 48
     toBoxMyType(zip) flatMap {
49  
-      case null => Full(Text(S.??("invalid.postal.code")))
50  
-      case s if s.length < 3 => Full(Text(S.??("invalid.postal.code")))
  49
+      case null => Full(Text(S.?("invalid.postal.code")))
  50
+      case s if s.length < 3 => Full(Text(S.?("invalid.postal.code")))
51 51
       case _ => Empty
52 52
     }
53 53
   }
4  persistence/record/src/test/scala/net/liftweb/record/FieldSpec.scala
@@ -411,7 +411,7 @@ object FieldSpec extends Specification("Record Field Specification") {
411 411
       val rec = PasswordTestRecord.createRecord.password("")
412 412
 
413 413
       rec.validate must_== (
414  
-        FieldError(rec.password, Text(S.??("password.must.be.set"))) ::
  414
+        FieldError(rec.password, Text(S.?("password.must.be.set"))) ::
415 415
         Nil
416 416
       )
417 417
     }
@@ -422,7 +422,7 @@ object FieldSpec extends Specification("Record Field Specification") {
422 422
       
423 423
       rec.password("1234")
424 424
       rec.validate must_== (
425  
-        FieldError(rec.password, Text(S.??("password.too.short"))) ::
  425
+        FieldError(rec.password, Text(S.?("password.too.short"))) ::
426 426
         Nil
427 427
       )
428 428
     }
2  web/webkit/src/main/scala/net/liftweb/http/LiftRules.scala
@@ -797,7 +797,7 @@ class LiftRules() extends Factory with FormVendor with LazyLoggable {
797 797
    * The default action to take when the JavaScript action fails
798 798
    */
799 799
   @volatile var ajaxDefaultFailure: Box[() => JsCmd] =
800  
-  Full(() => JsCmds.Alert(S.??("ajax.error")))
  800
+  Full(() => JsCmds.Alert(S.?("ajax.error")))
801 801
 
802 802
   /**
803 803
    * A function that takes the current HTTP request and returns the current
4  web/webkit/src/main/scala/net/liftweb/http/LiftScreen.scala
@@ -102,11 +102,11 @@ trait AbstractScreen extends Factory {
102 102
   def screenTitle: NodeSeq = screenNameAsHtml
103 103
 
104 104
   def cancelButton: Elem = <button>
105  
-    {S.??("Cancel")}
  105
+    {S.?("Cancel")}
106 106
   </button>
107 107
 
108 108
   def finishButton: Elem = <button>
109  
-    {S.??("Finish")}
  109
+    {S.?("Finish")}
110 110
   </button>
111 111
 
112 112
 
6  web/webkit/src/main/scala/net/liftweb/http/SHtml.scala
@@ -491,14 +491,14 @@ trait SHtml {
491 491
 
492 492
     def displayMarkup : NodeSeq =
493 493
       displayContents ++ Text(" ") ++
494  
-      <input value={S.??("edit")} type="button" onclick={setAndSwap(editName, editMarkup, dispName).toJsCmd + " return false;"} />
  494
+      <input value={S.?("edit")} type="button" onclick={setAndSwap(editName, editMarkup, dispName).toJsCmd + " return false;"} />
495 495
 
496 496
     def editMarkup : NodeSeq = {
497 497
       val formData : NodeSeq =
498 498
         editForm ++
499  
-        <input type="submit" value={S.??("ok")} /> ++
  499
+        <input type="submit" value={S.?("ok")} /> ++
500 500
         hidden(onSubmit) ++
501  
-        <input type="button" onclick={swapJsCmd(dispName,editName).toJsCmd + " return false;"} value={S.??("cancel")} />
  501
+        <input type="button" onclick={swapJsCmd(dispName,editName).toJsCmd + " return false;"} value={S.?("cancel")} />
502 502
 
503 503
       ajaxForm(formData,
504 504
                Noop,
8  web/wizard/src/main/scala/net/liftweb/wizard/Wizard.scala
@@ -347,19 +347,19 @@ trait Wizard extends StatefulSnippet with Factory with ScreenWizardRendered {
347 347
   def calcFirstScreen: Box[Screen] = screens.headOption
348 348
 
349 349
   def nextButton: Elem = <button>
350  
-    {S.??("Next")}
  350
+    {S.?("Next")}
351 351
   </button>
352 352
 
353 353
   def prevButton: Elem = <button>
354  
-    {S.??("Previous")}
  354
+    {S.?("Previous")}
355 355
   </button>
356 356
 
357 357
   def cancelButton: Elem = <button>
358  
-    {S.??("Cancel")}
  358
+    {S.?("Cancel")}
359 359
   </button>
360 360
 
361 361
   def finishButton: Elem = <button>
362  
-    {S.??("Finish")}
  362
+    {S.?("Finish")}
363 363
   </button>
364 364
 
365 365
   def currentScreen: Box[Screen] = CurrentScreen.is
14  web/wizard/src/test/scala/net/liftweb/wizard/WizardSpec.scala
@@ -41,25 +41,25 @@ object WizardSpec extends Specification("Wizard Specification") {
41 41
 
42 42
     val nameAndAge = new Screen {
43 43
       val name = field(S ? "First Name", "",
44  
-                       valMinLen(2, S ?? "Name Too Short"))
  44
+                       valMinLen(2, S ? "Name Too Short"))
45 45
 
46 46
       val age = field(S ? "Age", 0,
47  
-                      minVal(5, S ?? "Too young"),
48  
-                      maxVal(120, S ?? "You should be dead"))
  47
+                      minVal(5, S ? "Too young"),
  48
+                      maxVal(120, S ? "You should be dead"))
49 49
 
50 50
       override def nextScreen = if (age.is < 18) parentName else favoritePet
51 51
     }
52 52
 
53 53
     val parentName = new Screen {
54 54
       val parentName = field(S ? "Mom or Dad's name", "",
55  
-                             valMinLen(2, S ?? "Name Too Short"),
56  
-                             valMaxLen(40, S ?? "Name Too Long"))
  55
+                             valMinLen(2, S ? "Name Too Short"),
  56
+                             valMaxLen(40, S ? "Name Too Long"))
57 57
     }
58 58