From 4404518359e5db76044f92a8753eac424cf35b91 Mon Sep 17 00:00:00 2001 From: developomp Date: Sat, 17 Jun 2023 19:18:46 +0900 Subject: [PATCH] refactor: remove localization Why: - I was doing half-ass job at it in the first place (code-wise) - maintaining sites for more than one locale proved to be more difficult than initially anticipated - having more than one local does not add much value - overall not worth it --- .../generate/recursiveParse/parsePortfolio.ts | 73 ++++------ .../recursiveParse/parseUnsearchable.ts | 18 ++- apps/blog/markdown/portfolio/wbm.kr.md | 29 ---- apps/blog/markdown/unsearchable/about.kr.md | 29 ---- apps/blog/markdown/unsearchable/goals.kr.md | 61 -------- apps/blog/markdown/unsearchable/resume.kr.md | 34 ----- apps/blog/src/App.tsx | 44 +----- .../src/components/Header/Buttons/Buttons.tsx | 2 - .../Header/Buttons/LocaleToggleButton.tsx | 49 ------- .../Header/Buttons/SearchButton.tsx | 10 +- .../Header/Buttons/ThemeToggleButton.tsx | 6 +- apps/blog/src/components/Header/Header.tsx | 7 +- apps/blog/src/components/Header/Nav.tsx | 10 +- apps/blog/src/components/PostCard.tsx | 9 +- apps/blog/src/components/Sidebar/SubMenu.tsx | 15 +- apps/blog/src/data/NavbarData.tsx | 15 +- apps/blog/src/globalContext.tsx | 33 +---- apps/blog/src/pages/Home/Home.tsx | 11 +- apps/blog/src/pages/Home/ShowMoreButton.tsx | 10 +- apps/blog/src/pages/NotFound.tsx | 9 +- apps/blog/src/pages/Page/Page.tsx | 52 +------ .../src/pages/Page/SeriesControlButtons.tsx | 11 +- apps/blog/src/pages/Page/Toc.tsx | 7 +- .../pages/Page/TranslationNotAvailable.tsx | 61 -------- apps/blog/src/pages/Page/helper.ts | 136 ++---------------- apps/blog/src/pages/Portfolio/Portfolio.tsx | 15 +- apps/blog/src/pages/Portfolio/ProjectCard.tsx | 10 +- apps/blog/src/pages/Search/Search.tsx | 18 +-- apps/blog/src/pages/Search/TagSelect.tsx | 3 +- apps/blog/types/types.ts | 3 +- 30 files changed, 99 insertions(+), 691 deletions(-) delete mode 100644 apps/blog/markdown/portfolio/wbm.kr.md delete mode 100644 apps/blog/markdown/unsearchable/about.kr.md delete mode 100644 apps/blog/markdown/unsearchable/goals.kr.md delete mode 100644 apps/blog/markdown/unsearchable/resume.kr.md delete mode 100644 apps/blog/src/components/Header/Buttons/LocaleToggleButton.tsx delete mode 100644 apps/blog/src/pages/Page/TranslationNotAvailable.tsx diff --git a/apps/blog/generate/recursiveParse/parsePortfolio.ts b/apps/blog/generate/recursiveParse/parsePortfolio.ts index ed223c0..181dcc8 100644 --- a/apps/blog/generate/recursiveParse/parsePortfolio.ts +++ b/apps/blog/generate/recursiveParse/parsePortfolio.ts @@ -9,59 +9,36 @@ import { DataToPass } from "." export default function parsePortfolio(data: DataToPass): void { const { urlPath, markdownRaw, markdownData } = data - if (urlPath.endsWith(".kr")) { - const contentID = urlPath.slice(0, urlPath.length - 3) + if (markdownData.badges) { + ;(markdownData.badges as string[]).forEach((slug) => { + // todo: handle cases when icon is not on simple-icons - if (portfolioData.projects[contentID]) { - portfolioData.projects[contentID] = { - ...portfolioData.projects[contentID], - overview_kr: markdownData.overview as string, - } - } else { - portfolioData.projects[contentID] = { - name: "", - image: "", - overview_en: "", - overview_kr: markdownData.overview as string, - badges: [], - repo: "", - } - } - } else { - if (markdownData.badges) { - ;(markdownData.badges as string[]).forEach((slug) => { - // todo: handle cases when icon is not on simple-icons + portfolioData.skills.add(slug) - portfolioData.skills.add(slug) + // eslint-disable-next-line @typescript-eslint/no-var-requires + const icon = require("simple-icons")[slug] - // eslint-disable-next-line @typescript-eslint/no-var-requires - const icon = require("simple-icons")[slug] + const color = tinycolor(icon.hex).lighten(5).desaturate(5) - const color = tinycolor(icon.hex).lighten(5).desaturate(5) + // save svg icon + writeToFile( + `${iconsDirectoryPath}/${icon.slug}.json`, + JSON.stringify({ + svg: icon.svg, + hex: color.toHexString(), + isDark: color.isDark(), + title: icon.title, + }) + ) + }) + } - // save svg icon - writeToFile( - `${iconsDirectoryPath}/${icon.slug}.json`, - JSON.stringify({ - svg: icon.svg, - hex: color.toHexString(), - isDark: color.isDark(), - title: icon.title, - }) - ) - }) - } - - portfolioData.projects[urlPath] = { - name: markdownData.name as string, - image: markdownData.image as string, - overview_en: markdownData.overview as string, - overview_kr: portfolioData.projects[urlPath] - ? portfolioData.projects[urlPath].overview_kr - : "", - badges: (markdownData.badges as string[]) || [], - repo: (markdownData.repo as string) || "", - } + portfolioData.projects[urlPath] = { + name: markdownData.name as string, + image: markdownData.image as string, + overview: markdownData.overview as string, + badges: (markdownData.badges as string[]) || [], + repo: (markdownData.repo as string) || "", } writeToFile( diff --git a/apps/blog/generate/recursiveParse/parseUnsearchable.ts b/apps/blog/generate/recursiveParse/parseUnsearchable.ts index dc455cb..fdbf57a 100644 --- a/apps/blog/generate/recursiveParse/parseUnsearchable.ts +++ b/apps/blog/generate/recursiveParse/parseUnsearchable.ts @@ -10,17 +10,15 @@ export default function parseUnsearchable(data: DataToPass): void { // convert path like /XXX/YYY/ZZZ to /YYY/ZZZ const urlPath = _urlPath.slice(_urlPath.slice(1).indexOf("/") + 1) - if (!urlPath.endsWith(".kr.md")) { - addDocument({ - title: markdownData.title, - body: markdownData.content, - url: urlPath, - }) + addDocument({ + title: markdownData.title, + body: markdownData.content, + url: urlPath, + }) - // Parse data that will be written to map.js - map.unsearchable[urlPath] = { - title: markdownData.title as string, - } + // Parse data that will be written to map.js + map.unsearchable[urlPath] = { + title: markdownData.title as string, } /** diff --git a/apps/blog/markdown/portfolio/wbm.kr.md b/apps/blog/markdown/portfolio/wbm.kr.md deleted file mode 100644 index 011a7e7..0000000 --- a/apps/blog/markdown/portfolio/wbm.kr.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -overview: 유니티 게임을 위한 모드. 인-게임 UI와 OBS 오버레이를 제공. ---- - -## 개요 - -War Brokers Mods, 줄여서 WBM은 게임 [War Brokers](https://warbrokers.io)를 위한 모드입니다. - -## 모드 - -C#으로 만들어졌으며, [BepInEx](https://github.com/BepInEx/BepInEx) 프레임워크를 사용하여 게임의 여러 측면을 패치합니다. - -## OBS 오버레이 - -

- OBS 오버레이 -

- -[OBS 스튜디오](https://github.com/obsproject/obs-studio)를 위한 오버레이. -웹 기술을 이용하여 제작되었습니다 (자바스크립트, CSS, HTML 등). - -## 설치기 - -

- 설치기 -

- -간단한 크로스 플랫폼 설칙 및 업데이트 관리기. -[tauri](https://github.com/tauri-apps/tauri), [rust](https://github.com/rust-lang/rust), [svelte](https://github.com/sveltejs/svelte), 그리고 [tailwind css](https://github.com/tailwindlabs/tailwindcss)를 사용해 만들어졌습니다. diff --git a/apps/blog/markdown/unsearchable/about.kr.md b/apps/blog/markdown/unsearchable/about.kr.md deleted file mode 100644 index 310987a..0000000 --- a/apps/blog/markdown/unsearchable/about.kr.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: 소개 ---- - -## 누구세요? - -이름: 김지민
-거주지: 서울, 대한만국
-출생: 2002년
-MBTI: [논리적인 사색가 INTP-A](https://www.16personalities.com/ko/성격유형-intp) - -

- MBTI result - 2023년 1월 2일에 16personalities.com 검사 결과 -

- -## 링크 - -- [깃허브](https://github.com/developomp) -- [목표](/goals) - -## 연락 - -아래 기재된 방법 외에 다른 방법으로 연락을 할 시 답변을 드리지 못 할 수 있습니다. - -| 플랫폼 | 아이디 | 답변 시간 | -| --------------------------------: | :----------------------------------: | :-------- | -| [디스코드](https://discord.com) | developomp#0001 (501277805540147220) | 즉각 | -| [지메일](https://mail.google.com) | developomp@gmail.com | 2~4일 | diff --git a/apps/blog/markdown/unsearchable/goals.kr.md b/apps/blog/markdown/unsearchable/goals.kr.md deleted file mode 100644 index 3b68f5c..0000000 --- a/apps/blog/markdown/unsearchable/goals.kr.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: 목표 ---- - -## 프로그래밍 - -- 깃허브에서 별 X개 얻기 (본인 미포함) - - [x] 10 - - [ ] 50 - - [ ] 100 - - [ ] 500 - - [ ] 1,000 -- 깃허브에서 1년에 X개의 기여하기 (1월 1일 ~ 12월 31일) - - [x] 1000 ([2021](https://github.com/developomp?tab=overview&from=2021-12-01&to=2021-12-31)) - - [x] 2000 ([2022](https://github.com/developomp?tab=overview&from=2022-12-01&to=2022-12-31)) - - [ ] 3000 -- 알고리즘 문제풀이 ([solved.ac](https://solved.ac)) - - 모든 X 문제 풀기 - - [x] [브론즈 V](https://solved.ac/problems/level/1) - - [ ] [브론즈 IV](https://solved.ac/problems/level/2) - - X티어 달성하기 - - [x] 브론즈 - - [x] 실버 - - [x] 골드 (현재 골드 IV) - - [ ] 플래티넘 - - [ ] 다이아 - - ~~루비~~ - - X자리수 랭킹 달성하기 - - [ ] 4 - - [ ] 3 - -## 기술 - -- 분당 X타 치기 (규칙): 일분동안 타자를 친 후 맞은 타의 개수를 센다. 테스트는 [10fastfingers.com](https://10fastfingers.com/typing-test)를 통해 진행한다. 타자 속도는 일관성이 있어야 하며 요구시 같은 결과를 낼 수 있어야 한다.) - - 한국어 - - [x] 100 - - [x] 150 - - [x] 200 - - [ ] 250 - - [ ] 300 - - 영어 - - [x] 100 - - [x] 150 - - [x] 200 - - [x] 250 - - [ ] 300 -- [x] 키보드 안보고 타자치기 - -## Etc - -- [ ] 유튜브에 만족할만한 퀄리티의 100만 조회수 이상의 영상 올리기 -- [ ] 취직 - - [ ] FAANG (또는 이에 준하는) 기업에 취직 -- [ ] 집 구매 -- [ ] 기술적 특이점 목격하기 -- [ ] 달에 가기 -- X번째 생일 축하하기 - - [x] 15 - - [x] 20 - - [ ] 25 - - [ ] 30 diff --git a/apps/blog/markdown/unsearchable/resume.kr.md b/apps/blog/markdown/unsearchable/resume.kr.md deleted file mode 100644 index 89166c7..0000000 --- a/apps/blog/markdown/unsearchable/resume.kr.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: 이력서 ---- - -## 김지민 - -[![깃허브](https://img.shields.io/badge/깃허브-black?style=for-the-badge&logo=github)](https://github.com/developomp) -[![포트폴리오](https://img.shields.io/badge/포트폴리오-grey?style=for-the-badge)](/portfolio) - -프론트엔드 엔지니어 지망생 - -무엇이든지 직접 만들어보아야 직성이 풀리고 궁금한 것이 있으면 나사 하나, -전선 하나까지 뜯어서 원리를 이해하기 전까지 만족할 줄 모르는 천성 개발자 김지민입니다. - -특징: - -- [아치 리눅스](https://archlinux.org)를 사용중 ([깃허브](https://github.com/developomp/setup)) -- 한국어와 영어를 원어민 수준으로 구사 할 수 있음 - -이메일: developomp@gmail.com - -## 교육 - -### [홍익대학교](https://wwwce.hongik.ac.kr) 컴퓨터공학과 - -- 2022년 3월 - 현재 - -## 깃허브 - -github metrics - -## 기술 - -programming skills diff --git a/apps/blog/src/App.tsx b/apps/blog/src/App.tsx index 69c4a25..ba45e95 100644 --- a/apps/blog/src/App.tsx +++ b/apps/blog/src/App.tsx @@ -2,7 +2,7 @@ import darkTheme from "@developomp-site/theme/dist/dark.json" import lightTheme from "@developomp-site/theme/dist/light.json" import { useContext, useEffect, useState } from "react" -import { Routes, Route, useNavigate, useLocation } from "react-router-dom" +import { Routes, Route } from "react-router-dom" import styled, { ThemeProvider } from "styled-components" import { Helmet } from "react-helmet-async" import { isIE } from "react-device-detect" @@ -37,18 +37,9 @@ const StyledContentContainer = styled.div` export default function App() { const { globalState } = useContext(globalContext) - const { locale } = globalState - - const navigate = useNavigate() - const { pathname } = useLocation() const [isLoading, setIsLoading] = useState(true) - // update url on locale change - useEffect(() => { - navigate(locale + pathname.slice(3)) - }, [locale]) - useEffect(() => { // set loading to false if all fonts are loaded // checks if document.fonts.onloadingdone is supported on the browser @@ -59,10 +50,6 @@ export default function App() { } else { setIsLoading(false) } - - // automatically add locale prefix if it's not specified - if (!pathname.startsWith("/en") && !pathname.startsWith("/kr")) - navigate(`/${globalState.locale}${pathname}`) }, []) if (isIE) @@ -93,29 +80,12 @@ export default function App() { ) : ( - {/* - Using this ugly code because the developers of react-router-dom decided that - removing regex support was a good idea. - https://github.com/remix-run/react-router/issues/7285 - */} - - - } /> - } /> - } /> - } /> - } /> - } /> - - - - } /> - } /> - } /> - } /> - } /> - } /> - + } /> + } /> + } /> + } /> + } /> + } /> )} diff --git a/apps/blog/src/components/Header/Buttons/Buttons.tsx b/apps/blog/src/components/Header/Buttons/Buttons.tsx index 0dc9020..e8487a4 100644 --- a/apps/blog/src/components/Header/Buttons/Buttons.tsx +++ b/apps/blog/src/components/Header/Buttons/Buttons.tsx @@ -1,6 +1,5 @@ import styled from "styled-components" -import LocaleToggleButton from "./LocaleToggleButton" import ThemeToggleButton from "./ThemeToggleButton" import SearchButton from "./SearchButton" @@ -13,7 +12,6 @@ const RightButtons = styled.div` export default () => { return ( - diff --git a/apps/blog/src/components/Header/Buttons/LocaleToggleButton.tsx b/apps/blog/src/components/Header/Buttons/LocaleToggleButton.tsx deleted file mode 100644 index dd39304..0000000 --- a/apps/blog/src/components/Header/Buttons/LocaleToggleButton.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import type { SiteLocale } from "../../../globalContext" - -import { useContext } from "react" -import styled from "styled-components" -import ReactTooltip from "react-tooltip" - -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" -import { faLanguage } from "@fortawesome/free-solid-svg-icons" - -import { ActionsEnum, globalContext } from "../../../globalContext" -import { HeaderButtonCSS } from "../HeaderButton" - -interface Props { - locale: SiteLocale -} - -const LocaleToggleButton = styled.button` - ${HeaderButtonCSS} - - border: none; - width: 72px; - - ${(props) => (props.locale == "en" ? "" : "transform: scaleX(-1);")}; -` - -export default () => { - const { globalState, dispatch } = useContext(globalContext) - - return ( - <> - { - dispatch({ - type: ActionsEnum.UPDATE_LOCALE, - payload: globalState.locale == "en" ? "kr" : "en", - }) - }} - locale={globalState.locale} - > - - - - {globalState.locale == "en" ? "English" : "한국어"} - - - ) -} diff --git a/apps/blog/src/components/Header/Buttons/SearchButton.tsx b/apps/blog/src/components/Header/Buttons/SearchButton.tsx index f522884..1b27225 100644 --- a/apps/blog/src/components/Header/Buttons/SearchButton.tsx +++ b/apps/blog/src/components/Header/Buttons/SearchButton.tsx @@ -1,4 +1,3 @@ -import { useContext } from "react" import { Link } from "react-router-dom" import ReactTooltip from "react-tooltip" @@ -6,23 +5,18 @@ import HeaderButton from "../HeaderButton" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" import { faSearch } from "@fortawesome/free-solid-svg-icons" -import { globalContext } from "../../../globalContext" - const SearchButton = () => { - const { globalState } = useContext(globalContext) - const { locale } = globalState - return ( <>
- +
- {locale == "en" ? "Search" : "검색"} + Search ) diff --git a/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx b/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx index f1f726f..d969de8 100644 --- a/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx +++ b/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx @@ -40,11 +40,7 @@ const ThemeToggleButton = () => { {!isMobile && ( - {globalState.locale == "en" ? ( - Using {theme} theme - ) : ( - {theme == "dark" ? "어두운" : "밝은"} 테마 사용중 - )} + Using {theme} theme )} diff --git a/apps/blog/src/components/Header/Header.tsx b/apps/blog/src/components/Header/Header.tsx index 199c882..286cdbb 100644 --- a/apps/blog/src/components/Header/Header.tsx +++ b/apps/blog/src/components/Header/Header.tsx @@ -1,4 +1,3 @@ -import { useContext } from "react" import { Link } from "react-router-dom" import styled from "styled-components" import ReadProgress from "./ReadProgress" @@ -7,7 +6,6 @@ import Nav from "./Nav" import Sidebar from "../Sidebar" -import { globalContext } from "../../globalContext" import Buttons from "./Buttons" const Header = styled.header` @@ -44,13 +42,10 @@ const Icon = styled.img` ` export default () => { - const { globalState } = useContext(globalContext) - const { locale } = globalState - return (
- +