Add pt and ko locales (#288)

This commit is contained in:
Luke Vella 2022-08-18 10:22:44 +01:00 committed by GitHub
parent f21eaa92cf
commit 4176d8e1a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 416 additions and 2 deletions

View file

@ -3,7 +3,7 @@ const path = require("path");
module.exports = {
i18n: {
defaultLocale: "en",
locales: ["en", "es", "de", "fr", "it", "sv", "pt-BR"],
locales: ["en", "es", "de", "fr", "it", "ko", "sv", "pt", "pt-BR"],
localePath: path.resolve("./public/locales"),
reloadOnPrerender: process.env.NODE_ENV === "development",
},

View file

@ -9,8 +9,10 @@
"german": "German",
"home": "Home",
"italian": "Italian",
"korean": "Korean",
"language": "Language",
"links": "Links",
"portuguese": "Portuguese",
"portugueseBr": "Portuguese (Brazil)",
"poweredBy": "Powered by",
"privacyPolicy": "Privacy Policy",

131
public/locales/ko/app.json Normal file
View file

@ -0,0 +1,131 @@
{
"12h": "12시간제",
"24h": "24시간제",
"addParticipant": "참여자 추가하기",
"addTimeOption": "시간 선택지 추가하기",
"alreadyVoted": "이미 투표하였습니다",
"applyToAllDates": "모든 선택지에 투표하기",
"areYouSure": "확실합니까?",
"back": "뒤로가기",
"calendarHelp": "옵션이 없는 투표는 생성할 수 없습니다. 최소 1개의 옵션을 추가해주세요.",
"calendarHelpTitle": "잊으신게 있나요?",
"cancel": "취소하기",
"comment": "댓글 남기기",
"commentPlaceholder": "이 투표에 댓글 남기기 (모두에게 공개됩니다)",
"comments": "댓글들",
"continue": "계속하기",
"copied": "복사됨",
"copyLink": "링크 복사하기",
"createdBy": "<b>{{name}}</b> 에 의해 생성됨",
"createPoll": "투표 만들기",
"creatingDemo": "데모 투표 만드는 중...",
"delete": "삭제하기",
"deleteComment": "댓글 삭제하기",
"deleteDate": "날짜 삭제하기",
"deletedPoll": "삭제된 투표",
"deletedPollInfo": "이 투표는 더 이상 존재하지 않습니다.",
"deletePoll": "투표 삭제하기",
"deletePollDescription": "이 투표의 모든 데이터가 삭제됩니다. 계속하시려면 <s>“{{confirmText}}”</s> 를 아래 입력창에 입력해주세요.",
"deletingOptionsWarning": "해당 옵션과 참여자들의 투표 내역을 모두 삭제합니다.",
"demoPollNotice": "데모 투표는 하루 뒤에 자동으로 삭제됩니다.",
"description": "설명",
"descriptionPlaceholder": "안녕하세요, 당신이 원하는 날짜를 선택해주세요.",
"donate": "후원하기",
"edit": "수정하기",
"editDetails": "세부정보 수정하기",
"editOptions": "옵션 수정하기",
"email": "이메일",
"emailPlaceholder": "jessie.smith@email.com",
"endingGuestSessionNotice": "비회원 세션이 종료되면 되돌릴 수 없으며 이 세션에서 생성한 투표나 댓글들을 더 이상 수정할 수 없습니다.",
"endSession": "세션 종료하기",
"errorCreate": "투표 만들기에 문제가 생겼어요! 나중에 고칠 수 있도록 준비 중 입니다~!",
"exportToCsv": "CSV로 내보내기",
"finish": "완료하기",
"forgetMe": "세션 지우기",
"goToAdmin": "관리페이지로 이동하기",
"guest": "비회원",
"guestSessionNotice": "당신은 비회원 세션을 이용하고 있으며, 자신의 투표를 나중에 수정할 수 있습니다.",
"guestSessionReadMore": "비회원 세션에 대해 더 알아보기",
"hide": "숨기기",
"ifNeedBe": "꼭 필요하다면",
"linkHasExpired": "링크가 만료되었거나 더 이상 유효하지 않습니다.",
"loading": "불러오는 중...",
"loadingParticipants": "참여자를 불러오는 중...",
"location": "장소",
"locationPlaceholder": "Jeo의 카페",
"lockPoll": "투표 잠그기",
"login": "로그인",
"loginCheckInbox": "메일함을 확인해주세요.",
"loginMagicLinkSent": "매직링크가 다음으로 전송되었습니다.",
"loginSendMagicLink": "매징링크 전송하기",
"loginViaMagicLink": "매직링크로 로그인하기",
"loginViaMagicLinkDescription": "로그인 할 수 있는 매직링크가 담긴 이메일을 전송했습니다.",
"loginWithValidEmail": "올바른 이메일 주소를 입력해주세요.",
"logout": "로그아웃",
"manage": "관리하기",
"menu": "메뉴",
"mixedOptionsDescription": "한 투표에 날짜와 시간이 동일한 옵션을 추가할 수 없습니다. 어떤 옵션을 유지하시겠습니까?",
"mixedOptionsKeepDates": "날짜 옵션 유지하기",
"mixedOptionsKeepTimes": "시간 옵션 유지하기",
"mixedOptionsTitle": "잠시 기다려주세요… 🤔",
"monday": "월요일",
"monthView": "월간 보기",
"name": "이름",
"namePlaceholder": "홍길동",
"new": "신규",
"newPoll": "새 투표",
"next": "다음",
"nextMonth": "다음달",
"no": "안돼요",
"noDatesSelected": "날짜가 선택되지 않았습니다.",
"notificationsDisabled": "알림이 비활성화 되었습니다.",
"notificationsOff": "알림 꺼짐",
"notificationsOn": "알림 켜짐",
"notificationsOnDescription": "이 투표에 업데이트가 생기면 <b>{{email}}</b> 으로 메일이 전송됩니다.",
"notificationsVerifyEmail": "알림을 활성화하려면 이메일을 인증해주세요.",
"noVotes": "이 옵션은 아무도 선택하지 않았습니다.",
"ok": "확인",
"options": "옵션들",
"participant": "참여자",
"participantCount_other": "{{count}} 명의 참여자",
"participantCount": "{{count}} 명의 참여자",
"pollHasBeenLocked": "이 투표는 잠겼습니다.",
"pollHasBeenVerified": "투표가 확인되었습니다.",
"pollOwnerNotice": "안녕하세요 {{name}}, 이 투표의 생성자시군요.",
"pollsEmpty": "생성된 투표가 없습니다.",
"possibleAnswers": "가능한 답변들",
"preferences": "설정",
"previousMonth": "지난달",
"profileLogin": "프로필 - 로그인",
"profileUser": "프로필 - {{username}}",
"requiredNameError": "이름을 입력해주세요.",
"save": "저장하기",
"saveInstruction": "가능여부를 선택한 후 <b>{{save}}</b> 를 클릭하세요",
"share": "공유하기",
"shareDescription": "이 링크를 <b>참여자들</b>에게 전달하여 투표하도록 하세요",
"shareLink": "링크 공유하기",
"specifyTimes": "시간 지정하기",
"specifyTimesDescription": "각 날짜별로 시작시간과 종료시간을 추가합니다.",
"stepSummary": "{{total}} 단계 중 {{current}}",
"sunday": "일요일",
"timeAndDate": "날짜 & 시간",
"timeFormat": "시간 형식:",
"timeZone": "표준시간대:",
"title": "제목",
"titlePlaceholder": "월간 회의",
"today": "오늘",
"unlockPoll": "투표 잠금 해제",
"unverifiedMessage": "인증 링크가 담긴 이메일이 <b>{{email}}</b> 로 전송되었습니다.",
"user": "사용자",
"vote": "투표",
"voteCount_other": "{{count}} 표",
"voteCount": "{{count}} 표",
"weekStartsOn": "한 주의 시작",
"weekView": "주간 보기",
"whatsThis": "이게 뭐죠?",
"yes": "가능해요",
"you": "당신",
"yourDetails": "세부 정보",
"yourName": "이름",
"yourPolls": "당신의 투표"
}

View file

@ -0,0 +1,22 @@
{
"blog": "블로그",
"discussions": "토론",
"donate": "후원",
"english": "영어",
"footerCredit": "만든이 <a>@imlukevella</a>",
"footerSponsor": "이 프로젝트는 유저 후원으로 진행됩니다. <a>후원하기</a> 를 통해 프로젝트를 지원해주세요!",
"french": "프랑스어",
"german": "독일어",
"home": "홈페이지",
"italian": "이탈리아어",
"language": "언어",
"links": "링크",
"portugueseBr": "포르투갈어 (브라질)",
"poweredBy": "기술 지원",
"privacyPolicy": "개인정보 취급방침",
"spanish": "스페인어",
"starOnGithub": "Github에서 좋아요 누르기",
"support": "사용자가이드",
"swedish": "스웨덴어",
"volunteerTranslator": "이 페이지 번역 돕기"
}

View file

@ -0,0 +1,6 @@
{
"notFoundTitle": "404 찾을 수 없음",
"notFoundDescription": "요청한 페이지를 찾을 수 없습니다.",
"goToHome": "홈으로 돌아가기",
"startChat": "채팅 시작하기"
}

View file

@ -0,0 +1,36 @@
{
"3Ls": "맞아요 - <e>L</e> 이 3개에요!",
"adFree": "광고 없음",
"adFreeDescription": "Ad-blocker 는 신경쓰지 마세요 - 여기서는 필요 없을겁니다.",
"comments": "댓글들",
"commentsDescription": "참여자들은 투표에 댓글을 남길 수 있고 댓글들은 모두에게 공개될 것입니다.",
"features": "특징",
"featuresSubheading": "똑똑하게 계획하기",
"follow": "팔로우하기",
"getStarted": "시작하기",
"heroSubText": "빈 틈 없는 최적의 날짜를 찾아보세요",
"heroText": "쉽게 <br/><s>단체 미팅</s><br /> 시간 정하기",
"links": "링크",
"liveDemo": "라이브 데모",
"metaDescription": "최적의 시간이나 날짜를 찾기 위해 투표를 생성하세요. Doodle의 무료 대체제입니다.",
"metaTitle": "Rallly - 단체 미팅 시간 정하기",
"mobileFriendly": "모바일 지원",
"mobileFriendlyDescription": "모바일에서 사용가능하며 참여자들은 어디서든 응답할 수 있습니다.",
"new": "신규",
"noLoginRequired": "로그인은 필요하지 않습니다.",
"noLoginRequiredDescription": "투표를 생성하거나 투표하기 위해 로그인 할 필요가 없습니다.",
"notifications": "알림",
"notificationsDescription": "참여자들의 응답을 지켜봅니다. 당신의 투표에서 일어나는 모든일들에 대해 알림을 받으세요.",
"openSource": "오픈 소스",
"openSourceDescription": "소스코드는 완전히 오픈소스이며. <a>Github</a> 에서 이용 가능합니다.",
"participant": "참여자",
"participantCount_other": "{{count}} 명",
"participantCount": "{{count}} 명",
"perfect": "완벽해요!",
"principles": "원칙",
"principlesSubheading": "우리는 다릅니다",
"selfHostable": "자체 운영 가능",
"selfHostableDescription": "데이터 전체를 제어하기 위해 자신만의 서버를 구축할 수 있습니다.",
"timeSlots": "시간대 설정",
"timeSlotsDescription": "투표를 생성할 때 시작 시간과 끝 시간을 각 날짜별로 설정할 수 있습니다. 각 시간은 참여자들의 표준시간대에 맞춰 자동으로 조절되거나 표준시간대를 완전히 무시하도록 설정할 수 있습니다."
}

131
public/locales/pt/app.json Normal file
View file

@ -0,0 +1,131 @@
{
"12h": "12 Horas",
"24h": "24 Horas",
"addParticipant": "Adicionar participante",
"addTimeOption": "Adicionar opção de horário",
"alreadyVoted": "Já votou nesta sondagem",
"applyToAllDates": "Aplicar a todas as datas",
"areYouSure": "Tem a certeza?",
"back": "Voltar",
"calendarHelp": "Não é possível criar uma sondagem sem opções. Adicionar no mínimo uma opção para continuar.",
"calendarHelpTitle": "Esqueceste algo?",
"cancel": "Cancelar",
"comment": "Comentar",
"commentPlaceholder": "Deixa um comentário nesta sondagem (visível para todos)",
"comments": "Comentários",
"continue": "Continuar",
"copied": "Copiado",
"copyLink": "Copiar link",
"createdBy": "por <b>{{name}}</b>",
"createPoll": "Criar sondagem",
"creatingDemo": "A criar sondagem de demonstração…",
"delete": "Eliminar",
"deleteComment": "Apagar comentário",
"deleteDate": "Apagar data",
"deletedPoll": "Sondagem eliminada",
"deletedPollInfo": "Esta sondagem já não existe.",
"deletePoll": "Apagar sondagem",
"deletePollDescription": "Todos os dados relacionados a esta sondagem serão apagados. Para confirmar, digite <s>“{{confirmText}}</s> na entrada abaixo:",
"deletingOptionsWarning": "Está a apagar opções em que os participantes já votaram. Os votos deles serão também ser apagados.",
"demoPollNotice": "As sondagens de demonstração são excluídas automaticamente após 1 dia",
"description": "Descrição",
"descriptionPlaceholder": "Olá, por favor escolha as datas mais convenientes!",
"donate": "Doar",
"edit": "Editar",
"editDetails": "Editar detalhes",
"editOptions": "Editar opções",
"email": "E-mail",
"emailPlaceholder": "antonio.silva@email.pt",
"endingGuestSessionNotice": "Uma vez que uma sessão de convidado termine, ela não poderá ser retomada. Não poderá editar nenhum voto ou comentário que tenha feito nesta sessão.",
"endSession": "Terminar sessão",
"errorCreate": "Uh oh! Houve um problema ao criar a sondagem. O erro foi registado e tentaremos corrigi-lo.",
"exportToCsv": "Exportar para CSV",
"finish": "Concluir",
"forgetMe": "Esquecer-me",
"goToAdmin": "Ir para Administrador",
"guest": "Convidado",
"guestSessionNotice": "Está a utilizar uma sessão de convidado. Isto permite reconhecê-lo se voltar mais tarde para poder editar os seus votos.",
"guestSessionReadMore": "Leia mais sobre as sessões de convidados.",
"hide": "Esconder",
"ifNeedBe": "Se necessário",
"linkHasExpired": "O seu link expirou ou já não é válido",
"loading": "A carregar…",
"loadingParticipants": "A carregar participantes…",
"location": "Local",
"locationPlaceholder": "Café do Júlio",
"lockPoll": "Bloquear sondagem",
"login": "Iniciar sessão",
"loginCheckInbox": "Por favor, consulte a sua caixa de email.",
"loginMagicLinkSent": "Um link mágico foi enviado para:",
"loginSendMagicLink": "Envie-me um link mágico",
"loginViaMagicLink": "Iniciar sessão via link mágico",
"loginViaMagicLinkDescription": "Enviaremos um e-mail com um link mágico que pode usar para iniciar sessão.",
"loginWithValidEmail": "Por favor, introduza um endereço de email válido",
"logout": "Terminar sessão",
"manage": "Gerir",
"menu": "Menu",
"mixedOptionsDescription": "Não pode ter opções de data e hora iguais na mesma sondagem. Qual gostaria de manter?",
"mixedOptionsKeepDates": "Manter opções de data",
"mixedOptionsKeepTimes": "Manter opções de hora",
"mixedOptionsTitle": "Aguarde um minuto…🤔",
"monday": "Segunda-feira",
"monthView": "Vista mensal",
"name": "Nome",
"namePlaceholder": "António Silva",
"new": "Novo",
"newPoll": "Nova sondagem",
"next": "Seguinte",
"nextMonth": "Mês seguinte",
"no": "Não",
"noDatesSelected": "Nenhuma data selecionada",
"notificationsDisabled": "As notificações foram desativadas",
"notificationsOff": "Notificações desativadas",
"notificationsOn": "Notificações ativadas",
"notificationsOnDescription": "Um e-mail será enviado para <b>{{email}}</b> quando houver atividade nesta sondagem.",
"notificationsVerifyEmail": "Precisa verificar o seu e-mail para ativar as notificações",
"noVotes": "Ninguém votou nesta opção",
"ok": "Ok",
"options": "Opções",
"participant": "Participante",
"participantCount_other": "{{count}} participantes",
"participantCount": "{{count}} participante",
"pollHasBeenLocked": "Esta sondagem foi bloqueada",
"pollHasBeenVerified": "A sondagem foi verificada",
"pollOwnerNotice": "Olá {{name}}, parece que é o proprietário desta sondagem.",
"pollsEmpty": "Nenhuma sondagem criada",
"possibleAnswers": "Possíveis respostas",
"preferences": "Preferências",
"previousMonth": "Mês anterior",
"profileLogin": "Perfil - Iniciar sessão",
"profileUser": "Perfil - {{username}}",
"requiredNameError": "O nome é obrigatório",
"save": "Guardar",
"saveInstruction": "Selecione a sua disponibilidade e clique em <b>{{save}}</b>",
"share": "Partilhar",
"shareDescription": "Dê este link aos seus <b>participantes</b> para permitir que eles votem na sua sondagem.",
"shareLink": "Partilhar via link",
"specifyTimes": "Especificar horas",
"specifyTimesDescription": "Incluir os horários de início e fim para cada opção",
"stepSummary": "Passo {{current}} de {{total}}",
"sunday": "Domingo",
"timeAndDate": "Data e hora",
"timeFormat": "Formato da hora:",
"timeZone": "Fuso horário:",
"title": "Título",
"titlePlaceholder": "Encontro Mensal",
"today": "Hoje",
"unlockPoll": "Desbloquear sondagem",
"unverifiedMessage": "Um e-mail foi enviado para <b>{{email}}</b> com um link para verificar o endereço de e-mail.",
"user": "Utilizador",
"vote": "Votação",
"voteCount_other": "{{count}} votos",
"voteCount": "{{count}} voto",
"weekStartsOn": "A semana começa em",
"weekView": "Vista semanal",
"whatsThis": "O que é isto?",
"yes": "Sim",
"you": "Tu",
"yourDetails": "Os seus detalhes",
"yourName": "O seu nome…",
"yourPolls": "As suas sondagens"
}

View file

@ -0,0 +1,22 @@
{
"blog": "Blogue",
"discussions": "Discussões",
"donate": "Doar",
"english": "Inglês",
"footerCredit": "Criado por <a>@imlukevella</a>",
"footerSponsor": "Este projeto é financiado pelos utilizadores. Por favor, considere apoiá-lo <a>doando</a>.",
"french": "Francês",
"german": "Alemão",
"home": "Início",
"italian": "Italiano",
"language": "Idioma",
"links": "Links",
"portugueseBr": "Português (Brasil)",
"poweredBy": "Powered by",
"privacyPolicy": "Política de Privacidade",
"spanish": "Espanhol",
"starOnGithub": "Adicione uma estrela no GitHub",
"support": "Ajuda",
"swedish": "Sueco",
"volunteerTranslator": "Ajude a traduzir esta página"
}

View file

@ -0,0 +1,6 @@
{
"notFoundTitle": "404 Página não encontrada",
"notFoundDescription": "Não conseguimos encontrar a página que procuras.",
"goToHome": "Ir para a página inicial",
"startChat": "Iniciar chat"
}

View file

@ -0,0 +1,36 @@
{
"3Ls": "Sim—com 3 <e>L</e>s",
"adFree": "Sem anúncios",
"adFreeDescription": "Pode descansar o seu bloqueador de anúncios — Não vai precisar dele aqui.",
"comments": "Comentários",
"commentsDescription": "Os participantes podem comentar na sua sondagem e os comentários ficarão visíveis para todos.",
"features": "Funcionalidades",
"featuresSubheading": "Agendamento, a maneira inteligente",
"follow": "Seguir",
"getStarted": "Começar",
"heroSubText": "Encontre a data certa sem andar às voltas",
"heroText": "Agende<br/><s>reuniões de grupo</s><br />com facilidade",
"links": "Links",
"liveDemo": "Demonstração ao vivo",
"metaDescription": "Crie sondagens e vote para encontrar o melhor dia ou hora. Uma alternativa gratuita ao Doodle.",
"metaTitle": "Rallly - Agendar reuniões de grupo",
"mobileFriendly": "Preparado para dispositivos móveis",
"mobileFriendlyDescription": "Funciona muito bem em dispositivos móveis para que os participantes possam responder a sondagens onde estiverem.",
"new": "Novo",
"noLoginRequired": "Não é necessário iniciar sessão",
"noLoginRequiredDescription": "Não precisa de iniciar sessão para criar ou participar numa sondagem",
"notifications": "Notificações",
"notificationsDescription": "Acompanhe quem respondeu. Seja notificado quando os participantes votarem ou comentarem na sua sondagem.",
"openSource": "Código aberto",
"openSourceDescription": "Desenvolvido em código aberto e <a>disponível no GitHub</a>.",
"participant": "Participante",
"participantCount_other": "{{count}} participantes",
"participantCount": "{{count}} participante",
"perfect": "Perfeito!",
"principles": "Princípios",
"principlesSubheading": "Não somos como os outros",
"selfHostable": "Auto-alojável",
"selfHostableDescription": "Execute no seu próprio servidor para ter controlo total dos seus dados",
"timeSlots": "Intervalo de tempo",
"timeSlotsDescription": "Defina os horários de início e fim individuais para cada opção em sua sondagem. Os horários podem ser automaticamente ajustados ao fuso horário de cada participante ou podem ser definidos para ignorar completamente os fusos horários."
}

View file

@ -23,6 +23,8 @@ export const LanguageSelect: React.VoidFunctionComponent<{
<option value="de">{t("german")}</option>
<option value="fr">{t("french")}</option>
<option value="it">{t("italian")}</option>
<option value="ko">{t("korean")}</option>
<option value="pt">{t("portuguese")}</option>
<option value="pt-BR">{t("portugueseBr")}</option>
<option value="sv">{t("swedish")}</option>
</select>

View file

@ -1,7 +1,17 @@
import languageParser from "accept-language-parser";
import { NextRequest, NextResponse } from "next/server";
const supportedLocales = ["en", "es", "de", "fr", "it", "sv", "pt-BR"];
const supportedLocales = [
"en",
"es",
"de",
"fr",
"it",
"ko",
"sv",
"pt",
"pt-BR",
];
export function middleware({ headers, cookies, nextUrl }: NextRequest) {
const newUrl = nextUrl.clone();

View file

@ -55,11 +55,21 @@ const dayjsLocales: Record<
timeFormat: "24h",
import: () => import("dayjs/locale/sv"),
},
pt: {
weekStartsOn: "sunday",
timeFormat: "24h",
import: () => import("dayjs/locale/pt"),
},
"pt-BR": {
weekStartsOn: "sunday",
timeFormat: "24h",
import: () => import("dayjs/locale/pt-br"),
},
ko: {
weekStartsOn: "sunday",
timeFormat: "12h",
import: () => import("dayjs/locale/ko"),
},
};
dayjs.extend(localizedFormat);