: json typescript

다국어 지원을 위해 다국어 text를 json파일로 만들고 import를 합니다

{
  "foo": "bar",
  "sample.text": "hello world",
  "sample_text": "hello_world"
}
function getLocaleMessage(locale) {
    if (locale === 'ko') {
        return import('intl/ko.json')
    }
    
    return import('intl/en.json')
}
const locale = navigator.language
const messages = await getLocaleMessage(locale)
// 중간생략
const intl = createIntl({
    locale: locale
    messages: messages
})

근데 이상하게 메시지를 쓸수가 없어서 내가 코딩을 잘못했나 찾아보고 사용하고 있는 FormatJs 설정을 잘못했는지 디버깅을 해봤는데 이상하게 키에 점이 붙어있는 케이스만 메시지를 로드할 수 없는것이었습니다.

const messages = await getLocaleMessage(locale)
messages['foo'] // 잘나옴
messages['sample_text'] // 역시 잘나옴
messages['sample.text'] // undefined ????????

좀 더 디버깅을 해보니 이는 FormatJs의 문제는 아니였고 import 구문으로 json파일을 import하자마자 키가 사라지는 것이었습니다.

확인해보니 json파일을 import(‘file.json’) 형식으로 사용할때 원래 json값을 그대로 사용하지 않고 모듈 형식으로 변환을 하게됩니다

// 이런 json 파일이 있다면
{
  "foo": "bar",
  "sample.text": "hello world",
  "sample_text": "hello_world"
}

// 이렇게 변환이 됨
export const foo = "bar"
export const sample_text = "hello_world"
export default {
  "foo" : foo,
  "sample.text": "hello world",
  "sample_text": sample_text
}

json key에 dot이 없는경우는 그냥 그대로 사용할수 있게 모듈 변환이 되는데 dot이 포함되는 경우는 default하위에서 접근하게 변경이 됩니다 따라서

message.default['hello.world'] 

로 접근해야 됩니다. intl을 생성할때도

const messages = await getLocaleMessage(locale)

const intl = createIntl({
    locale: locale
    messages: messages.default // default를 등록.
})

뭔가 별거 아닌데 이상하게 삽질해서 끄적끄적…