Skip to content

Commit 403c2cf

Browse files
authored
Merge pull request #103 from entrylabs/develop
2.0.30 버전 업
2 parents 1b626cb + 5937e60 commit 403c2cf

File tree

13 files changed

+213
-84
lines changed

13 files changed

+213
-84
lines changed

build/entryx64.nsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
!define MUI_UNICON "icon.ico"
1414
!define PRODUCT_NAME "Entry"
1515
!define APP_NAME "Entry.exe"
16-
!define PRODUCT_VERSION "2.0.29"
16+
!define PRODUCT_VERSION "2.0.30"
1717
!define PRODUCT_PUBLISHER "EntryLabs"
1818
!define PRODUCT_WEB_SITE "http://www.playentry.org/"
1919

build/entryx86.nsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
!define MUI_UNICON "icon.ico"
1414
!define PRODUCT_NAME "Entry"
1515
!define APP_NAME "Entry.exe"
16-
!define PRODUCT_VERSION "2.0.29"
16+
!define PRODUCT_VERSION "2.0.30"
1717
!define PRODUCT_PUBLISHER "EntryLabs"
1818
!define PRODUCT_WEB_SITE "http://www.playentry.org/"
1919

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"private": true,
33
"productName": "Entry",
44
"name": "entry",
5-
"version": "2.0.29",
5+
"version": "2.0.30",
66
"description": "Entry for offline",
77
"main": "src/main_build/main.bundle.js",
88
"scripts": {
@@ -30,8 +30,8 @@
3030
"async-csv": "^2.1.3",
3131
"axios": "^0.19.2",
3232
"cross-spawn": "^7.0.3",
33-
"entry-hw": "git+https://github.com/entrylabs/entry-hw.git#dist/v1.9.11",
34-
"entry-js": "git+https://github.com/entrylabs/entryjs.git#dist/offline_v2.0.29",
33+
"entry-hw": "git+https://github.com/entrylabs/entry-hw.git#dist/v1.9.12",
34+
"entry-js": "git+https://github.com/entrylabs/entryjs.git#dist/offline_v2.0.30",
3535
"entry-tool": "git+https://github.com/entrylabs/entry-tool.git#v1.20200226.207",
3636
"excel4node": "^1.7.0",
3737
"fs-extra": "^8.1.0",

src/renderer/helper/entry/entryUtils.ts

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ export default class {
1818
static async confirmProjectWillDismiss() {
1919
let confirmProjectDismiss = true;
2020
if (!Entry.stateManager.isSaved()) {
21-
confirmProjectDismiss = await entrylms.confirm(RendererUtils.getLang('Menus.save_dismiss'));
21+
confirmProjectDismiss = await entrylms.confirm(
22+
RendererUtils.getLang('Menus.save_dismiss')
23+
);
2224
}
2325

2426
if (confirmProjectDismiss) {
@@ -58,10 +60,14 @@ export default class {
5860
} else if (project) {
5961
let confirm = false;
6062
try {
61-
confirm =
62-
await entrylms.confirm(
63-
RendererUtils.getLang('Workspace.confirm_load_temporary'),
64-
);
63+
confirm = await entrylms.confirm(
64+
RendererUtils.getLang('Workspace.confirm_load_temporary'),
65+
RendererUtils.getLang('Workspace.confirm_load_header'),
66+
{
67+
positiveButtonText: RendererUtils.getLang('Buttons.yes'),
68+
negativeButtonText: RendererUtils.getLang('Buttons.button_no'),
69+
}
70+
);
6571

6672
if (confirm) {
6773
return project;
@@ -86,7 +92,9 @@ export default class {
8692
*/
8793
static loadSound(sounds: any[] = []) {
8894
sounds.forEach((sound) => {
89-
const path = sound.path || `${Constants.resourceSoundPath(sound.filename)}${sound.filename}${sound.ext}`;
95+
const path =
96+
sound.path ||
97+
`${Constants.resourceSoundPath(sound.filename)}${sound.filename}${sound.ext}`;
9098
Entry.soundQueue.loadFile({
9199
id: sound._id,
92100
src: path,
@@ -113,17 +121,19 @@ export default class {
113121
const objectVariable = getObjectData(script);
114122
objectVariable.objects = [object.toJSON()];
115123

116-
RendererUtils.showSaveDialog({
117-
defaultPath: name,
118-
filters: [{ name: 'Entry object file(.eo)', extensions: ['eo'] }],
119-
}, (filePath) => {
120-
if (filePath) {
121-
IpcRendererHelper.exportObject(filePath, objectVariable)
122-
.then(() => {
124+
RendererUtils.showSaveDialog(
125+
{
126+
defaultPath: name,
127+
filters: [{ name: 'Entry object file(.eo)', extensions: ['eo'] }],
128+
},
129+
(filePath) => {
130+
if (filePath) {
131+
IpcRendererHelper.exportObject(filePath, objectVariable).then(() => {
123132
console.log('object exported successfully');
124133
});
134+
}
125135
}
126-
});
136+
);
127137
}
128138

129139
/**
@@ -178,16 +188,16 @@ export default class {
178188
const croppedImageData = await RendererUtils.cropImageFromCanvas(image);
179189
const imageBuffer = Uint8Array.from(
180190
atob(croppedImageData.replace(/^data:image\/(png|gif|jpeg);base64,/, '')),
181-
(chr) => chr.charCodeAt(0),
191+
(chr) => chr.charCodeAt(0)
182192
);
183193

184194
// 만약 이전 파일명이 존재하는 경우 삭제처리를 위함
185-
file.prevFilename = Entry.container
186-
.getObject(objectId)
187-
.getPicture(id)
188-
.filename;
195+
file.prevFilename = Entry.container.getObject(objectId).getPicture(id).filename;
189196

190-
const newPicture = await IpcRendererHelper.importPictureFromCanvas({ file, image: imageBuffer });
197+
const newPicture = await IpcRendererHelper.importPictureFromCanvas({
198+
file,
199+
image: imageBuffer,
200+
});
191201
// 엔트리에 이미지 추가
192202

193203
if (mode === 'new') {
@@ -228,23 +238,20 @@ export default class {
228238
const filename = entryObject.name || 'nonamed';
229239
const extension = RendererUtils.sanitizeExtension(
230240
entryObject.ext || entryObject.extension,
231-
defaultExtension,
241+
defaultExtension
232242
);
233243

234244
return `${filename}${extension}`;
235245
}
236246

237-
238247
/**
239248
* 엔트리 현재 오브젝트, 블록메뉴의 width 를 저장한다.
240249
* 이는 entryjs 가 알아서 불러서 활용한다.
241250
*/
242251
static saveCurrentWorkspaceInterface() {
243252
if (Entry.type === 'workspace') {
244253
if (localStorage && Entry.interfaceState) {
245-
StorageManager.setWorkspaceInterface(
246-
Entry.captureInterfaceState(),
247-
);
254+
StorageManager.setWorkspaceInterface(Entry.captureInterfaceState());
248255
}
249256
}
250257
}

src/renderer/resources/lang/code.json

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,6 +2067,10 @@
20672067
"show_only_vector": "벡터 모아보기"
20682068
},
20692069
"Menus": {
2070+
"ask_captcha": "아래 이미지를 보이는 대로 입력해주세요.",
2071+
"refresh": "새로고침",
2072+
"check_image_captcha": "이미지로 보기",
2073+
"check_sound_captcha": "음성으로 듣기",
20702074
"nothing_to_import": "불러오기 할 항목이 없습니다.",
20712075
"nothing_to_export": "내려받기 할 항목이 없습니다.",
20722076
"content_copied": "내용이 복사되었습니다.",
@@ -3148,6 +3152,9 @@
31483152
"password_validate_pwd": "패스워드는 5자 이상의 영문/숫자 등을 조합하세요.",
31493153
"password_validate_pwd_length": "패스워드는 최소 5자 이상으로 입력해 주세요.",
31503154
"neoid_username_same_id": "이미 사용중인 아이디 입니다.(NEOID)",
3155+
"captcha_error": "자동입력 방지문자가 올바르지 않습니다.",
3156+
"captcha_try_after_10min": "10분뒤에 다시 시도해주세요",
3157+
"captcha_limit": "새로고침 제한 횟수에 도달했습니다.",
31513158
"insert_same_pwd": "같은 비밀번호를 입력해 주세요.",
31523159
"studying_stage_group": "작품 공유 학급",
31533160
"studying_stage": "작품을 공유하고 싶은 학급을 선택해 주세요.",
@@ -3902,7 +3909,7 @@
39023909
"use_range": "사용범위",
39033910
"offline_desc_free": "엔트리 오프라인은 기업과 개인 모두 제한 없이 무료로 사용하실 수 있습니다.",
39043911
"offline_required": "최소 요구사항",
3905-
"offline_required_detail": "디스크 여유 공간 1GB 이상, windows7 혹은 MAC OS 10.8 이상",
3912+
"offline_required_detail": "디스크 여유 공간 1GB 이상, Windows 8 이상 혹은 macOS 10.8 이상의 운영체제, 디스크 여유 공간 1GB 이상",
39063913
"offline_notice": "설치 전 참고사항",
39073914
"offline_notice_1": "1. 버전",
39083915
"offline_notice_1_1": "에서는 하드웨어 연결 프로그램이 내장되어 있습니다.",
@@ -4448,6 +4455,15 @@
44484455
"banner_default_title_body1": "누구나 쉽고 재밌게 소프트웨어를 배울 수 있어요.",
44494456
"banner_default_title_body2": "지금 바로 시작해보세요!",
44504457
"playsw_banner_title": "소프트웨어야 놀자",
4458+
"rsc2020_banner_head1": "with 엔트리 인공지능",
4459+
"rsc2020_banner_title": "세상을 디자인하는 RSC 2020",
4460+
"rsc2020_banner_body1": "내 아이디어와 인공지능으로",
4461+
"rsc2020_banner_body2": "세상을 행복하게 만들기 프로젝트",
4462+
"playswai_banner_title": "Hello! AI World",
4463+
"playswai_banner_head1": "소프트웨어야 놀자와 함께하는",
4464+
"playswai_banner_head2": "온라인 코딩파티",
4465+
"playswai_banner_body1": "AI 기술을 쉽고 재미있게 배워서",
4466+
"playswai_banner_body2": "엔트리 작품을 만들어 보세요!",
44514467
"playsw_banner_head1": "Play with AI, Play with DATA",
44524468
"playsw_banner_body1": "엔트리에서 인공지능 작품을 더 잘 만들고 싶다면?",
44534469
"playsw_banner_body2": "다양한 인공지능 콘텐츠와 함께 작품을 업그레이드 해보세요!",
@@ -4692,6 +4708,7 @@
46924708
"list_can_not_space": "리스트의 이름은 빈 칸이 될 수 없습니다.",
46934709
"sign_can_not_space": "신호의 이름은 빈 칸이 될 수 없습니다.",
46944710
"variable_can_not_space": "변수의 이름은 빈 칸이 될 수 없습니다.",
4711+
"parameter_can_not_space": "값 블록은 빈 칸이 될 수 없습니다.",
46954712
"training_top_title": "연수 프로그램",
46964713
"training_top_desc": "엔트리 연수 지원 프로그램을 안내해 드립니다.",
46974714
"training_main_title01": "선생님을 위한 강사 연결 프로그램",
@@ -4779,7 +4796,7 @@
47794796
"auth_failed": "인증에 실패하였습니다",
47804797
"birth_year": "태어난 해",
47814798
"birth_year_before_1990": "1990년 이전",
4782-
"edit_personal": "정보수정",
4799+
"edit_personal": "회원 정보 수정",
47834800
"email": "이메일",
47844801
"email_desc": "새 소식이나 정보를 받을 수 있 이메일 주소",
47854802
"email_inuse": "이미 등록된 메일주소 입니다",
@@ -4796,6 +4813,7 @@
47964813
"password_long": "암호는 4~20자 사이의 영문자와 숫자, 특수문자로 입력해 주세요",
47974814
"password_required": "암호는 필수입력 항목입니다",
47984815
"project_list": "작품 조회",
4816+
"my_page": "마이 페이지",
47994817
"regist": "가입 완료",
48004818
"rememberme": "자동 로그인",
48014819
"repeat_password": "암호 확인",
@@ -5087,7 +5105,7 @@
50875105
"list_create_cloud": "공유 리스트로 사용 \n(서버에 저장)",
50885106
"list_create_real_time": "실시간 리스트로 사용\n(서버에 저장)",
50895107
"confirm_quit": "바꾼 내용을 저장하지 않았습니다.",
5090-
"confirm_load_temporary": "저장되지 않은 작품이 있습니다. 여시겠습니까?",
5108+
"confirm_load_temporary": "저장하지 않고 종료한 작품이 있습니다.\n저장하지 않은 작품을 먼저 열까요?",
50915109
"confirm_lesson_recovery_header": "강의 복구",
50925110
"confirm_lesson_recovery": "저장되지 않은 강의가 있습니다. 여시겠습니까?",
50935111
"login_to_save": "로그인후에 저장 바랍니다.",
@@ -5097,6 +5115,7 @@
50975115
"arduino_connect_success": "하드웨어가 연결되었습니다.",
50985116
"confirm_load_header": "작품 복구",
50995117
"uploading_msg": "업로드 중입니다",
5118+
"file_size_exceeded": "<br>변수 또는 리스트의 값이 너무 많아<br>작품을 불러올 수 없어요.",
51005119
"upload_fail_msg": "업로드에 실패하였습니다.</br>다시 한번 시도해주세요.",
51015120
"upload_not_supported_msg": "지원하지 않는 형식입니다.",
51025121
"upload_not_supported_file_msg": "지원하지 않는 형식의 파일입니다.",
@@ -5422,7 +5441,7 @@
54225441
"is_press_some_key": "선택한 키가 눌려져 있는 경우 ‘참’으로 판단합니다.",
54235442
"reach_something": "해당 오브젝트가 선택한 항목과 닿은 경우 ‘참’으로 판단합니다.",
54245443
"is_included_in_list": "선택한 리스트가 입력한 값을 가진 항목을 포함하는 경우 '참'으로 판단합니다.",
5425-
"boolean_basic_operator": "입력한 두 값을 비교합니다.\n= : 왼쪽에 위치한 값과 오른쪽에 위치한 값이 같은 경우 '참'으로 판단합니다.\n> : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 큰 경우 같로 판단합니다.\n< : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 작은 경우 '참'으로 판단합니다.\n≥ : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 크거나 같은 경우 '참'으로 판단합니다.\n≤ : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 작거나 같은 경우 '참'으로 판단합니다.",
5444+
"boolean_basic_operator": "입력한 두 값을 비교합니다.\n= : 왼쪽에 위치한 값과 오른쪽에 위치한 값이 같은 경우 '참'으로 판단합니다.\n!= : 왼쪽에 위치한 값과 오른쪽에 위치한 값이 같지 않은 경우 '참'으로 판단합니다.\n> : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 큰 경우 같로 판단합니다.\n< : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 작은 경우 '참'으로 판단합니다.\n≥ : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 크거나 같은 경우 '참'으로 판단합니다.\n≤ : 왼쪽에 위치한 값이 오른쪽에 위치한 값보다 작거나 같은 경우 '참'으로 판단합니다.",
54265445
"function_create": "자주 쓰는 코드를 이 블록 아래에 조립하여 함수로 만듭니다. [함수 정의하기]의 오른쪽 빈칸에 [이름]을 조립하여 함수의 이름을 정할 수 있습니다. 함수를 실행하는 데 입력값이 필요한 경우 빈칸에 [문자/숫자값], [판단값]을 조립하여 매개변수로 사용합니다.",
54275446
"function_field_label": "함수 정의하기' 블록 안에 조립하며, 함수의 이름을 정합니다. ",
54285447
"function_field_string": "함수 정의하기' 블록 안에 조립하며, 입력한 문자/숫자값(매개변수)에 따라 함수의 실행 결과가 달라집니다. 이 블록을 분리하여 함수의 코드 중 필요한 부분에 넣어 사용합니다.",
@@ -7197,7 +7216,7 @@
71977216
"reach_something_exampleCode": "def when_start():\n while True:\n Entry.move_to_direction(10)\n if Entry.is_touched(\\\"edge\\\"):\n Entry.add_rotation(150)",
71987217
"reach_something_exampleDesc": "[시작하기]버튼을 클릭하면 계속해서 오브젝트가 이동방향으로 10만큼 이동합니다. 만약 오브젝트가 벽에 닿으면 150만큼 회전하게 됩니다.",
71997218
"boolean_basic_operator_desc": "A와 B를 비교하여 True 또는 False로 판단합니다.",
7200-
"boolean_basic_operator_elements": "A, B-- 비교하고자 하는 숫자값<br>① == : A와 B의 값이 같으면 True, 아니면 False<br>② > : A의 값이 B의 값보다 크면 true, 아니면 False<br> < : A의 값이 B의 값보다 작으면 true, 아니면 False<br> >= : A의 값이 B의 값보다 크거나 같으면 true, 아니면 False<br> <= : A의 값이 B의 값보다 작거나 같으면 true, 아니면 False",
7219+
"boolean_basic_operator_elements": "A, B 비교하고자 하는 숫자값<br>① == : A와 B의 값이 같으면 True, 아니면 False<br>② != : A와 B의 값이 다르면 True, 아니면 False<br>③ > : A의 값이 B의 값보다 크면 true, 아니면 False<br> < : A의 값이 B의 값보다 작으면 true, 아니면 False<br> >= : A의 값이 B의 값보다 크거나 같으면 true, 아니면 False<br> <= : A의 값이 B의 값보다 작거나 같으면 true, 아니면 False",
72017220
"boolean_basic_operator_exampleCode": "def when_start():\n while True:\n Entry.add_x(10)\n if Entry.value_of_object(\\\"오브젝트\\\", \\\"x\\\") > 240:\n Entry.set_x(0)",
72027221
"boolean_basic_operator_exampleDesc": "[시작하기]버튼을 클릭하면 계속해서 오브젝트 x좌표를 10만큼 바꿉니다. 만약 오브젝트 x좌표가 240보다 크면 오브젝트 x좌표를 0으로 정합니다.",
72037222
"boolean_and_desc": "A와 B의 판단이 모두 True인 경우 True, 아닌 경우 False로 판단합니다.",

0 commit comments

Comments
 (0)