728x90
글로벌 서비스를 개발할때
기본 언어를 해당 사용자에 맞게
설정해주는 것은
사용자를 위한 최소한의 배려이다
간단하게
react-native 앱의 기본언어
설정 방법에 대해 알아본다.
[ 목차 ]
1. 디바이스 OS별 언어 설정 불러오기
2. 기본 언어 설정해주기
3. 전체 상태 변경
import {NativeModules, Platform} from 'react-native';
const useLanguageState = () => {
useLayoutEffect(() => {
const language = getSystemLanguage();
console.log(language);
}, []);
const getSystemOriginLanguage = () => {
let systemLanguage = '';
if (Platform.OS === 'ios') {
systemLanguage = NativeModules.SettingsManager.settings.AppleLocale
|| NativeModules.SettingsManager.settings.AppleLanguages[0];
} else {
NativeModules.I18nManager.localeIdentifier;
}
const language = systemLanguage.toLowerCase().indexOf('ko') >= 0 ? 'KR' : 'EN';
return language;
}
}
OS별로 시스템 랭귀지리를 불러와
콘솔에 찍어 확인해보았다.
기본 언어를 설정해주어야 하는데
앱이 재실행 됐을때도 해당 언어로
상태를 유지해주기위해
스토리지에 저장해 주도록 한다.
import {NativeModules, Platform} from 'react-native';
import storage from '@react-native-async-storage/async-storage';
type LanguageTypes = 'KR' | 'EN';
const useLanguageState = () => {
useLayoutEffect(() => {
const language = getSystemLanguage();
setupUserLanguage(language);
}, []);
const getSystemOriginLanguage = () => {
let systemLanguage = '';
if (Platform.OS === 'ios') {
systemLanguage = NativeModules.SettingsManager.settings.AppleLocale
|| NativeModules.SettingsManager.settings.AppleLanguages[0];
} else {
NativeModules.I18nManager.localeIdentifier;
}
const language = systemLanguage.toLowerCase().indexOf('ko') >= 0 ? 'KR' : 'EN';
return language;
}
const setupUserLanguage = async (systemLanguage: LanguageTypes) => {
const savedLanguage = await storage.getItem('language');
if (!savedLanguage) {
await updateUserDefaultLanguage(systemLanguage);
}
}
const updateUserDefaultLanguage = async (lang: LanguageTypes) => {
await storage.setItem('language', lang);
}
}
storage에 이전에 저장된 값이 있으면
갱신을 생략하고 없으면 갱신하는 구조이다.
이제 변경된 상태를
global state관리 도구로
서비스 전체에 적용해주면 되는데
여기서는 react-redux를 사용한다.
import {NativeModules, Platform} from 'react-native';
import {useDispatch, useSelector} from 'react-redux';
import storage from '@react-native-async-storage/async-storage';
import {RootState} from '@redux/store';
import {changeGlobalLanguage} from '@redux/setup/actions';
type LanguageTypes = 'KR' | 'EN';
const useLanguageState = () => {
const dispatch = useDispatch();
const { globalLanguage } = useSelector((state: RootState) => state.setup);
useLayoutEffect(() => {
const language = getSystemLanguage();
setupUserLanguage(language);
}, []);
const getSystemOriginLanguage = () => {
let systemLanguage = '';
if (Platform.OS === 'ios') {
systemLanguage = NativeModules.SettingsManager.settings.AppleLocale
|| NativeModules.SettingsManager.settings.AppleLanguages[0];
} else {
NativeModules.I18nManager.localeIdentifier;
}
const language = systemLanguage.toLowerCase().indexOf('ko') >= 0 ? 'KR' : 'EN';
return language;
}
const setupUserLanguage = async (systemLanguage: LanguageTypes) => {
const savedLanguage = await storage.getItem('language');
await updateUserDefaultLanguage(systemLanguage);
}
const updateUserDefaultLanguage = async (lang: LanguageTypes) => {
dispatch(changeGlobalLanguage(lang));
await storage.setItem('language', lang);
}
return { language: globalLanguage };
}
store는 각자 구성해보도록 하자.
단순히 KR -> EN -> ... 등으로 string 변경만 해주는 수준이니
어렵지 않게 설정 가능할것이다.
728x90
반응형
'개발, 코딩 > App - React Native' 카테고리의 다른 글
앱 광고 달기, @react-native-admob/admob (0) | 2022.04.21 |
---|---|
react-native-snap-carousel, error malformed (0) | 2022.04.18 |
react-native-sound, 앱 업데이트 후 재생안됨 이슈 해결 (0) | 2022.03.30 |
ios, backgroundTask error (0) | 2022.03.28 |
react-native-sound 실행 안됨 [solved] (0) | 2022.03.28 |