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 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: "달" 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