から値を取得する方法がわかりません
<FormattedMessage {...messages.placeholderIntlText} />
入力のようなプレースホルダー形式に:
<input placeholder={<FormattedMessage {...messages.placeholderIntlText} />} />
実際のプレースホルダーで[オブジェクトオブジェクト]を返すためです。実際の正しい値を取得する方法はありますか?
<Formatted... />
のreact-intl
Reactコンポーネントは、レンダリングシナリオで使用するためのものであり、プレースホルダー、代替テキストなどで使用するためのものではありません。プレーンテキストではなくHTMLをレンダリングします、これはシナリオでは役に立ちません。
代わりに、react-intl
は、まったく同じ理由で 低レベルAPI を提供します。レンダリングコンポーネント自体は、このAPIを内部で使用して、値をHTMLにフォーマットします。シナリオでは、おそらく下位レベルのformatMessage(...)
APIを使用する必要があります。
intl
HOCを使用してinjectIntl
オブジェクトをコンポーネントに挿入し、APIを介してメッセージをフォーマットするだけです。
例:
import React from 'react';
import { injectIntl, intlShape } from 'react-intl';
const ChildComponent = ({ intl }) => {
const placeholder = intl.formatMessage({id: 'messageId'});
return(
<input placeholder={placeholder} />
);
}
ChildComponent.propTypes = {
intl: intlShape.isRequired
}
export default injectIntl(ChildComponent);
ここではいくつかのES6機能を使用していることに注意してください。設定に応じて調整してください。
intl
HoCからinjectIntl
propを使用できます<FormattedMessage {...messages.placeholderIntlText}>
{(msg) => (<input placeholder={msg} />)}
</FormattedMessage>
入力プレースホルダーFor more details
<FormattedMessage id="yourid" defaultMessage="search">
{placeholder=>
<Input placeholder={placeholder}/>
}
</FormattedMessage>
react intl wiki に基づいて、翻訳可能なプレースホルダーを持つ入力ボックスの実装は次のようになります。
import React from 'react';
import { injectIntl, intlShape, defineMessages } from 'react-intl';
const messages = defineMessages({
placeholder: {
id: 'myPlaceholderText',
defaultMessage: '{text} and static text',
},
});
const ComponentWithInput = ({ intl, placeholderText }) => {
return (
<input
placeholder={ intl.formatMessage(messages.placeholder, { text: placeholderText }) }
/>
);
};
ComponentWithInput.propTypes = {
intl: intlShape.isRequired
};
export default injectIntl(ComponentWithInput);
そしてその使用法:
import ComponentWithInput from './component-with-input';
...
render() {
<ComponentWithInput placeholderText="foo" />
}
...
id: 'myPlaceholderText',
部分は、翻訳用のメッセージを収集するために babel-plugin-react-intl を有効にするために必要です。
2019年7月で、react-intl 3ベータには seIntl フックが同梱されており、これらの種類の翻訳が簡単になります:
import React from 'react';
import {useIntl, FormattedDate} from 'react-intl';
const FunctionComponent: React.FC<{date: number | Date}> = ({date}) => {
const intl = useIntl();
return (
<span title={intl.formatDate(date)}>
<FormattedDate value={date} />
</span>
);
};
export default FunctionComponent;
そして、APIが提供するメソッドを使用するカスタムフックを作成できます。
import { useIntl } from 'react-intl'
export function useFormatMessage(messageId) {
return useIntl().formatMessage({ id: messageId })
}
FormattedMessageという名前のReactコンポーネントを、文字列が必要なプレースホルダータグにレンダリングしようとしています。
代わりに、プレースホルダーに文字列を返すFormattedMessageという名前の関数を作成する必要があります。
function FormattedMessage(props) {
...
}
<input placeholder=`{$(FormattedMessage({...messages.placeholderIntlText})}` />
私の場合、アプリ全体を1つのファイルに収めていたため、export
を使用しても機能しません。これは通常のクラス構造を使用するため、必要に応じてReactの状態およびその他の機能を使用できます。
class nameInputOrig extends React.Component {
render () {
const {formatMessage} = this.props.intl;
return (
<input type="text" placeholder={formatMessage({id:"placeholderIntlText"})} />
);
}
}
const nameInput = injectIntl(nameInputOrig);
作成された定数を使用して適用します。
class App extends React.Component {
render () {
<nameInput />
}
}
@gazdagergの答えから始めて、私は彼のコードを次のように適合させました:
import React from 'react';
import { injectIntl, intlShape, defineMessages } from 'react-intl';
const InputWithPlaceholder = ({ intl, placeholder }) => {
const messages = defineMessages({
placeholder: {
id: placeholder,
defaultMessage: '',
},
});
if(messages.placeholder.id) {
return (
<input placeholder={ intl.formatMessage(messages.placeholder) } />
);
} else {
return (
<input/>
);
}
};
InputWithPlaceholder.propTypes = {
intl: intlShape.isRequired
};
export default injectIntl(InputWithPlaceholder);
次の方法で他のファイルで使用できます。
import InputWithIntlPlaceholder from 'your/path/to/component/InputWithIntlPlaceholder';
... more code here ...
<InputWithIntlPlaceholder placeholder="your.locale.string.id" />