|
16 | 16 | define([], factory); |
17 | 17 | } else if (typeof exports === 'object') { |
18 | 18 | // NodeJS support. |
19 | | - module.exports = new (factory())(); |
| 19 | + module.exports = new(factory())(); |
20 | 20 | } else { |
21 | 21 | // Browser global support. |
22 | | - root.Lang = new (factory())(); |
| 22 | + root.Lang = new(factory())(); |
23 | 23 | } |
24 | 24 |
|
25 | 25 | }(this, function() { |
|
28 | 28 |
|
29 | 29 | var defaults = { |
30 | 30 | defaultLocale: 'en' /** The default locale if not set. */ |
31 | | - } |
| 31 | + }; |
32 | 32 |
|
33 | 33 | // Constructor // |
34 | 34 |
|
|
59 | 59 | * @return {string} The translation message, if not found the given key. |
60 | 60 | */ |
61 | 61 | Lang.prototype.get = function(key, replacements) { |
62 | | - if (typeof key !== 'string' || !this.has(key)) { |
| 62 | + if (!this.has(key)) { |
| 63 | + return key; |
| 64 | + } |
| 65 | + |
| 66 | + var message = this._getMessage(key, replacements); |
| 67 | + if (message === null) { |
63 | 68 | return key; |
64 | 69 | } |
65 | | - return this.getMessage(key, replacements); |
| 70 | + |
| 71 | + if (replacements) { |
| 72 | + message = this._applyReplacements(message, replacements); |
| 73 | + } |
| 74 | + |
| 75 | + return message; |
66 | 76 | }; |
67 | 77 |
|
68 | 78 | /** |
|
76 | 86 | if (typeof key !== 'string' || !this.messages) { |
77 | 87 | return false; |
78 | 88 | } |
79 | | - var message = this._getMessage(key); |
80 | | - |
81 | | - return message !== undefined && typeof message === "string"; |
| 89 | + return this._getMessage(key) !== null; |
82 | 90 | }; |
83 | 91 |
|
84 | 92 | /** |
|
106 | 114 | * |
107 | 115 | * @param key {string} The message key to parse. |
108 | 116 | * |
109 | | - * @return {object} A key object with main and sub properties. |
| 117 | + * @return {object} A key object with source and entries properties. |
110 | 118 | */ |
111 | | - Lang.prototype.parseKey = function(key) { |
| 119 | + Lang.prototype._parseKey = function(key) { |
112 | 120 | if (typeof key !== 'string') { |
113 | 121 | return null; |
114 | 122 | } |
115 | 123 | var segments = key.split('.'); |
116 | | - var main = this.getLocale() + '\\' + segments.shift(); |
117 | | - |
118 | 124 | return { |
119 | | - main: main, |
120 | | - sub: segments |
| 125 | + source: this.getLocale() + '.' + segments[0], |
| 126 | + entries: segments.slice(1) |
121 | 127 | }; |
122 | 128 | }; |
123 | 129 |
|
124 | 130 | /** |
125 | 131 | * Returns a translation message. Use `Lang.get()` method instead, this methods assumes the key exists. |
126 | 132 | * |
127 | 133 | * @param key {string} The key of the message. |
128 | | - * @param replacements {object} The replacements to be done in the message. |
129 | 134 | * |
130 | 135 | * @return {string} The translation message for the given key. |
131 | 136 | */ |
132 | | - Lang.prototype.getMessage = function(key, replacements) { |
133 | | - var message = this._getMessage(key); |
| 137 | + Lang.prototype._getMessage = function(key) { |
134 | 138 |
|
135 | | - for (var replace in replacements) { |
136 | | - message = message.split(':' + replace).join(replacements[replace]); |
| 139 | + key = this._parseKey(key); |
| 140 | + |
| 141 | + // Ensure message source exists. |
| 142 | + if (this.messages[key.source] === undefined) { |
| 143 | + return null; |
| 144 | + } |
| 145 | + |
| 146 | + // Get message text. |
| 147 | + var message = this.messages[key.source]; |
| 148 | + while (key.entries.length && (message = message[key.entries.shift()])); |
| 149 | + |
| 150 | + if (typeof message !== 'string') { |
| 151 | + return null; |
137 | 152 | } |
138 | 153 |
|
139 | 154 | return message; |
140 | 155 | }; |
141 | | - |
142 | | - /** |
143 | | - * Get nested message. |
| 156 | + |
| 157 | + /** |
| 158 | + * Apply replacements to a string message containing placeholders. |
144 | 159 | * |
145 | | - * @param key |
146 | | - * @returns {*} |
147 | | - * @private |
| 160 | + * @param message {string} The text message. |
| 161 | + * @param replacements {object} The replacements to be done in the message. |
| 162 | + * |
| 163 | + * @return {string} The string message with replacements applied. |
148 | 164 | */ |
149 | | - Lang.prototype._getMessage = function (key) { |
150 | | - key = this.parseKey(key); |
151 | | - |
152 | | - var length = key.sub.length, |
153 | | - message = this.messages[key.main], |
154 | | - i; |
155 | | - |
156 | | - for ( i = 0; i < length; i++ ) { |
157 | | - message = message[key.sub[i]]; |
| 165 | + Lang.prototype._applyReplacements = function(message, replacements) { |
| 166 | + for (var replace in replacements) { |
| 167 | + message = message.split(':' + replace).join(replacements[replace]); |
158 | 168 | } |
159 | | - |
160 | 169 | return message; |
161 | 170 | }; |
162 | 171 |
|
|
0 commit comments