Development record of developer who study hard everyday.

레이블이 안드로이드현지화인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드현지화인 게시물을 표시합니다. 모든 게시물 표시
, , , , ,

안드로이드 다국어 처리 지원 localization 현지화 쉽게 하는 방법

안드로이드 다국어 지원 쉽게하는 방법

안드로이드 블로그

회사에서 유지보수하는 앱이 있는데 다국어 지원을 원한다고했다.

내가 처음 볼 때의 소스는 영어와 한국어만 현지화가된 상황이였는데 이번에 일본어와 중국어가 추가되었다.

우선 strings.xml 파일에 필요한 key값을 엑셀파일에 정리해서 주었고 거기에 해당하는 값(일본어, 중국어)를 고객사가 정리해서 엑셀파일로 주었다.

약간의 내용만 보여자면....

고객사가 준 엑셀파일

이런 상황이였다.

쉽게 생각하면 노가다를 뛰면 되는데....

정말 그것밖에 답이 없을까 싶었다.

그래서 평소에 활동하던 단체채팅방에서 질문을 던졌다.

그랬더니 한 시니어 개발자가 아주 명쾌한 답을 주었다.


1. 노가다를 뛰는건 정확도나 효율면에서 안좋은 방법이다.

2. 구글 스프레드 시트로 번역내용을 관리하고 번역을 맡은 사람에게만 특정 셀에 권한을 준다.

3. 스프레드 시트를 크롤링해서 배치파일로 나에게 필요한 strings.xml 파일을 만든다.


처음에 이 답을 들었을 때는 매우 난감했다.

특히, 배치파일을 어떻게 만들지? 하는 생각이 들었다.

그래서 좀 고민하다가 그냥 인텔리제이로 JAVA 프로젝트를 만들어서 strings.xml 파일에 맞는 형식으로 값을 출력해보자 라고 생각했다.

지금부터, 그 과정을 천천히 설명해보겠다.

1. 인텔리제이에서 Gradle 프로젝트 만들기

인텔리제이 그래들 프로젝트 만들기

☝ 그래들 프로젝트를 만들자 언어는 자바를 활용한다.

인텔리제이 그래들 프로젝트 만들기2

☝ 프로젝트 제목을 정한다.


2. apache poi 라이브러리 추가

dependencies {
implementation 'org.apache.poi:poi-ooxml:4.1.2'
}

엑셀을 크롤링할 때 필요한 apache의 poi 라이브러리를 추가한다.

추가하고 그래들 새로고침을 꼭 해준다.


3. JAVA 클래스 만들기

JAVA 클래스 만들기

☝ 자바 클래스를 만들어준다.

4. 크롤링 코드 작성

public class MakeLocalization {
public static void main(String[] args) {

//엑셀파일의 경로 지정해서 파일 읽기
try {  
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\N\\AndroidStudioProjects\\20230116_Localizable_Android.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);

XSSFSheet sheet = workbook.getSheetAt(0); //0번째 시트지
     int rows = sheet.getPhysicalNumberOfRows(); //행의 수
                 //파일 쓰기 위치 정하기
     File localizationFile = new File("C:\\Users\\N\\AndroidStudioProjects\\android_localization.txt");
//byte로 파일 쓰기 준비
     if(!localizationFile.exists()) localizationFile.createNewFile();
FileOutputStream fos = new FileOutputStream(localizationFile, true);


for(int r = 1; r < rows; r++) {
//전체 행 훑기
XSSFRow row = sheet.getRow(r)
;

if(row != null) {
//행이 비어있지 않을 때
         //1열은 key, 2열은 value값(나는 엑셀파일의 2열에 내가 필요한 언어를 배치했다.)
           String content1 = "";    //키값

XSSFCell cell1 = row.getCell(1);
if(cell1 == null) {
continue;
} else {
switch (cell1.getCellType()) {    //타입 별로 값 얻어서 String 타입으로 저장
case NUMERIC :
content1 = cell1.getNumericCellValue() +
"";
break;
case STRING :
content1 = cell1.getStringCellValue() +
"";
break;
case BLANK :
content1 = cell1.getBooleanCellValue() +
"";
break;
case ERROR :
content1 = cell1.getErrorCellValue() +
"";
break;
}
}

String content2 =
"";    //value 값

XSSFCell cell2 = row.getCell(2);
if(cell2 == null) {
continue;
} else {
switch (cell2.getCellType()) {    //타입별로 값 얻어서 String 타입으로 저장
case NUMERIC :
content2 = cell2.getNumericCellValue() +
"";
break;
case STRING :
content2 = cell2.getStringCellValue() +
"";
break;
case BLANK :
content2 = cell2.getBooleanCellValue() +
"";
break;
case ERROR :
content2 = cell2.getErrorCellValue() +
"";
break;
}
}
//

if(content2.endsWith("\n")) {    //번역하시는 분이 실수로 엔터를 치는 경우가 있어서...
content2 = content2.replaceAll(
"\n$", "");
}

//byte로 파일 쓰기(이모지 값이 있어가지구 byte로 쓰기로했다.)
         String resultContent = "<string name=\"" + content1 +"\">" + content2 + "</string>\n";
fos.write(resultContent.getBytes(StandardCharsets.UTF_16));

// System.out.println(r + " row " + 1 + " colum value is " + content1 + " 2 colum value is " + content2);
}
}
//byte로 파일쓰기 종료
      fos.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace()
;
} catch (IOException e2) {
e2.printStackTrace()
;
}


}
}

☝ 자세한 내용은 주석을 참고하기 바란다.


이렇게하면 내가 정한 경로에 텍스트 파일이 하나 생기는데......

대략 아래처럼 나온다.

엑셀 크롤링 최종 파일

이제 이 값을 전체 복사해서 안드로이드 스튜디오 strings.xml 파일에 붙여넣기하면 된다. 

ㅋㅋㅋ


5. 중국어 strings.xml 파일 만들기

다국어 strings.xml 파일 만들기

☝ strings.xml 파일클릭후 마우스 오른쪽 버튼 클릭 - open translation editor 클릭

중국어 strings.xml 파일 만들기

☝ 지구 아이콘 클릭 - 중국어 클릭


중국어 strings.xml 파일 완성

☝ 중국어 strings.xml 파일이 만들어졌다.

strings.xml 중국어 파일에 크롤링한 내용를 붙여넣으면 끝이다;;

너무 간단하다......


다국어 지원에 스트레스 받지말고 개발자답게 똑똑하게 해결하자!!

Share:
Read More