Skip to content

Commit 84372c4

Browse files
authored
Merge branch 'master' into new-readme
2 parents 02792cf + a826948 commit 84372c4

File tree

15 files changed

+603
-285
lines changed

15 files changed

+603
-285
lines changed

README.md

+127-25
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,30 @@
146146

147147
The `lit-localize` module exports the following functions:
148148

149+
> Note that lit-localize relies on distinctive, annotated TypeScript type
150+
> signatures to identify calls to `msg` and other APIs during analysis of your
151+
> code. Casting a lit-localize function to a type that does not include its
152+
> annotation will prevent lit-localize from being able to extract and transform
153+
> templates from your application. For example, a cast like
154+
> `(msg as any)("greeting", "Hello")` will not be identified. It is safe to
155+
> re-assign lit-localize functions or pass them as parameters, as long as the
156+
> distinctive type signature is preserved. If needed, you can reference each
157+
> function's distinctive type with e.g. `typeof msg`.
158+
149159
### `configureLocalization(configuration)`
150160

151-
Set runtime localization configuration.
161+
Set configuration parameters for lit-localize when in runtime mode. Returns an
162+
object with functions:
163+
164+
- [`getLocale`](#getlocale-string): Return the active locale code.
165+
- [`setLocale`](#setlocalelocale-string-promise): Set the active locale code.
166+
167+
Throws if called more than once.
152168

153-
In runtime mode, this function must be called once, before any calls to `msg()`.
169+
When in transform mode, the lit-localize CLI will error if this function is
170+
called. Use
171+
[`configureTransformLocalization`](#configuretransformlocalizationconfiguration)
172+
instead.
154173

155174
The `configuration` object must have the following properties:
156175

@@ -168,37 +187,65 @@ The `configuration` object must have the following properties:
168187
Example:
169188

170189
```typescript
171-
configureLocalization({
190+
const {getLocale, setLocale} = configureLocalization({
172191
sourceLocale: 'en',
173192
targetLocales: ['es-419', 'zh_CN'],
174193
loadLocale: (locale) => import(`/${locale}.js`),
175194
});
176195
```
177196

178-
In transform mode, this function is not required, and calls to it will be
179-
replaced with `undefined`.
197+
### `configureTransformLocalization(configuration)`
180198

181-
### `getLocale() => string`
199+
Set configuration parameters for lit-localize when in transform mode. Returns an
200+
object with function:
182201

183-
Return the active locale code.
202+
- [`getLocale`](#getlocale-string): Return the active locale code.
184203

185-
In transform mode, calls to this function are transformed into the static locale
186-
code string for each emitted locale.
204+
(Note that [`setLocale`](#setlocalelocale-string-promise) is not available from
205+
this function, because changing locales at runtime is not supported in transform
206+
mode.)
187207

188-
### `setLocale(locale: string)`
208+
Throws if called more than once.
189209

190-
Set the active locale code, and begin loading templates for that locale using
191-
the `loadLocale` function that was passed to `configureLocalization`.
210+
The `configuration` object must have the following properties:
192211

193-
In transform mode, calls to this function are replaced with `undefined`.
212+
- `sourceLocale: string`: Required locale code in which source templates in this
213+
project are written, and the active locale.
194214

195-
### `localeReady() => Promise`
215+
Example:
196216

197-
Return a promise that is resolved when the next set of templates are loaded and
198-
available for rendering. Applications in runtime mode should always `await localeReady()` before rendering.
217+
```typescript
218+
const {getLocale} = configureLocalization({
219+
sourceLocale: 'en',
220+
});
221+
```
222+
223+
In transform mode, calls to this function are transformed to an object with a
224+
`getLocale` implementation that returns the static locale code for each locale
225+
bundle. For example:
226+
227+
```typescript
228+
const {getLocale} = {getLocale: () => 'es-419'};
229+
```
199230

200-
In transform mode, calls to this function are replaced with
201-
`Promise.resolve(undefined)`.
231+
### `getLocale() => string`
232+
233+
Return the active locale code.
234+
235+
### `setLocale(locale: string) => Promise`
236+
237+
Set the active locale code, and begin loading templates for that locale using
238+
the `loadLocale` function that was passed to `configureLocalization`. Returns a
239+
promise that resolves when the next locale is ready to be rendered.
240+
241+
Note that if a second call to `setLocale` is made while the first requested
242+
locale is still loading, then the second call takes precedence, and the promise
243+
returned from the first call will resolve when second locale is ready. If you
244+
need to know whether a particular locale was loaded, check `getLocale` after the
245+
promise resolves.
246+
247+
Throws if the given locale is not contained by the configured `sourceLocale` or
248+
`targetLocales`.
202249

203250
### `msg(id: string, template, ...args) => string|TemplateResult`
204251

@@ -249,21 +296,76 @@ template for each emitted locale. For example:
249296
html`Hola <b>${getUsername()}!</b>`;
250297
```
251298

252-
### `LOCALE_CHANGED_EVENT: string`
299+
### `LOCALE_STATUS_EVENT`
300+
301+
Name of the [`lit-localize-status` event](#lit-localize-status-event).
253302

254-
Whenever the locale changes and templates have finished loading, an event by
255-
this name (`"lit-localize-locale-changed"`) is dispatched to `window`.
303+
## `lit-localize-status` event
304+
305+
In runtime mode, whenever a locale change starts, finishes successfully, or
306+
fails, lit-localize will dispatch a `lit-localize-status` event to `window`.
256307

257308
You can listen for this event to know when your application should be
258309
re-rendered following a locale change. See also the
259310
[`Localized`](#localized-mixin) mixin, which automatically re-renders
260311
`LitElement` classes using this event.
261312

262-
```typescript
263-
import {LOCALE_CHANGED_EVENT} from 'lit-localize';
313+
### Event types
314+
315+
The `detail.status` string property tells you what kind of status change has occured,
316+
and can be one of: `loading`, `ready`, or `error`:
317+
318+
#### `loading`
319+
320+
A new locale has started to load. The `detail` object also contains:
321+
322+
- `loadingLocale: string`: Code of the locale that has started loading.
323+
324+
A `loading` status can be followed by a `ready`, `error`, or `loading` status.
325+
326+
In the case that a second locale is requested before the first one finishes
327+
loading, a new `loading` event is dispatched, and no `ready` or `error` event
328+
will be dispatched for the first request, because it is now stale.
264329

265-
window.addEventListener(LOCALE_CHANGED_EVENT, () => {
266-
renderApplication();
330+
#### `ready`
331+
332+
A new locale has successfully loaded and is ready for rendering. The `detail` object also contains:
333+
334+
- `readyLocale: string`: Code of the locale that has successfully loaded.
335+
336+
A `ready` status can be followed only by a `loading` status.
337+
338+
#### `error`
339+
340+
A new locale failed to load. The `detail` object also contains the following
341+
properties:
342+
343+
- `errorLocale: string`: Code of the locale that failed to load.
344+
- `errorMessage: string`: Error message from locale load failure.
345+
346+
An `error` status can be followed only by a `loading` status.
347+
348+
### Event example
349+
350+
```typescript
351+
// Show/hide a progress indicator whenever a new locale is loading,
352+
// and re-render the application every time a new locale successfully loads.
353+
window.addEventListener('lit-localize-status', (event) => {
354+
const spinner = document.querySelector('#spinner');
355+
if (event.detail.status === 'loading') {
356+
console.log(`Loading new locale: ${event.detail.loadingLocale}`);
357+
spinner.removeAttribute('hidden');
358+
} else if (event.detail.status === 'ready') {
359+
console.log(`Loaded new locale: ${event.detail.readyLocale}`);
360+
spinner.addAttribute('hidden');
361+
renderApplication();
362+
} else if (event.detail.status === 'error') {
363+
console.error(
364+
`Error loading locale ${event.detail.errorLocale}: ` +
365+
event.detail.errorMessage
366+
);
367+
spinner.addAttribute('hidden');
368+
}
267369
});
268370
```
269371

src/outputters/runtime.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {applyPatches, Patches} from '../patches';
1414
import {Locale} from '../locales';
1515
import {Config} from '../config';
1616
import {KnownError} from '../error';
17-
import {escapeStringLiteral} from '../typescript';
17+
import {escapeStringToEmbedInTemplateLiteral} from '../typescript';
1818
import * as fs from 'fs';
1919
import * as pathLib from 'path';
2020

@@ -152,7 +152,7 @@ function makeMessageString(
152152
const fragments = [];
153153
for (const content of contents) {
154154
if (typeof content === 'string') {
155-
fragments.push(escapeStringLiteral(content));
155+
fragments.push(escapeStringToEmbedInTemplateLiteral(content));
156156
} else {
157157
fragments.push(content.untranslatable);
158158
}

0 commit comments

Comments
 (0)