- 마지막 업데이트
국가/언어
이해하기
글로벌 언어 정책
스토브 플랫폼 및 게임 이용자에게 노출되는 언어는 기본적으로 스토브가 정한 글로벌 언어 운영 정책에 따라 제공해요. 아래 상위 정책을 기준으로 적용하며, 세부 사항은 현업에 맞추어 조정할 수 있으니 퍼블리싱 기술 담당자를 통해 논의해 주세요.
글로벌 언어 상위 정책
| 구분 | 설명 |
|---|---|
| 시스템 언어 | 스토브 플랫폼 전반의 UI/UX 언어. 스토브 플랫폼 기본 언어인 한/영/일/번/간 제공 |
| 이용자 언어 | 스토브 플랫폼 내 이용자가 생산하는 텍스트 전반. 이용자의 고유 창작물로 임의로 언어 수정하지 않음 단, 이용자 간 원활한 소통 지원을 위해 노출 제외·분류 적용·자동 번역툴 지원 등의 조치 가능 |
| 입점사 언어 | 스토브 플랫폼에 입점하는 입점사가 작성한 전시·운영 영역의 언어. 입점사가 서비스 목적 고려하여 범위 자율 선택 단, 운영 언어 정책에 반하는 경우 전시 제외 또는 수정 조치 |
| 운영 언어 | 스토브 플랫폼 및 입점 게임 홍보 언어. 서비스별 목적에 따라 언어 자율 제공 단, 특정 권역에 서비스하려면 권역의 대표 언어 필수 제공 |
스토브 서비스 언어 노출 기준
| 항목 | 내용 |
|---|---|
| 기본 정책 | ㆍ 쿠키는 이용자가 '언어 선택(GNB 등)' 영역에서 직접 언어를 변경하는 경우에만 생성돼요. ㆍ 언어 Path는 쿠키를 업데이트하지 않아요. |
| 언어 설정 우선 순위 | URL path > 쿠키 > 브라우저 언어 > 서비스별 default 언어 |
| ※ 참고 | 노출되는 언어는 ① 기기 환경, ② 이용자 설정, ③ 진입 경로에 따라 결정되며, 접속 IP와는 무관해요. |
국가/언어 서비스란?
스토브 SDK는 현재 접속한 이용자의 국가 정보(GDS)와 파트너스에 등록된 게임 상수 정보를 초기화 이후 조회할 수 있는 기능을 제공해요.
또한 스토브 플랫폼의 표시 언어를 게임 언어에 맞춰 변경할 수 있어, 플레이어가 경험하는 언어를 일관되게 유지할 수 있어요.
모든 기능은 SDK initialize 완료 이후에 동작해요.

기능 구성
| 기능 | 설명 | Mobile | PC |
|---|---|---|---|
| GDS 획득 | 현재 접속한 이용자의 국가 정보(Global Domain Service) 조회 nation, lang, regulation, timezone 등 포함 |
✅ | ✅ |
| 게임 상수 정보 획득 | 파트너스에 등록한 key, value를 초기화 이후 클라이언트에서 조회 | ✅ | — |
| 플랫폼 표시 언어 변경 | 스토브 플랫폼 표시 언어를 게임 언어에 맞춰 변경 게임 언어 변경 시 함께 호출하면 언어 일관 유지 |
✅ | ✅ |
| 디바이스 언어로 변경 | 플랫폼 표시 언어를 디바이스 설정 언어(System)로 복원 | ✅ | ✅ |
플랫폼 표시 언어 지원 목록
총 10개 언어를 지원해요.
| 언어 코드 | 언어명 |
|---|---|
| System | 디바이스의 설정 언어 |
| English | 영어 |
| German | 독일어 |
| Spanish | 스페인어 |
| French | 프랑스어 |
| Japanese | 일본어 |
| Korean | 한국어 |
| Portuguese | 포르투갈어 |
| Thai | 태국어 |
| SimplifiedChinese | 중국어 간체 |
| TraditionalChinese | 중국어 번체 |
개발하기
국가/게임 정보 얻기
이 섹션에서는 두 가지 정보를 가져오는 방법을 다뤄요.
- GDS 획득: 현재 접속한 이용자의 국가 정보(Global Domain Service)를 가져와요.
nation,lang,regulation,timezone등을 포함해요. (Mobile / PC 모두 지원) - 게임 상수 정보 획득: 파트너스에 등록한 key-value를 클라이언트에서 조회해요. (Mobile 전용, PC 환경 미지원)
GDS 응답 예시: {"is_default":false,"nation":"KR","lang":"ko","regulation":"KOREA","timezone":"Asia/Seoul","utc_offset":540,"ip":"211.34.57.xxx"}
모바일
사전 준비
- SDK 초기화(
initialize)가 완료된 이후에 호출해요. Constants.get은 동기 함수예요. 별도 콜백 등록이 필요 없어요.- 게임 상수 정보 획득 사용 시 추가 준비: 파트너스 SDK Config에
game_config모듈을 추가해야 해요.

