Advertisement
MadMax1028

Translations hierarchy using Kotlin delegates

Jul 5th, 2017
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.49 KB | None | 0 0
  1. // AuthMessages.kt
  2. object AuthMessages : Messages("auth") {
  3.     object user {
  4.         val username by messageKey()
  5.         val password by messageKey()
  6.         val roles by messageKey()
  7.         val enabled by messageKey()
  8.     }
  9.     object action {
  10.         val logout by messageKey()
  11.     }
  12.     object role {
  13.         val users_viewing by messageKey()
  14.         val users_editing by messageKey()
  15.     }
  16. }
  17.  
  18. // Messages.kt
  19. abstract class Messages(private val rootKey: String) {
  20.     init {
  21.         require(rootKey.isNotEmpty()) { "Root key can't be empty." }
  22.     }
  23.    
  24.     protected fun messageKey() = object : ReadOnlyProperty<Any, String> {
  25.         private var messageKey: String? = null
  26.        
  27.         override fun getValue(thisRef: Any, property: KProperty<*>): String {
  28.             var key = messageKey
  29.             if (key == null) {
  30.                 val nodeClassName = thisRef.javaClass.name
  31.                 val nestedClassNameIndex = nodeClassName.indexOf('$')
  32.                
  33.                 key = rootKey + "." + when (nestedClassNameIndex) {
  34.                     -1 -> property.name // top level
  35.                     else -> { // nested
  36.                         val parentKey = nodeClassName.substring(nestedClassNameIndex + 1).replace('$', '.')
  37.                         "$parentKey.${property.name}"
  38.                     }
  39.                 }
  40.                 messageKey = key
  41.             }
  42.             return key
  43.         }
  44.     }
  45. }
  46.  
  47. // auth/messages_pl.properties
  48. auth.user.username = Login
  49. auth.user.password = Hasło
  50. auth.user.enabled = Włączony?
  51. auth.user.roles = Role
  52.  
  53. auth.action.logout = Wyloguj
  54.  
  55. auth.role.users_viewing = Podgląd użytkowników
  56. auth.role.users_editing = Edycja użytkowników
  57.  
  58. // example
  59. button(caption = i18n[AuthMessages.action.logout])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement