From 3d85c01c59c5adb59d90073f1da40dca63df717b Mon Sep 17 00:00:00 2001 From: minwook shin Date: Tue, 19 Jan 2016 19:02:58 +0900 Subject: [PATCH 1/3] My second ko translation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This has translated this means. 265 : Holy smokes -> Surprise [놀라다] --- app/locale/ko.coffee | 108 +++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee index f2c082446..c17323a56 100644 --- a/app/locale/ko.coffee +++ b/app/locale/ko.coffee @@ -4,20 +4,20 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t no_ie: "죄송하지만 코드컴뱃은 인터넷 익스플로러 8에서는 동작하지 않습니다." # Warning that only shows up in IE8 and older no_mobile: "코드 컴뱃은 모바일 기기용으로 제작되지 않았습니다. 아마 동작하지 않을 가능성이 높습니다." # Warning that shows up on mobile devices play: "시작" # The big play button that opens up the campaign view. -# play_campaign_version: "Play Campaign Version" # Shows up under big play button if you only play /courses + play_campaign_version: "캠페인 버전 플레이" # Shows up under big play button if you only play /courses old_browser: "브라우저가 너무 오래된 버전이라 코드 컴뱃을 실행할 수 없습니다." # Warning that shows up on really old Firefox/Chrome/Safari old_browser_suffix: "시도해볼 수는 있겠지만..안될 수도 있습니다." -# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval." + ipad_browser: "슬픈 소식: 코드컴뱃은 아이패드의 브라우저에서 구동되지않습니다. 좋은 소식: 우리의 아이패드 앱은 애플의 승인을 기다리고있습니다 ." campaign: "캠페인" for_beginners: "초보자용" multiplayer: "멀티플레이어" # Not currently shown on home page for_developers: "개발자용" # Not currently shown on home page. -# or_ipad: "Or download for iPad" + or_ipad: "또는 아이패드의 다운로드" nav: play: "레벨" # The top nav bar entry where players choose which levels to play community: "커뮤니티" -# courses: "Courses" + courses: "코스" editor: "에디터" blog: "블로그" forum: "포럼" @@ -33,7 +33,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t contact: "문의" twitter_follow: "팔로우" teachers: "선생님들" -# careers: "Careers" + careers: "채용" modal: close: "닫기" @@ -52,7 +52,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t play: play_as: "Play As " # Ladder page -# compete: "Compete!" # Course details page + compete: "경쟁!" # Course details page spectate: "관중모드" # Ladder page players: "플레이어" # Hover over a level on /play hours_played: "플레이한 시간" # Hover over a level on /play @@ -68,14 +68,14 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t achievements: "성취한 목표" # Tooltip on achievement list button from /play account: "계정" # Tooltip on account button from /play settings: "설정" # Tooltip on settings button from /play -# poll: "Poll" # Tooltip on poll button from /play + poll: "투표" # Tooltip on poll button from /play next: "다음" # Go from choose hero to choose inventory before playing a level change_hero: "영웅 교체" # Go back from choose inventory to choose hero buy_gems: "젬 구매" -# subscription_required: "Subscription Required" + subscription_required: "가입 필수" anonymous: "이름없는 플레이어" level_difficulty: "난이도: " -# play_classroom_version: "Play Classroom Version" # Choose a level in campaign version that you also can play in one of your courses + play_classroom_version: "교실 버전 플레이" # Choose a level in campaign version that you also can play in one of your courses campaign_beginner: "초보자 캠페인" awaiting_levels_adventurer_prefix: "매주 마다 새로운 레벨이 생깁니다." awaiting_levels_adventurer: "모험자로 등록 하세요!" @@ -83,16 +83,16 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t adjust_volume: "소리 조절" campaign_multiplayer: "멀티 플레이어 전투장" campaign_multiplayer_description: "... 이곳에서 당신은 다른 인간 플레이어들과 직접 결투할 수 있습니다." -# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" -# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." + campaign_old_multiplayer: "(추천하지 않습니다) 숙련된 멀티플레이어 경쟁" + campaign_old_multiplayer_description: "더 문명화 된 시대의 유물. 어떤 시뮬레이션은 이러한 이전, 영웅없는 멀티 경기장에 대해 실행되지 않습니다." share_progress_modal: -# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat." + blurb: "당신은 큰 진전을 보이고있습니다! 당신이 코드컴뱃으로 얼마나 많이 배웠는지 부모님게 말하십시오." email_invalid: "이메일 주소가 올바르지 않습니다." -# form_blurb: "Enter your parent's email below and we’ll show them!" + form_blurb: "아래에 부모님의 이메일을 입력하고 우리는 그것들을 보여줍니다!" form_label: "이메일" placeholder: "이메일" -# title: "Excellent Work, Apprentice" + title: "우수한, 초심자" login: sign_up: "계정 생성" @@ -100,8 +100,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t logging_in: "로그인 중" log_out: "로그아웃" forgot_password: "비밀번호를 잊으셨나요?" -# authenticate_gplus: "Authenticate G+" -# load_profile: "Load G+ Profile" + authenticate_gplus: "G+ 인증" + load_profile: "G+ 프로필 불러오기" finishing: "완료중.." sign_in_with_facebook: "Facebook으로 로그인" sign_in_with_gplus: "G+로 로그인" @@ -114,9 +114,9 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t log_in: "비밀번호로 로그인" required: "진행하기 전에 로그인이 필요합니다." login_switch: "이미 계정이 있으신가요?" -# school_name: "School Name and City" -# optional: "optional" -# school_name_placeholder: "Example High School, Springfield, IL" + school_name: "학교 이름과 도시" + optional: "옵션" + school_name_placeholder: "예시 고등학교, 스프링필드, IL" recover: recover_account_title: "계정 복구" @@ -166,18 +166,18 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t withdrawn: "취소됨" accept: "승인" reject: "보류" -# withdraw: "Withdraw" + withdraw: "철수" submitter: "제출자" submitted: "제출됨" commit_msg: "커밋 메세지" version_history: "버전 히스토리" version_history_for: "버전 히스토리 : " -# select_changes: "Select two changes below to see the difference." -# undo_prefix: "Undo" + select_changes: "차이를 보기위해 두 가지 사항을 변경하도록 선택합니다." + undo_prefix: "되돌리기" undo_shortcut: "(Ctrl+Z)" -# redo_prefix: "Redo" + redo_prefix: "다시하기" redo_shortcut: "(Ctrl+Shift+Z)" -# play_preview: "Play preview of current level" + play_preview: "현재 수준의 미리보기 재생" result: "결과" results: "결과들" description: "설명" @@ -221,8 +221,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t years: "년" play_level: -# completed_level: "Completed Level:" -# course: "Course:" + completed_level: "완료된 레벨:" + course: "코스:" done: "완료" next_level: "다음 레벨:" next_game: "다음 게임" @@ -256,26 +256,26 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t victory_saving_progress: "저장하기" victory_go_home: "홈으로" victory_review: "리뷰를 남겨주세요" -# victory_review_placeholder: "How was the level?" + victory_review_placeholder: "어떤 레벨입니까?" victory_hour_of_code_done: "정말 종료합니까?" victory_hour_of_code_done_yes: "네 내 Hour of Code™ 완료했습니다!" victory_experience_gained: "획득한 경험치" victory_gems_gained: "획득한 젬" victory_new_item: "새로운 아이템" -# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." + victory_viking_code_school: "놀랍습니다, 당신은 그냥 이길 힘든 수준이었습니다! 이미 소프트웨어 개발자가 아닌 경우, 당신은 비이킹 코드 학교에서 빠르게 이해할것입니다, 당신이 다음 레벨에서 자신의 능력을 14주 동안 전문 웹 개발자가 될 수있는 곳입니다." victory_become_a_viking: "바이킹이 되세요" guide_title: "가이드" tome_cast_button_run: "실행" tome_cast_button_running: "실행중" -# tome_cast_button_ran: "Ran" -# tome_submit_button: "Submit" -# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button. -# tome_select_method: "Select a Method" -# tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methods). + tome_cast_button_ran: "실행됨" + tome_submit_button: "적용" + tome_reload_method: "이 방법에 대한 원래의 코드를 다시불러오기" # Title text for individual method reload button. + tome_select_method: "방법 선택" + tome_see_all_methods: "편집 할 수있는 모든 방법을 참조하십시오" # Title text for method list selector (shown when there are multiple programmable methods). tome_select_a_thang: "누군가를 선택하세요. " tome_available_spells: "사용 가능한 마법" tome_your_skills: "당신의 스킬" -# tome_current_method: "Current Method" + tome_current_method: "최근 방법" code_saved: "코드가 저장됨" skip_tutorial: "넘기기 (esc)" keyboard_shortcuts: "단축키" @@ -284,12 +284,12 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t problem_alert_title: "코드를 수정하세요" time_current: "현재:" time_total: "최대:" -# time_goto: "Go to:" -# non_user_code_problem_title: "Unable to Load Level" -# infinite_loop_title: "Infinite Loop Detected" -# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." -# check_dev_console: "You can also open the developer console to see what might be going wrong." -# check_dev_console_link: "(instructions)" + time_goto: "가기:" + non_user_code_problem_title: "레벨을 로드 할 수 없습니다" + infinite_loop_title: "무한 루프 감지" + infinite_loop_description: "세계를 구축하는 초기 코드는 결코 실행이 완료되지 않습니다. 아마도 하나의 정말 느리거나 또는 무한 루프가 있습니다. 혹은 버그일수있습니다. 당신은 다시 이 코드를 실행하려고하거나 기본 상태로 코드를 재설정 할 수 있습니다. 그게 해결되지 않으면, 저희에게 알려 주시기 바랍니다." + check_dev_console: "또한 잘못 갈 수를 알기 위해 개발자 콘솔을 열 수 있습니다." + check_dev_console_link: "(명령어)" infinite_loop_try_again: "다시 시도해보세요." infinite_loop_reset_level: "레벨 리셋" infinite_loop_comment_out: "내 코드를 일시적 주석처리하기" @@ -297,7 +297,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t tip_scrub_shortcut: "Ctrl+[, Ctrl+] 를 이용해 실행 속도를 빠르게 할 수 있어요" tip_guide_exists: "화면 상단의 가이드를 클릭해보세요. 유용한 정보를 얻을 수 있습니다." tip_open_source: "코드 컴뱃은 100% 오픈 소스 기반입니다!" -# tip_tell_friends: "Enjoying CodeCombat? Tell your friends about us!" + tip_tell_friends: "코드 컴뱃을 즐기셨나요? 친구에게 알려주십시오" tip_beta_launch: "코드 컴뱃은 2013년 10월에 베타 서비스를 출시했습니다." tip_think_solution: "해결 방법을 고민해보세요, 문제를 고민하지 말구요" # tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra" @@ -326,7 +326,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # tip_extrapolation: "There are only two kinds of people: those that can extrapolate from incomplete data..." # tip_superpower: "Coding is the closest thing we have to a superpower." # tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds" -# tip_no_code: "No code is faster than no code." + tip_no_code: "코드가 없는것보다 빠른것은 없습니다." tip_code_never_lies: "코드는 절대로 거짓말을 하지 않는다. 주석은 가끔 하지만. — Ron Jeffries" # tip_reusable_software: "Before software can be reusable it first has to be usable." # tip_optimization_operator: "Every language has an optimization operator. In most languages that operator is ‘//’" @@ -341,8 +341,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # tip_recurse: "To iterate is human, to recurse divine. - L. Peter Deutsch" # tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus" # tip_strong_opponents: "Even the strongest of opponents always has a weakness. - Itachi Uchiha" -# tip_paper_and_pen: "Before you start coding, you can always plan with a sheet of paper and a pen." -# tip_solve_then_write: "First, solve the problem. Then, write the code. - John Johnson" + tip_paper_and_pen: "코딩을 하기전에, 당신은 항상 종이와 펜으로 계획을 지니고 있어야합니다." + tip_solve_then_write: "먼저, 문제를 해결하세요. 그러고, 코드를 쓰는겁니다. - John Johnson" game_menu: inventory_tab: "인벤토리" @@ -355,22 +355,22 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t auth_tab: "가입하기" inventory_caption: "장비 장착" choose_hero_caption: "영웅 및 언어 선택 " -# save_load_caption: "... and view history" + save_load_caption: "... 그리고 기록보기" options_caption: "설정들을 바꾸기" guide_caption: "문서들과 팁들" multiplayer_caption: "친구들과 플레이 하세요!" auth_caption: "진행사항을 저장하세요" leaderboard: -# view_other_solutions: "View Leaderboards" + view_other_solutions: "리더보드 보기" scores: "점수" top_players: "상위 플레이어" day: "오늘" week: "이번 주" -# all: "All-Time" + all: "모든-시간" time: "시간" -# damage_taken: "Damage Taken" -# damage_dealt: "Damage Dealt" + damage_taken: "데미지 정도" + damage_dealt: "죽음을 맞은 데미지" difficulty: "난이도" gold_collected: "수집된 골드" @@ -391,11 +391,11 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t pile_gems: "gem 묶음" chest_gems: "gem 상자" purchasing: "구매중..." - declined: "Your card was declined" + declined: "귀하의 카드가 거부되었습니다" retrying: "서버에러, 다시 시도하세요." prompt_title: "gem 부족" prompt_body: "gem이 더 필요하신가요?" - prompt_button: "Enter Shop" + prompt_button: "샵 앤터" recovered: "gem 구매후 브라우져를 새로고침 하세요." price: "x{{gems}} / 한달" @@ -403,10 +403,10 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # comparison_blurb: "Sharpen your skills with a CodeCombat subscription!" # feature1: "110+ basic levels across 4 worlds" # feature2: "10 powerful new heroes with unique skills!" -# feature3: "80+ bonus levels" + feature3: "80+ 보너스 레벨들" # feature4: "{{gems}} bonus gems every month!" -# feature5: "Video tutorials" -# feature6: "Premium email support" + feature5: "영상 튜토리얼" + feature6: "프리미엄 이메일 지원" # feature7: "Private Clans" free: "프리" month: "달" From 51408a94debe9ad9efe90b245e18b0a84186336e Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 19 Jan 2016 16:34:48 -0800 Subject: [PATCH 2/3] Update jasmine for server tests to 2.4.1, fix server focus tests Before if you focused tests, they would bypass the setup "tests" and break. Now the server setup logic is in a beforeEach. --- package.json | 2 +- spec/helpers/helper.js | 91 ++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 5b66726d2..1f3cd320f 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "css-brunch": "^1.7.0", "fs-extra": "^0.26.2", "jade-brunch": "1.7.5", - "jasmine": "^2.3.2", + "jasmine": "^2.4.1", "javascript-brunch": "> 1.0 < 1.8", "karma": "~0.13", "karma-chrome-launcher": "~0.1.2", diff --git a/spec/helpers/helper.js b/spec/helpers/helper.js index 4ad741bb7..7184ad9c3 100644 --- a/spec/helpers/helper.js +++ b/spec/helpers/helper.js @@ -38,43 +38,58 @@ if (database.generateMongoConnectionString() !== dbString) { jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 120; // for long Stripe tests -describe('Server Test Helper', function() { - it('starts the test server', function(done) { - var server = require('../../server'); - server.startServer(done); +var initialized = false; +beforeEach(function(done) { + if (initialized) { + return done(); + } + + var async = require('async'); + async.series([ + function(cb) { + // Start the server + var server = require('../../server'); + server.startServer(cb); + }, + function(cb) { + // 5. Check actual database + var User = require('../../server/users/User'); + User.find({}).count(function(err, count) { + // For this to serve as a line of defense against testing with the + // production DB, tests must be run with + expect(err).toBeNull(); + expect(count).toBeLessThan(100); + if(err || count >= 100) { + // the only way to be sure we don't keep going with the tests + process.exit(1); + } + GLOBAL.mc.lists.subscribe = _.noop; + cb() + }); + }, + function(cb) { + // Clear db + var mongoose = require('mongoose'); + mongoose.connection.db.command({dropDatabase:1}, function(err, result) { + if (err) { console.log(err); } + cb(err); + }); + }, + function(cb) { + // Initialize products + var request = require('request'); + request.get(getURL('/db/products'), function(err, res, body) { + expect(err).toBe(null); + expect(res.statusCode).toBe(200); + cb(err); + }); + } + ], + function(err) { + if (err) { + process.exit(1); + } + initialized = true; + done(); }); - - it('checks the db is fairly empty', function(done) { - // 5. Check actual database. - var User = require('../../server/users/User'); - User.find({}).count(function(err, count) { - // For this to serve as a line of defense against testing with the - // production DB, tests must be run with - expect(err).toBeNull(); - expect(count).toBeLessThan(100); - if(err || count >= 100) { - // the only way to be sure we don't keep going with the tests - process.exit(1); - } - GLOBAL.mc.lists.subscribe = _.noop; - done() - }); - }); - - it('clears the db', function(done) { - var mongoose = require('mongoose'); - mongoose.connection.db.command({dropDatabase:1}, function(err, result) { - if (err) { console.log(err); } - done(); - }); - }); - - it('initializes products', function(done) { - var request = require('request'); - request.get(getURL('/db/products'), function(err, res, body) { - expect(err).toBe(null); - expect(res.statusCode).toBe(200); - done(); - }); - }) }); \ No newline at end of file From af77dc39b8186c6da87b996df231b701c3206cb4 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Wed, 20 Jan 2016 08:10:01 -0800 Subject: [PATCH 3/3] Logging Facebook auth response for #3110 --- app/core/social-handlers/FacebookHandler.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/app/core/social-handlers/FacebookHandler.coffee b/app/core/social-handlers/FacebookHandler.coffee index 666dad1d3..9252bb151 100644 --- a/app/core/social-handlers/FacebookHandler.coffee +++ b/app/core/social-handlers/FacebookHandler.coffee @@ -42,6 +42,7 @@ module.exports = FacebookHandler = class FacebookHandler extends CocoClass FB.api('/me', {fields: 'email,last_name,first_name,gender'}, @onReceiveMeInfo) onReceiveMeInfo: (r) => + console.log "Got Facebook user info:", r unless r.email console.error('could not get data, since no email provided') return