개발 흐름
GDS 획득
- SDK 초기화 완료 콜백 안에서
Constants.get("gds", "")를 호출해 GDS 정보를 조회해요. - 반환값(JSON 문자열)에서
nation,lang,regulation,timezone등을 파싱해 사용해요. - 국가 코드만 필요하면
Constants.get("nation", "")로 간단히 조회할 수 있어요. is_default가true면 IP로 국가 판별이 어려워 스토브 기본값이 반환된 상태예요. 분기 로직에서 기본값 처리나 재시도 정책을 적용해요.
게임 상수 정보 획득
- 파트너스
game_config모듈에 게임이 사용할 key-value 항목을 등록해요. - SDK 초기화 완료 콜백 안에서
Constants.get("game_config", "")를 호출해 등록된 값을 JSON 문자열로 받아요. - JSON을 파싱해 필요한 key 값을 사용해요.
트러블슈팅
GDS 획득
| 상황 | 원인 | 조치 |
|---|---|---|
빈 문자열 / nil 반환 | SDK 초기화(initialize) 미완료, 또는 첫 실행에서 네트워크 실패 후 캐시 없음 | initialize 콜백 완료 이후에만 Constants.get을 호출하도록 호출 시점을 옮기세요. 첫 실행 + 네트워크 단절 상황에서는 이용자에게 네트워크 연결을 안내하고 SDK 초기화를 재시도하세요. |
is_default == true | IP로 국가 판별 실패 (VPN, 데이터센터 IP 등) — 스토브 기본값이 반환됨 | 게임 내 기본 국가 코드를 적용하거나, Android는 Locale.getDefault() / iOS는 Locale.preferredLanguages로 디바이스 언어에 맞춰 폴백하세요. 결제·연령 등 국가 의존 로직은 해당 분기에서 보수적으로 동작하도록 작성하세요. |
| 캐시된 이전 값이 반환됨 | Constants는 SharedPreferences(Android) / UserDefaults 암호화(iOS)에 캐시되며, 신규 init 응답이 와야 갱신됨 | 이용자 위치·언어 변경 시점이나 장기 미사용 후 진입 시 SDK를 재초기화해 최신 GDS를 받아오세요. |
게임 상수 정보 획득
| 상황 | 원인 | 조치 |
|---|---|---|
빈 문자열 / nil 반환 | 파트너스 SDK Config에 game_config 모듈 미추가, 또는 등록 key 오타 | 파트너스 콘솔의 game_config 모듈에 해당 key가 등록돼 있는지, 클라이언트에서 사용하는 key 문자열과 정확히 일치하는지 확인하고 수정하세요. |
| 플랫폼별 boolean 반환값이 다름 | Android는 JSONObject, iOS는 암호화 NSDictionary 기반 직렬화 차이 | 가능하면 boolean 대신 "Y"/"N"이나 0/1 같은 일관된 형식으로 등록하세요. 기존 boolean 키를 유지해야 한다면 Android("true"/"false")와 iOS("0"/"1") 양쪽 반환값을 모두 처리하는 분기를 클라이언트에 명시적으로 작성하세요. |
| SDK 초기화 전 호출 | 위 안내와 동일 (default / nil 반환) | initialize 콜백 안에서만 Constants.get("game_config", ...)을 호출하도록 호출 위치를 조정하세요. |
샘플 코드
GDS 획득
public void GetGds() {
string gds = Constants.Get("gds");
//ex) {"is_default":false,"nation":"KR","lang":"ko","regulation":"KOREA","timezone":"Asia/Seoul","utc_offset":540,"ip":"211.34.57.xxx"}
string nation = Constants.Get("nation"); // ex) KR
}
게임 상수 정보 획득
public void GetGameConstants() {
string gameConfig = Constants.Get("game_config");
}
PC (PCSDK)
사전 준비
- BaseSDK 초기화(
Base_Initialize)가 완료된 이후에 호출해요. 초기화 전에 호출하면BASE_NOT_INITIALIZED(16) 에러가 반환돼요. Base_GetGds는 동기 함수예요. 콜백 등록이 필요 없어요.- 게임 상수 정보(
game_config)는 PCSDK에서 제공하지 않아요. 모바일 전용 기능이에요.
개발 흐름
- 게임 시작 시
Base_RestartAppIfNecessary콜백 →Base_Initialize완료 이후Base_GetGds(&gds)를 호출해 GDS 정보를 조회해요. - 반환된 결과(
Result)를IsSuccessful()로 검증해요. - 성공 시
StovePCGds객체에서GetNation(),GetLanguage(),GetRegulation(),GetTimeZone(),GetUtcOffset(),IsDefault()값을 사용해요. - 실패 시 에러 코드별 처리(트러블슈팅 표 참고)를 진행해요.
트러블슈팅
| 상황 | 원인 | 해결 방법 |
|---|---|---|
게임 시작 직후 Base_GetGds를 호출했더니 BASE_NOT_INITIALIZED(16)가 반환돼요 | Base_RestartAppIfNecessary는 비동기이며 콜백은 Base_RunCallback 호출 시 디스패치돼요. Base_Initialize(동기)는 해당 콜백의 requiresRestart == false 분기 안에서 호출해야 해요. 이 두 단계가 완료되기 전에 GDS 조회를 호출하면 16번 오류가 발생해요. | Base_RestartAppIfNecessary 콜백에서 requiresRestart == false를 확인한 뒤 Base_Initialize를 호출하고, Base_Initialize가 성공한 이후에 GDS 조회를 호출해야 해요. 게임 시작 시 국가별 분기가 필요하다면 이 순서대로 부팅 시퀀스를 잡으면 문제없어요. |
GDS 조회에서 INVALID_GDS_INFO(83)가 반환돼요 | 클라이언트와 스토브 서버 간 GDS 정보 동기화에 실패한 상태예요. 게임 시작 시점에 이용자 네트워크가 단절돼 있거나 스토브 측 일시 장애일 때 발생해요. | 잠시 후 BaseSDK 재초기화로 GDS를 다시 받아오거나, 게임을 종료하고 재시작하도록 안내해야 해요. 무한 재시도 대신 이용자에게 네트워크 점검을 안내하면 문제없어요. |
GDS 정보를 받았는데 IsDefault()가 true예요 | 이용자 IP로 국가를 판별할 수 없는 환경(VPN, 데이터센터 IP, 일부 모바일 통신망)일 때 스토브 기본 국가 코드가 내려와요. 오류는 아니지만 실제 이용자 위치와 다를 수 있어요. | 국가 의존 로직(결제, 연령 등급, 언어 등)에서는 IsDefault()가 true이면 보수적으로 동작하도록 분기를 둬야 해요. 게임 내 국가 선택 화면을 두고 이용자 입력으로 보정하거나, 디폴트 동작을 명시적으로 설계하면 문제없어요. |
Base_GetGds 호출 시 INVALID_PARAM(5)가 반환돼요 | 전달한 out 파라미터 포인터(StovePCGds*)가 nullptr이거나 잘못된 주소를 가리키고 있어요. | 호출 직전에 StovePCGds 변수를 선언하고 그 주소를 넘겨야 해요. 조회한 정보를 콜백 이후에도 사용할 거라면 필요한 값을 미리 복사해 두면 문제없어요. |
IsDefault() 값을 함께 확인해 주세요
IP로 국가 판별이 불가능한 경우 스토브 기본 국가 코드가 반환되며 IsDefault()가 true로 나와요. 이 경우 국가별 분기 로직에서 기본값으로 처리하거나 재시도 정책을 적용해요.
샘플 코드
// BaseSDK 초기화 완료 콜백 안에서 호출 (기존 구 API)
Stove::PCSDK::Base::StovePCGds gds;
auto result = Stove::PCSDK::Base::Base_GetGds(&gds);
if (result.IsSuccessful())
{
const wchar_t* nation = gds.GetNation();
const wchar_t* language = gds.GetLanguage();
// 국가/언어에 따른 분기 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요. (에러 코드별 처리 참고)
}
플랫폼 표시 언어변경
모바일
사전 준비
- SDK 초기화 완료 이후에 호출해요.
- 지원 언어는 총 10개이며,
Language.System을 전달하면 디바이스 설정 언어를 따라요. - 지원하지 않는 언어로 설정을 시도하면 디폴트 언어인 영어(English)로 노출돼요.
개발 흐름
- 게임 내 언어 설정이 변경되거나, 게임 시작 시 이용자 언어를 적용할 때
Localization.setLanguage(...)를 호출해요. - 명시적 언어로 변경하려면 원하는
Language값을 인자로 전달해요. (예:Language.English) - 디바이스 언어로 되돌리려면
Language.System을 전달해요. (게임에서 별도로 언어를 지정하지 않거나 초기화 상태로 돌리고 싶을 때 사용)
트러블슈팅
에러 반환 없음Localization.setLanguage는 로컬 저장(SharedPreferences/UserDefaults)만 수행하므로 항상 성공해요. 잘못된 enum 값은 컴파일 단계에서 차단되어 런타임 에러 코드가 없어요.
| 상황 | 원인 | 조치 |
|---|---|---|
| 앱 재시작 후 설정한 언어가 유지되지 않음 | 영속 저장(SharedPreferences/UserDefaults) 권한 문제 또는 앱 데이터 초기화 | 앱 재설치·이용자 데이터 삭제 외에는 거의 발생하지 않아요. 발생 시 디바이스 저장소 권한과 해당 키 접근을 점검하고, 필요하면 게임 시작 직후 다시 한 번 setLanguage를 호출해 동기화하세요. |
| 지정한 언어가 영어로 노출됨 | 전달한 언어가 SDK 지원 10개 외이거나 해당 리소스가 미준비 | SDK 지원 언어 enum(English/Korean/Japanese 등 10종) 안의 값만 전달하세요. 그 외 언어는 자동으로 영어로 폴백돼요. |
Language.System이 의도와 다른 언어로 노출됨 | 디바이스 OS 언어가 SDK 미지원 → 영어 폴백 | 명시적인 언어 노출이 필요하면 Language.System 대신 SDK 지원 enum 값을 직접 전달하세요. 게임에서 별도로 이용자 언어를 선택받는 화면을 두는 것을 권장해요. |
샘플 코드
언어 설정하기
원하는 언어 코드를 전달해 플랫폼 언어를 명시적으로 변경해요.
public void SetLanguage(Localization.Language language)
{
Localization.SetLanguage(language);
}
디바이스 언어로 변경하기
Language.System을 전달해 디바이스 기본 언어를 따르도록 설정해요.
public void SetDefaultLanguage()
{
Localization.SetLanguage(Localization.Language.System);
}
PC (PCSDK)
사전 준비
- BaseSDK 초기화 완료 이후에 호출해요.
- 언어는 enum 또는 문자열(ISO 639-1)로 지정할 수 있어요.
- enum 기반:
Base_SetLanguage(StoveLanguage)— 미리 정의된StoveLanguageenum 값을 전달해요. - 문자열 기반:
Base_SetLanguageEx(C/C++const wchar_t*, C#string) — 게임에서 사용하는 ISO 639-1 언어 코드를 그대로 전달해요.
- enum 기반:
- PCSDK는 12개 언어를 지원해요(system / en / ko / ja / zh-cn / zh-tw / de / fr / es / pt / th / vi).
개발 흐름
- 게임 내 언어 설정이 변경되거나, 게임 시작 시 이용자 언어를 적용할 때 호출해요.
- 문자열(ISO 639-1)로 언어를 지정해
Base_SetLanguageEx를 호출하거나, enum 값으로Base_SetLanguage를 호출해요. - 디바이스 언어로 되돌리려면 문자열
"system"을 전달해요. - 반환된 결과를
IsSuccessful()로 검증해요.
트러블슈팅
| 상황 | 원인 | 해결 방법 |
|---|---|---|
게임 시작 직후 언어 설정 API를 호출했더니 BASE_NOT_INITIALIZED(16)가 반환돼요 | Base_RestartAppIfNecessary는 비동기이며 콜백은 Base_RunCallback 호출 시 디스패치돼요. Base_Initialize(동기)는 해당 콜백의 requiresRestart == false 분기 안에서 호출해야 해요. 이 두 단계가 완료되기 전에 언어 설정을 호출하면 16번 오류가 발생해요. | Base_RestartAppIfNecessary 콜백에서 requiresRestart == false를 확인한 뒤 Base_Initialize를 호출하고, Base_Initialize가 성공한 이후에 언어 설정을 호출해야 해요. 부팅 시퀀스에서 이 순서대로 초기화한 뒤 언어를 적용하면 이후 SDK 메시지가 올바른 언어로 노출되므로 문제없어요. |
이용자 설정 언어 코드를 전달했더니 INVALID_PARAM(5)가 반환돼요 | SDK가 시작 시 스토브 클라우드에서 받아둔 지원 언어 목록에 없는 코드를 명시적으로 넘기면 5번이 반환돼요. (단, "system"으로 호출했을 때 OS 언어가 미지원인 경우는 오류 없이 영어(en)로 자동 폴백돼요.) | 게임 자체 언어 선택 UI를 운영한다면 SDK 지원 언어 코드 문자열 목록에 매핑해 전달해야 해요. 이용자 선호가 없을 때는 "system" 값을 전달해 OS 언어 → 영어 폴백 흐름을 그대로 사용하면 문제없어요. |
| SDK 메시지(셧다운/본인인증/규제 알림 등)가 게임이 설정한 언어와 다르게 노출돼요 | SDK 내부 언어는 다음 순서로 결정돼요. ① BaseSDK 초기화 시 OS 시스템 언어(미지원 시 영어 폴백)로 시작 → ② 런처(스토브 클라이언트)가 토큰과 함께 전달한 언어 값이 도착하면 자동으로 덮어쓰기 → ③ 게임이 언어 설정 API를 호출한 시점부터 그 값이 우선. 게임이 ② 시점 전에 언어를 지정하면 런처 값에 다시 덮여요. | 런처 언어를 따르려면 게임에서 언어 설정 API를 호출하지 않으면 돼요. 게임이 자체 언어를 강제하려면 OnInitializeFinished 성공 콜백을 받은 뒤(런처 값 적용 시점 이후), 그리고 게임 내 언어 변경이 발생할 때마다 언어 설정 API를 호출해야 해요. 두 시점만 지키면 문제없어요. |
언어 폴백·번역 리소스 미준비 동작
언어 설정 API에 "system"을 전달하면 OS 언어를 따라가되, OS 언어가 SDK 미지원이면 자동으로 영어(en)로 폴백돼요. 단, 게임이 직접 미지원 언어 코드를 전달하면 폴백 없이 INVALID_PARAM(5)이 반환돼요.
또한 SDK 시작 시점에 스토브 클라우드에서 받는 번역 리소스에 특정 언어가 미준비된 경우, 해당 언어로 설정돼도 일부 문구가 영어로 출력될 수 있어요. de, fr, es, pt 4개 언어는 v3.4.0에서 추가됐으나 번역이 단계적으로 추가되는 중이라 현재는 일부 문구가 영어로 표시될 수 있어요.
샘플 코드
// enum 기반 (기존 구 API)
auto result = Stove::PCSDK::Base::Base_SetLanguage(Stove::PCSDK::Base::StoveLanguage::ko);
if (result.IsSuccessful())
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// 문자열 기반 (ISO 639-1)
Stove::PCSDK::Base::Base_SetLanguageEx(L"ko");
// 디바이스 언어로 복귀
Stove::PCSDK::Base::Base_SetLanguageEx(L"system");