babel-plugin-formatjs 10.3.23 → 10.3.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BUILD +90 -0
- package/CHANGELOG.md +1139 -0
- package/LICENSE.md +0 -0
- package/README.md +0 -0
- package/global.d.ts +0 -0
- package/index.ts +88 -0
- package/integration-tests/BUILD +21 -0
- package/integration-tests/package.json +5 -0
- package/integration-tests/vue/fixtures/App.vue +19 -0
- package/integration-tests/vue/fixtures/app.js +6 -0
- package/integration-tests/vue/integration.test.ts +62 -0
- package/package.json +5 -4
- package/tests/__snapshots__/index.test.ts.snap +1246 -0
- package/tests/fixtures/2663.js +3 -0
- package/tests/fixtures/FormattedMessage.js +14 -0
- package/tests/fixtures/additionalComponentNames.js +15 -0
- package/tests/fixtures/additionalFunctionNames.js +23 -0
- package/tests/fixtures/ast.js +45 -0
- package/tests/fixtures/defineMessage.js +57 -0
- package/tests/fixtures/defineMessages.js +49 -0
- package/tests/fixtures/descriptionsAsObjects.js +18 -0
- package/tests/fixtures/empty.js +8 -0
- package/tests/fixtures/extractFromFormatMessageCall.js +47 -0
- package/tests/fixtures/extractFromFormatMessageCallStateless.js +46 -0
- package/tests/fixtures/extractSourceLocation.js +8 -0
- package/tests/fixtures/formatMessageCall.js +38 -0
- package/tests/fixtures/icuSyntax.js +18 -0
- package/tests/fixtures/idInterpolationPattern.js +40 -0
- package/tests/fixtures/inline.js +26 -0
- package/tests/fixtures/overrideIdFn.js +48 -0
- package/tests/fixtures/preserveWhitespace.js +79 -0
- package/tests/fixtures/removeDefaultMessage.js +36 -0
- package/tests/fixtures/skipExtractionFormattedMessage.js +12 -0
- package/tests/fixtures/templateLiteral.js +21 -0
- package/tests/index.test.ts +221 -0
- package/tsconfig.json +5 -0
- package/types.ts +46 -0
- package/utils.ts +226 -0
- package/visitors/call-expression.ts +208 -0
- package/visitors/jsx-opening-element.ts +147 -0
- package/index.d.ts +0 -10
- package/index.d.ts.map +0 -1
- package/index.js +0 -74
- package/types.d.ts +0 -31
- package/types.d.ts.map +0 -1
- package/types.js +0 -2
- package/utils.d.ts +0 -34
- package/utils.d.ts.map +0 -1
- package/utils.js +0 -155
- package/visitors/call-expression.d.ts +0 -6
- package/visitors/call-expression.d.ts.map +0 -1
- package/visitors/call-expression.js +0 -127
- package/visitors/jsx-opening-element.d.ts +0 -6
- package/visitors/jsx-opening-element.d.ts.map +0 -1
- package/visitors/jsx-opening-element.js +0 -89
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
export default class Foo extends Component {
|
|
5
|
+
render() {
|
|
6
|
+
return (
|
|
7
|
+
<FormattedMessage
|
|
8
|
+
id="foo.bar.baz"
|
|
9
|
+
defaultMessage="Hello World!"
|
|
10
|
+
description="The default message."
|
|
11
|
+
/>
|
|
12
|
+
)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
|
|
3
|
+
function CustomMessage() {}
|
|
4
|
+
|
|
5
|
+
export default class Foo extends Component {
|
|
6
|
+
render() {
|
|
7
|
+
return (
|
|
8
|
+
<CustomMessage
|
|
9
|
+
id="greeting-world"
|
|
10
|
+
description="Greeting to the world"
|
|
11
|
+
defaultMessage="Hello World!"
|
|
12
|
+
/>
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// @react-intl project:foo
|
|
2
|
+
import React, {Component} from 'react'
|
|
3
|
+
|
|
4
|
+
function CustomMessage() {}
|
|
5
|
+
|
|
6
|
+
export default class Foo extends Component {
|
|
7
|
+
render() {
|
|
8
|
+
t({
|
|
9
|
+
defaultMessage: 't',
|
|
10
|
+
})
|
|
11
|
+
return (
|
|
12
|
+
<CustomMessage
|
|
13
|
+
id={formatMessage({
|
|
14
|
+
defaultMessage: 'foo',
|
|
15
|
+
})}
|
|
16
|
+
description={$formatMessage({
|
|
17
|
+
defaultMessage: 'foo2',
|
|
18
|
+
})}
|
|
19
|
+
defaultMessage="Hello World!"
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage, defineMessage, defineMessages} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
defineMessage({
|
|
5
|
+
id: 'defineMessage',
|
|
6
|
+
defaultMessage: 'this is a {dt, date, full}',
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
defineMessages({
|
|
10
|
+
foo: {
|
|
11
|
+
id: 'defineMessages1',
|
|
12
|
+
defaultMessage: 'this is a {dt, time, full}',
|
|
13
|
+
},
|
|
14
|
+
bar: {
|
|
15
|
+
id: 'defineMessages2',
|
|
16
|
+
defaultMessage: 'this is a {dt, number}',
|
|
17
|
+
},
|
|
18
|
+
baz: {
|
|
19
|
+
id: 'compiled',
|
|
20
|
+
defaultMessage: [{type: 0, value: 'asd'}],
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
export default class Foo extends Component {
|
|
25
|
+
render() {
|
|
26
|
+
Intl.formatMessage({
|
|
27
|
+
id: 'intl.formatMessage',
|
|
28
|
+
defaultMessage: 'foo {s, plural, one{1} other{2}}',
|
|
29
|
+
})
|
|
30
|
+
return (
|
|
31
|
+
<>
|
|
32
|
+
<FormattedMessage
|
|
33
|
+
id="foo.bar.baz"
|
|
34
|
+
defaultMessage="Hello World!"
|
|
35
|
+
description="The default message."
|
|
36
|
+
/>
|
|
37
|
+
<FormattedMessage
|
|
38
|
+
id="compiled2"
|
|
39
|
+
defaultMessage={[{type: 0, value: 'compiled comp'}]}
|
|
40
|
+
description="The default message."
|
|
41
|
+
/>
|
|
42
|
+
</>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// @react-intl project:amazing
|
|
2
|
+
import React, {Component} from 'react'
|
|
3
|
+
import {defineMessage, FormattedMessage} from 'react-intl'
|
|
4
|
+
|
|
5
|
+
const msgs = {
|
|
6
|
+
header: defineMessage({
|
|
7
|
+
id: 'foo.bar.baz',
|
|
8
|
+
defaultMessage: 'Hello World!',
|
|
9
|
+
description: 'The default message',
|
|
10
|
+
}),
|
|
11
|
+
content: defineMessage({
|
|
12
|
+
id: 'foo.bar.biff',
|
|
13
|
+
defaultMessage: 'Hello Nurse!',
|
|
14
|
+
description: 'Another message',
|
|
15
|
+
}),
|
|
16
|
+
kittens: defineMessage({
|
|
17
|
+
id: 'app.home.kittens',
|
|
18
|
+
description: 'Counts kittens',
|
|
19
|
+
defaultMessage: '{count, plural, =0 {😭} one {# kitten} other {# kittens}}',
|
|
20
|
+
}),
|
|
21
|
+
trailingWhitespace: defineMessage({
|
|
22
|
+
id: 'trailing.ws',
|
|
23
|
+
description: 'Whitespace',
|
|
24
|
+
defaultMessage: ' Some whitespace ',
|
|
25
|
+
}),
|
|
26
|
+
escaped: defineMessage({
|
|
27
|
+
id: 'escaped.apostrophe',
|
|
28
|
+
description: 'Escaped apostrophe',
|
|
29
|
+
defaultMessage: "A quoted value ''{value}'",
|
|
30
|
+
}),
|
|
31
|
+
stringKeys: defineMessage({
|
|
32
|
+
// prettier-ignore
|
|
33
|
+
'id': 'string.key.id',
|
|
34
|
+
// prettier-ignore
|
|
35
|
+
'description': 'Keys as a string literal',
|
|
36
|
+
// prettier-ignore
|
|
37
|
+
'defaultMessage': 'This is message',
|
|
38
|
+
}),
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default class Foo extends Component {
|
|
42
|
+
render() {
|
|
43
|
+
return (
|
|
44
|
+
<div>
|
|
45
|
+
<h1>
|
|
46
|
+
<FormattedMessage {...msgs.header} />
|
|
47
|
+
</h1>
|
|
48
|
+
<p>
|
|
49
|
+
<FormattedMessage {...msgs.content} />
|
|
50
|
+
</p>
|
|
51
|
+
<p>
|
|
52
|
+
<FormattedMessage {...msgs.kittens} />
|
|
53
|
+
</p>
|
|
54
|
+
</div>
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// @react-intl project:amazing
|
|
2
|
+
import React, {Component} from 'react'
|
|
3
|
+
import {defineMessages, FormattedMessage} from 'react-intl'
|
|
4
|
+
|
|
5
|
+
const msgs = defineMessages({
|
|
6
|
+
header: {
|
|
7
|
+
id: 'foo.bar.baz',
|
|
8
|
+
defaultMessage: 'Hello World!',
|
|
9
|
+
description: 'The default message',
|
|
10
|
+
},
|
|
11
|
+
content: {
|
|
12
|
+
id: 'foo.bar.biff',
|
|
13
|
+
defaultMessage: 'Hello Nurse!',
|
|
14
|
+
description: 'Another message',
|
|
15
|
+
},
|
|
16
|
+
kittens: {
|
|
17
|
+
id: 'app.home.kittens',
|
|
18
|
+
description: 'Counts kittens',
|
|
19
|
+
defaultMessage: '{count, plural, =0 {😭} one {# kitten} other {# kittens}}',
|
|
20
|
+
},
|
|
21
|
+
trailingWhitespace: {
|
|
22
|
+
id: 'trailing.ws',
|
|
23
|
+
description: 'Whitespace',
|
|
24
|
+
defaultMessage: ' Some whitespace ',
|
|
25
|
+
},
|
|
26
|
+
escaped: {
|
|
27
|
+
id: 'escaped.apostrophe',
|
|
28
|
+
description: 'Escaped apostrophe',
|
|
29
|
+
defaultMessage: "A quoted value ''{value}'",
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
export default class Foo extends Component {
|
|
34
|
+
render() {
|
|
35
|
+
return (
|
|
36
|
+
<div>
|
|
37
|
+
<h1>
|
|
38
|
+
<FormattedMessage {...msgs.header} />
|
|
39
|
+
</h1>
|
|
40
|
+
<p>
|
|
41
|
+
<FormattedMessage {...msgs.content} />
|
|
42
|
+
</p>
|
|
43
|
+
<p>
|
|
44
|
+
<FormattedMessage {...msgs.kittens} />
|
|
45
|
+
</p>
|
|
46
|
+
</div>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
// @react-intl project:amazing2
|
|
5
|
+
export default class Foo extends Component {
|
|
6
|
+
render() {
|
|
7
|
+
return (
|
|
8
|
+
<FormattedMessage
|
|
9
|
+
id="foo.bar.baz"
|
|
10
|
+
defaultMessage="Hello World!"
|
|
11
|
+
description={{
|
|
12
|
+
text: 'Something for the translator.',
|
|
13
|
+
metadata: 'Additional metadata content.',
|
|
14
|
+
}}
|
|
15
|
+
/>
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {FormattedMessage, injectIntl} from 'react-intl'
|
|
2
|
+
import React, {Component} from 'react'
|
|
3
|
+
|
|
4
|
+
const objectPointer = {
|
|
5
|
+
id: 'foo.bar.invalid',
|
|
6
|
+
defaultMessage: 'This cannot be extracted',
|
|
7
|
+
description: 'the plugin only supports inline objects',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
class Foo extends Component {
|
|
11
|
+
render() {
|
|
12
|
+
const {intl} = this.props
|
|
13
|
+
const {
|
|
14
|
+
intl: {formatMessage},
|
|
15
|
+
} = this.props
|
|
16
|
+
const msgs = {
|
|
17
|
+
baz: this.props.intl.formatMessage({
|
|
18
|
+
id: 'foo.bar.baz',
|
|
19
|
+
defaultMessage: 'Hello World!',
|
|
20
|
+
description: 'The default message',
|
|
21
|
+
}),
|
|
22
|
+
biff: intl.formatMessage({
|
|
23
|
+
id: 'foo.bar.biff',
|
|
24
|
+
defaultMessage: 'Hello Nurse!',
|
|
25
|
+
description: 'Another message',
|
|
26
|
+
}),
|
|
27
|
+
qux: formatMessage({
|
|
28
|
+
id: 'foo.bar.qux',
|
|
29
|
+
defaultMessage: 'Hello Stranger!',
|
|
30
|
+
description: 'A different message',
|
|
31
|
+
}),
|
|
32
|
+
invalid: this.props.intl.formatMessage(objectPointer),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div>
|
|
37
|
+
<h1>{msgs.header}</h1>
|
|
38
|
+
<p>{msgs.content}</p>
|
|
39
|
+
<span>
|
|
40
|
+
<FormattedMessage id="foo" defaultMessage="bar" description="baz" />
|
|
41
|
+
</span>
|
|
42
|
+
</div>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default injectIntl(Foo)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {FormattedMessage, injectIntl, useIntl} from 'react-intl'
|
|
2
|
+
|
|
3
|
+
import React from 'react'
|
|
4
|
+
|
|
5
|
+
function myFunction(param1, {formatMessage, formatDate}) {
|
|
6
|
+
return (
|
|
7
|
+
formatMessage({
|
|
8
|
+
id: 'inline1',
|
|
9
|
+
defaultMessage: 'Hello params!',
|
|
10
|
+
description: 'A stateless message',
|
|
11
|
+
}) + formatDate(new Date())
|
|
12
|
+
)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const child = myFunction(filterable, intl)
|
|
16
|
+
|
|
17
|
+
function SFC() {
|
|
18
|
+
const {formatMessage} = useIntl()
|
|
19
|
+
return formatMessage({
|
|
20
|
+
id: 'hook',
|
|
21
|
+
defaultMessage: 'hook <b>foo</b>',
|
|
22
|
+
description: 'hook',
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const Foo = ({intl: {formatMessage}}) => {
|
|
27
|
+
const msgs = {
|
|
28
|
+
qux: formatMessage({
|
|
29
|
+
id: 'foo.bar.quux',
|
|
30
|
+
defaultMessage: 'Hello <b>Stateless!</b>',
|
|
31
|
+
description: 'A stateless message',
|
|
32
|
+
}),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div>
|
|
37
|
+
<h1>{msgs.header}</h1>
|
|
38
|
+
<p>{msgs.content}</p>
|
|
39
|
+
<span>
|
|
40
|
+
<FormattedMessage id="foo" defaultMessage="bar" description="baz" />
|
|
41
|
+
</span>
|
|
42
|
+
</div>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default injectIntl(Foo)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {injectIntl, FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
const objectPointer = {
|
|
5
|
+
id: 'foo.bar.invalid',
|
|
6
|
+
defaultMessage: 'This cannot be extracted',
|
|
7
|
+
description: 'the plugin only supports inline objects',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
class Foo extends Component {
|
|
11
|
+
render() {
|
|
12
|
+
const msgs = {
|
|
13
|
+
baz: this.props.intl.formatMessage({
|
|
14
|
+
id: 'foo.bar.baz',
|
|
15
|
+
defaultMessage: 'Hello World!',
|
|
16
|
+
description: 'The default message',
|
|
17
|
+
}),
|
|
18
|
+
biff: this.props.intl.formatMessage({
|
|
19
|
+
id: 'foo.bar.biff',
|
|
20
|
+
defaultMessage: 'Hello Nurse!',
|
|
21
|
+
description: 'Another message',
|
|
22
|
+
}),
|
|
23
|
+
invalid: this.props.intl.formatMessage(objectPointer),
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div>
|
|
28
|
+
<h1>{msgs.header}</h1>
|
|
29
|
+
<p>{msgs.content}</p>
|
|
30
|
+
<span>
|
|
31
|
+
<FormattedMessage id="foo" defaultMessage="bar" description="baz" />
|
|
32
|
+
</span>
|
|
33
|
+
</div>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default injectIntl(Foo)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
export default class Foo extends Component {
|
|
5
|
+
render() {
|
|
6
|
+
// This is bad syntax (object property in message)
|
|
7
|
+
return (
|
|
8
|
+
<FormattedMessage
|
|
9
|
+
id="foo.bar.baz"
|
|
10
|
+
defaultMessage="Hello, {foo.baz}!"
|
|
11
|
+
description="Broken message"
|
|
12
|
+
values={{
|
|
13
|
+
foo: {baz: 'biff'},
|
|
14
|
+
}}
|
|
15
|
+
/>
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {defineMessages, FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
const msgs = defineMessages({
|
|
5
|
+
header: {
|
|
6
|
+
defaultMessage: 'Hello World!',
|
|
7
|
+
description: 'The default message',
|
|
8
|
+
},
|
|
9
|
+
content: {
|
|
10
|
+
id: 'foo.bar.biff',
|
|
11
|
+
defaultMessage: 'Hello Nurse!',
|
|
12
|
+
description: {
|
|
13
|
+
text: 'Something for the translator.',
|
|
14
|
+
metadata: 'Additional metadata content.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export default class Foo extends Component {
|
|
20
|
+
render() {
|
|
21
|
+
return (
|
|
22
|
+
<div>
|
|
23
|
+
<h1>
|
|
24
|
+
<FormattedMessage {...msgs.header} />
|
|
25
|
+
</h1>
|
|
26
|
+
<p>
|
|
27
|
+
<FormattedMessage {...msgs.content} />
|
|
28
|
+
</p>
|
|
29
|
+
<FormattedMessage
|
|
30
|
+
defaultMessage="Hello World!"
|
|
31
|
+
description="Something for the translator. Another description"
|
|
32
|
+
/>
|
|
33
|
+
<FormattedMessage
|
|
34
|
+
defaultMessage="NO ID"
|
|
35
|
+
description="Something for the translator. Another description"
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage, defineMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
export default class Foo extends Component {
|
|
5
|
+
render() {
|
|
6
|
+
return (
|
|
7
|
+
<div>
|
|
8
|
+
<FormattedMessage
|
|
9
|
+
id="foo.bar.baz"
|
|
10
|
+
defaultMessage="Hello World!"
|
|
11
|
+
description="The default message."
|
|
12
|
+
/>
|
|
13
|
+
{defineMessage({
|
|
14
|
+
id: 'header',
|
|
15
|
+
defaultMessage: 'Hello World!',
|
|
16
|
+
description: 'The default message',
|
|
17
|
+
})}
|
|
18
|
+
{defineMessage({
|
|
19
|
+
id: 'header2',
|
|
20
|
+
defaultMessage: 'Hello World!',
|
|
21
|
+
description: 'The default message',
|
|
22
|
+
})}
|
|
23
|
+
</div>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {defineMessages, FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
const msgs = defineMessages({
|
|
5
|
+
header: {
|
|
6
|
+
id: 'foo.bar.baz',
|
|
7
|
+
defaultMessage: 'Hello World!',
|
|
8
|
+
description: 'The default message',
|
|
9
|
+
},
|
|
10
|
+
content: {
|
|
11
|
+
id: 'foo.bar.biff',
|
|
12
|
+
defaultMessage: 'Hello Nurse!',
|
|
13
|
+
description: {
|
|
14
|
+
text: 'Something for the translator.',
|
|
15
|
+
metadata: 'Additional metadata content.',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
export default class Foo extends Component {
|
|
21
|
+
render() {
|
|
22
|
+
return (
|
|
23
|
+
<div>
|
|
24
|
+
<h1>
|
|
25
|
+
<FormattedMessage {...msgs.header} />
|
|
26
|
+
</h1>
|
|
27
|
+
<p>
|
|
28
|
+
<FormattedMessage {...msgs.content} />
|
|
29
|
+
</p>
|
|
30
|
+
<FormattedMessage
|
|
31
|
+
id="foo.bar.zoo"
|
|
32
|
+
defaultMessage="Hello World!"
|
|
33
|
+
description={{
|
|
34
|
+
text: 'Something for the translator. Another description',
|
|
35
|
+
metadata: 'Additional metadata content.',
|
|
36
|
+
}}
|
|
37
|
+
/>
|
|
38
|
+
<FormattedMessage
|
|
39
|
+
defaultMessage="NO ID"
|
|
40
|
+
description={{
|
|
41
|
+
text: 'Something for the translator. Another description',
|
|
42
|
+
metadata: 'Additional metadata content.',
|
|
43
|
+
}}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// @react-intl project:amazing
|
|
2
|
+
import React, {Component} from 'react'
|
|
3
|
+
import {defineMessages, FormattedMessage} from 'react-intl'
|
|
4
|
+
|
|
5
|
+
const msgs = defineMessages({
|
|
6
|
+
header: {
|
|
7
|
+
id: 'foo.bar.baz',
|
|
8
|
+
defaultMessage: 'Hello World!',
|
|
9
|
+
description: 'The default message',
|
|
10
|
+
},
|
|
11
|
+
content: {
|
|
12
|
+
id: 'foo.bar.biff',
|
|
13
|
+
defaultMessage: 'Hello Nurse!',
|
|
14
|
+
description: 'Another message',
|
|
15
|
+
},
|
|
16
|
+
kittens: {
|
|
17
|
+
id: 'app.home.kittens',
|
|
18
|
+
description: 'Counts kittens',
|
|
19
|
+
defaultMessage: '{count, plural, =0 {😭} one {# kitten} other {# kittens}}',
|
|
20
|
+
},
|
|
21
|
+
trailingWhitespace: {
|
|
22
|
+
id: 'trailing.ws',
|
|
23
|
+
description: 'Whitespace',
|
|
24
|
+
defaultMessage: ' Some whitespace ',
|
|
25
|
+
},
|
|
26
|
+
escaped: {
|
|
27
|
+
id: 'escaped.apostrophe',
|
|
28
|
+
description: 'Escaped apostrophe',
|
|
29
|
+
defaultMessage: "A quoted value ''{value}'",
|
|
30
|
+
},
|
|
31
|
+
newline: {
|
|
32
|
+
id: 'newline',
|
|
33
|
+
description: 'this is \
|
|
34
|
+
a \
|
|
35
|
+
description',
|
|
36
|
+
defaultMessage: 'this is \
|
|
37
|
+
a message',
|
|
38
|
+
},
|
|
39
|
+
linebreak: {
|
|
40
|
+
id: 'linebreak',
|
|
41
|
+
description: 'this is\na\ndescription',
|
|
42
|
+
defaultMessage: 'this is\na message',
|
|
43
|
+
},
|
|
44
|
+
templateLinebreak: {
|
|
45
|
+
id: 'templateLinebreak',
|
|
46
|
+
description: `this is
|
|
47
|
+
a
|
|
48
|
+
description`,
|
|
49
|
+
defaultMessage: `this is
|
|
50
|
+
a message`,
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
export default class Foo extends Component {
|
|
55
|
+
render() {
|
|
56
|
+
return (
|
|
57
|
+
<div>
|
|
58
|
+
<h1>
|
|
59
|
+
<FormattedMessage {...msgs.header} />
|
|
60
|
+
</h1>
|
|
61
|
+
<p>
|
|
62
|
+
<FormattedMessage {...msgs.content} />
|
|
63
|
+
</p>
|
|
64
|
+
<p>
|
|
65
|
+
<FormattedMessage {...msgs.kittens} />
|
|
66
|
+
</p>
|
|
67
|
+
<p>
|
|
68
|
+
<FormattedMessage
|
|
69
|
+
id="inline.linebreak"
|
|
70
|
+
defaultMessage="formatted message
|
|
71
|
+
with linebreak"
|
|
72
|
+
description="foo
|
|
73
|
+
bar"
|
|
74
|
+
/>
|
|
75
|
+
</p>
|
|
76
|
+
</div>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {defineMessages, FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
defineMessages({
|
|
5
|
+
foo: {
|
|
6
|
+
id: 'greeting-user',
|
|
7
|
+
description: 'Greeting the user',
|
|
8
|
+
defaultMessage: 'Hello, {name}',
|
|
9
|
+
},
|
|
10
|
+
foo2: {
|
|
11
|
+
description: 'foo2',
|
|
12
|
+
defaultMessage: 'foo2-msg',
|
|
13
|
+
},
|
|
14
|
+
foo3: {
|
|
15
|
+
defaultMessage: 'foo3-msg',
|
|
16
|
+
},
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export default class Foo extends Component {
|
|
20
|
+
render() {
|
|
21
|
+
return (
|
|
22
|
+
<>
|
|
23
|
+
<FormattedMessage
|
|
24
|
+
id="greeting-world"
|
|
25
|
+
description="Greeting to the world"
|
|
26
|
+
defaultMessage="Hello World!"
|
|
27
|
+
/>
|
|
28
|
+
<FormattedMessage
|
|
29
|
+
defaultMessage="message with desc"
|
|
30
|
+
description="desc with desc"
|
|
31
|
+
/>
|
|
32
|
+
<FormattedMessage defaultMessage="message only" />
|
|
33
|
+
</>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
function nonStaticId() {
|
|
5
|
+
return 'baz'
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default class Foo extends Component {
|
|
9
|
+
render() {
|
|
10
|
+
return <FormattedMessage id={`foo.bar.${nonStaticId()}`} />
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, {Component} from 'react'
|
|
2
|
+
import {FormattedMessage, defineMessage} from 'react-intl'
|
|
3
|
+
|
|
4
|
+
defineMessage({
|
|
5
|
+
id: `template`,
|
|
6
|
+
defaultMessage: `should remove
|
|
7
|
+
newline and
|
|
8
|
+
extra spaces`,
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
export default class Foo extends Component {
|
|
12
|
+
render() {
|
|
13
|
+
return (
|
|
14
|
+
<FormattedMessage
|
|
15
|
+
id="foo.bar.baz"
|
|
16
|
+
defaultMessage={`Hello World!`}
|
|
17
|
+
description="The default message."
|
|
18
|
+
/>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
}
|