-
-
- mail
-
-
- tipilan@ituk.ee
-
+
+
+ {t("footer.contact")}
+
+
+
+
{t("footer.studentUnion")}
+
-
-
- phone
-
-
- +372 5693 1193
-
+
+ {t("footer.organization")}
+
+
+
+ {t("footer.registrationCode")}:{" "}
+
+ 80391807
+
+
+
ICO-210, Raja tn 4c, Tallinn, Harjumaa, 12616
-
MTÜ For Tsükkel
-
-
- Registrikood:{" "}
-
- 80391807
-
-
-
- ICO-210, Raja tn 4c, Tallinn, Harjumaa, 12616
-
-
+
+
-
-);
+ );
+};
export default Footer;
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
index 3c54ad5..381c1f6 100644
--- a/src/components/Header.tsx
+++ b/src/components/Header.tsx
@@ -12,6 +12,8 @@ import {
// Theme Provider
import { useTheme } from "next-themes";
+import LanguageSwitcher from "./LanguageSwitcher";
+
// Shadcn UI
import { Button } from "@/components/ui/button";
import {
@@ -24,65 +26,74 @@ import {
// Fonts
// import { vipnagorgialla } from "@/components/Vipnagorgialla";
-const Header = ({
- isOpen,
- toggleSidebar,
-}: {
+interface HeaderProps {
isOpen: boolean;
- toggleSidebar: () => void;
-}) => {
+ onToggle: () => void;
+ themeLabels: {
+ light: string;
+ dark: string;
+ system: string;
+ };
+}
+
+const Header = ({ isOpen, onToggle, themeLabels }: HeaderProps) => {
const { theme, setTheme } = useTheme();
return (
);
};
diff --git a/src/components/LanguageSwitcher.tsx b/src/components/LanguageSwitcher.tsx
new file mode 100644
index 0000000..53f3d02
--- /dev/null
+++ b/src/components/LanguageSwitcher.tsx
@@ -0,0 +1,47 @@
+"use client";
+
+import { useLocale } from "next-intl";
+import { useRouter, usePathname } from "@/i18n/routing";
+import { routing } from "@/i18n/routing";
+import { Button } from "@/components/ui/button";
+import { vipnagorgialla } from "@/components/Vipnagorgialla";
+
+export default function LanguageSwitcher() {
+ const locale = useLocale();
+ const router = useRouter();
+ const pathname = usePathname();
+
+ const getNextLocale = (): "et" | "en" => {
+ const currentIndex = routing.locales.indexOf(locale as "et" | "en");
+ const nextIndex = (currentIndex + 1) % routing.locales.length;
+ return routing.locales[nextIndex] as "et" | "en";
+ };
+
+ const getNextLanguageName = () => {
+ const nextLocale = getNextLocale();
+ switch (nextLocale) {
+ case "et":
+ return "EST";
+ case "en":
+ return "ENG";
+ default:
+ return nextLocale;
+ }
+ };
+
+ const handleLanguageSwitch = () => {
+ const nextLocale = getNextLocale();
+ router.replace(pathname, { locale: nextLocale });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/components/SectionDivider.tsx b/src/components/SectionDivider.tsx
new file mode 100644
index 0000000..dc88b17
--- /dev/null
+++ b/src/components/SectionDivider.tsx
@@ -0,0 +1,7 @@
+import React from 'react';
+
+export default function SectionDivider() {
+ return (
+
+ );
+};
diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx
deleted file mode 100644
index 086bb4c..0000000
--- a/src/components/Sidebar.tsx
+++ /dev/null
@@ -1,88 +0,0 @@
-"use client";
-
-// Fonts
-import { vipnagorgialla } from "@/components/Vipnagorgialla";
-
-// Use effect to handle route changes and close the sidebar if it's open
-// usePathName to listen to route changes in Next.js
-import { useEffect } from "react";
-import { usePathname } from "next/navigation";
-import Link from "next/link";
-
-const Sidebar = ({
- isOpen,
- toggleSidebar,
-}: {
- isOpen: boolean;
- toggleSidebar: () => void;
-}) => {
- const pathname = usePathname();
-
- useEffect(() => {
- if (isOpen) {
- toggleSidebar();
- }
- }, [pathname]);
-
- return (
- <>
-
-
-
- Avaleht
-
-
- Messiala
-
-
- Piletid
-
-
- Ajakava
-
-
- Turniirid
-
-
- Kodukord
-
-
- Reeglid
-
-
-
-
- >
- );
-};
-
-export default Sidebar;
diff --git a/src/components/SidebarLayoutClient.tsx b/src/components/SidebarLayoutClient.tsx
new file mode 100644
index 0000000..470a2d0
--- /dev/null
+++ b/src/components/SidebarLayoutClient.tsx
@@ -0,0 +1,84 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import { usePathname } from "@/i18n/routing";
+import { Link } from "@/i18n/routing";
+import { vipnagorgialla } from "@/components/Vipnagorgialla";
+import Header from "./Header";
+
+interface NavItem {
+ href:
+ | "/"
+ | "/ajakava"
+ | "/haldus"
+ | "/kodukord"
+ | "/messiala"
+ | "/piletid"
+ | "/reeglid"
+ | "/striim"
+ | "/turniirid";
+ label: string;
+}
+
+interface SidebarLayoutClientProps {
+ themeLabels: {
+ light: string;
+ dark: string;
+ system: string;
+ };
+ navItems: NavItem[];
+}
+
+export default function SidebarLayoutClient({
+ themeLabels,
+ navItems,
+}: SidebarLayoutClientProps) {
+ const [isOpen, setIsOpen] = useState(false);
+ const pathname = usePathname();
+
+ const toggleSidebar = () => setIsOpen(!isOpen);
+
+ // Close sidebar when route changes
+ useEffect(() => {
+ if (isOpen) {
+ setIsOpen(false);
+ }
+ }, [pathname]);
+
+ return (
+ <>
+
+
+ {/* Sidebar */}
+ <>
+
setIsOpen(false)}
+ >
+
+ {navItems.map((item) => (
+
+ {item.label}
+
+ ))}
+
+ >
+ >
+ );
+}
diff --git a/src/components/SidebarLayoutServer.tsx b/src/components/SidebarLayoutServer.tsx
new file mode 100644
index 0000000..97820b9
--- /dev/null
+++ b/src/components/SidebarLayoutServer.tsx
@@ -0,0 +1,26 @@
+import { getTranslations } from "next-intl/server";
+import SidebarLayoutClient from "./SidebarLayoutClient";
+
+export default async function SidebarLayoutServer() {
+ const t = await getTranslations("common");
+
+ const themeLabels = {
+ light: t("theme.light"),
+ dark: t("theme.dark"),
+ system: t("theme.system"),
+ };
+
+ const navT = await getTranslations("navigation");
+
+ const navItems = [
+ { href: "/" as const, label: navT("home") },
+ { href: "/messiala" as const, label: navT("expo") },
+ { href: "/piletid" as const, label: navT("tickets") },
+ { href: "/ajakava" as const, label: navT("schedule") },
+ { href: "/turniirid" as const, label: navT("tournaments") },
+ { href: "/kodukord" as const, label: navT("houserules") },
+ { href: "/reeglid" as const, label: navT("rules") },
+ ];
+
+ return
;
+}
diff --git a/src/components/SidebarParent.tsx b/src/components/SidebarParent.tsx
index eabb07b..8c4becb 100644
--- a/src/components/SidebarParent.tsx
+++ b/src/components/SidebarParent.tsx
@@ -1,22 +1,14 @@
-'use client';
-
-import { useState } from "react";
-import Header from "./Header";
-import Sidebar from "./Sidebar";
+import SidebarLayoutServer from "./SidebarLayoutServer";
const SidebarParent = () => {
- const [isOpen, setIsOpen] = useState(false);
- const toggleSidebar = () => setIsOpen(!isOpen);
-
- return (
-
-
-
-
- );
+ return (
+
+
+
+ );
};
-// This component is responsible for rendering the sidebar and header together.
-// It manages the state of the sidebar (open/closed) and passes the necessary props to both the Header and Sidebar components.
+// This component is responsible for rendering the sidebar and header together.
+// Server-side translations are handled by SidebarLayoutServer.
-export default SidebarParent;
\ No newline at end of file
+export default SidebarParent;
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index a2df8dc..6c5e578 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -1,8 +1,8 @@
-import * as React from "react"
-import { Slot } from "@radix-ui/react-slot"
-import { cva, type VariantProps } from "class-variance-authority"
+import * as React from "react";
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
-import { cn } from "@/lib/utils"
+import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
@@ -32,8 +32,8 @@ const buttonVariants = cva(
variant: "default",
size: "default",
},
- }
-)
+ },
+);
function Button({
className,
@@ -43,17 +43,25 @@ function Button({
...props
}: React.ComponentProps<"button"> &
VariantProps
& {
- asChild?: boolean
+ asChild?: boolean;
}) {
- const Comp = asChild ? Slot : "button"
+ if (asChild) {
+ return (
+ )}
+ />
+ );
+ }
return (
-
- )
+ );
}
-export { Button, buttonVariants }
+export { Button, buttonVariants };
diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx
new file mode 100644
index 0000000..32ea0ef
--- /dev/null
+++ b/src/components/ui/skeleton.tsx
@@ -0,0 +1,13 @@
+import { cn } from "@/lib/utils"
+
+function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Skeleton }
diff --git a/src/data/kodukord.md b/src/data/kodukord.md
new file mode 100644
index 0000000..d70e5c0
--- /dev/null
+++ b/src/data/kodukord.md
@@ -0,0 +1,30 @@
+Üritusel osalemise kodukord kehtib kõigile, nii külastajatele kui võistlejatele. Kodukorra rikkumisel jätab TipiLAN endale õiguse osaleja ürituselt eemaldada ning vajadusel teavitada politseid. Alaealise osaleja puhul teavitame raskema kodukorra eiramise puhul tema vanemaid või eestkostjaid.
+
+# Osaleja meelespea
+
+1. Tulles vaheta oma pilet käepaela vastu.
+2. Osaleja peab olema vähemalt 16-aastane. Pileti kontrollija võib küsida Sinult dokumenti.
+3. Üritust pildistatakse ning filmitakse ja ürituse sisu kajastatakse erinevates meediakanalites.
+4. Kui Sul on ette nähtud TipiLANi poolne majutus, anna sellest teada pileti käepaela vastu vahetamisel.
+5. Kui tuled oma arvutiga, juhendatakse Sind käepaela saades, kuhu saad selle üles panna.
+
+# Ürituse kodukord
+
+1. Osaleja kohustub käituma viisakalt ning väärikalt ja austama teisi üritusel osalejaid.
+2. TipiLAN ei tolereeri:
+ 2.1. Vihakõnet rahvusliku, rassilise, soolise, seksuaalse või religioosse kuuluvuse, puude, välimuse või vanuse kohta; ahistamist, ähvardavat, solvavat või agressiivset käitumist, sellele õhutamist või selle pooldamist
+ 2.2. See kehtib nii ürituse alal (IRL) kui ka üritusega seotud online-keskkondades.
+3. Osaleja kohustub käituma ürituse hoone, inventari ja sisustuse suhtes heaperemehelikult. Keelatud on lõhkuda, määrida või viia mujale esemeid, mis ei kuulu osalejale.
+ 3.1. Kui osalejal on ette nähtud korraldajapoolne majutus, siis majutusalal on osalejal kohustus olla vaikselt ning lubada kaaslastel puhata.
+ 3.2. Majutusalale ei või kaasa kutsuda isikuid, kellel ei ole seal majutust ette nähtud.
+4. TipiLAN ei vastuta osaleja isikliku vara eest.
+ 4.1. Korraldajapoolne majutusala on lukustatav ning kõrvalisi isikuid sinna ei lubata, kuid sellest sõltumata tasub oma väärisesemetel silma peal hoida.
+ 4.2. Kui on tekkinud kahtlus, et on toimunud vargus, tuleb sellest koheselt teavitada korraldajat.
+ 4.3. Kaotatud asjade leidmisel palume anda need korraldajale või viia need *lost & found’i* (Merchilauda).
+5. Ürituse alal on keelatud suitsetada ning kasutada vape’i. Selleks on õues ette nähtud suitsetamise kohad.
+6. Üritusele ei tohi kaasa võtta illegaalseid aineid või ravimeid, terariistu, tulirelvi, lõhke- või süüteained ning muid esemeid, mis võivad osalejatele või teistele viga teha.
+7. Alaealisel osalejal on keelatud tarbida alkoholi või kasutada nikotiini sisaldavaid tooteid.
+ 7.1. Olles baarist alkoholi ostmas, on osalejal baaritöötaja nõudmisel kohustus näidata isikuttõendavat dokumenti.
+8. Osaleja kohustub käituma alkoholi suhtes vastutustundlikult.
+9. Keelatud on igasugune hasartmäng nii raha kui muude hüvede peale.
+
diff --git a/src/data/rules/lol.md b/src/data/rules/lol.md
index 0e22056..22ff030 100644
--- a/src/data/rules/lol.md
+++ b/src/data/rules/lol.md
@@ -30,7 +30,7 @@ Korraldajal on õigus eemaldada võistleja turniirilt nende reeglite rikkumise k
## 3. Mängule eelnev
-1. **3.1** Turniiril osalemine, matchid ja turniiripuu toimib **challengermode.com** keskkonna kaudu:
+1. **3.1** Turniiril osalemine, matchid ja turniiripuu toimib **[challengermode.com](https://www.challengermode.com/s/TipiLAN/tournaments/4b7d832b-7cf3-406a-8425-08ddd311ac8a)** keskkonna kaudu:
1. **3.1.1** Turniirile peab olema registreeritud kogu meeskond, sh varumängija
2. **3.1.2** Turniir toimub **EU West** serveris
2. **3.2** Challengermode keskkonnas on match’id automaatsed. Uue match’i puhul on valmisolekuks aega **10 minutit**, seejärel lobby’sse jõudmiseks veel **10 minutit**.
@@ -42,12 +42,12 @@ Korraldajal on õigus eemaldada võistleja turniirilt nende reeglite rikkumise k
## 4. Mängusisesed protseduurid
1. **4.1** Mäng on ametlikult alanud (game of record (edaspidi GOR)) kui kõik 10 mängijat on kaardil ning mäng on jõudnud esimese reaalse interaktsioonini (vt. allpool).
-Hetkel kui mäng on jõudnud GOR staatuseni, ei või seda uuesti alustada. Mängu skoori hakatakse sellest hetkest ametlikult jälgima.
+Hetkel kui mäng on jõudnud GOR staatuseni, ei või seda uuesti alustada. Mängu skoori hakatakse sellest hetkest ametlikult jälgima.
Peale GOR staatuseni jõudmist on võimalik mängu restartida vaid juhtudel, kui käesoleva mängu lõpuni viimine ei osutu mõjuval põhjusel võimalikuks. GOR’i tingimused on järgnevad:
1. **4.1.1** Kummalgi tiimil õnnestub rünnak või oskuse (ability) kasutamine käsilaste, jungle creep’ide, ehitiste või vastaste vastu
2. **4.1.2** Vastased näevad teineteist (Clairvoyance ei loe)
3. **4.1.3** Sisenetakse vastase territooriumile
- 4. **4.1.4** Mäng on kestnud vähemalt 2 minutit
+ 4. **4.1.4** Mäng on kestnud vähemalt 2 minutit
Pärast GOR-i staatuseni jõudmist ei või mängu uuesti alustada, välja arvatud mõjuval põhjusel (bug, ühenduse probleemid jne).
2. **4.2** Mängu seiskamine:
1. **4.2.1** Mängu pausile panemise ajal ei tohi lahkuda matši alalt, v.a juhul kui see on ametlikult autoriseeritud
@@ -86,53 +86,53 @@ Peale GOR staatuseni jõudmist on võimalik mängu restartida vaid juhtudel, kui
2. **7.10.2 Ban’i kaotus:** tiim ei või karistusele järgneval mängul ban'ida kindel arv tegelasi. Sel juhul kohtunik jälgib, et tiim ei valiks karistusena määratud arvu ban'e ning laseks selle asemel taimeril nulli joosta.
3. **7.10.3 Mängu kaotus:** tiim saab automaatse kaotuse ühel mängul.
4. **7.10.4 Match’i kaotus:** tiim saab automaatse match’i kaotuse.
- 5. **7.10.5 Diskvalifitseerimine:** diskvalifikatsioon kehtib tervele tiimile. Sellel juhul loobub tiim kõigist võitudest. Kui diskvalifikatsioon on saadud eskaleeruvate eksimuste tulemusel, saab tiim selle osa võitudest, mis neil oli selleks hetkeks välja teenitud.
+ 5. **7.10.5 Diskvalifitseerimine:** diskvalifikatsioon kehtib tervele tiimile. Sellel juhul loobub tiim kõigist võitudest. Kui diskvalifikatsioon on saadud eskaleeruvate eksimuste tulemusel, saab tiim selle osa võitudest, mis neil oli selleks hetkeks välja teenitud.
- Mõningatel juhtudel on kohtunikul lubatud diskvalifitseerida ainult üks mängija tiimi asemel. See on sel juhul, kui mängija eksimus ei mõjuta mingil viisil vastasmeeskonda ning on tehtud kaasamata kedagi ka oma tiimist. Üldiselt on see võimalik juhul kui mängija eksimus kuulub kategooriasse *Mittesobilik käitumine – Raske eksimus*. Sel juhul võib ülejäänud tiim turniiril jätkata varumängija olemasolul. Vastasel korral peab ka kogu tiim turniirilt välja langema.
-11. **7.11** Karistuste eskaleerimine toimub järgmises järjekorras:
+11. **7.11** Karistuste eskaleerimine toimub järgmises järjekorras:
Hoiatus → hoiatus → ban’i valimise õiguse kaotus → mängu kaotus → match’i kaotus → diskvalifikatsioon.
12. **7.12** Turniiri eksimused jagunevad järgmiselt:
1. **7.12.1 Välise abi kasutamine:** eksimus läheb kirja, kui tiim suhtleb mängu ajal ükskõik kellega peale omaenda tiimi ning selle tagajärjel, kohtuniku otsustusel, saab mängus eelise. Eksimuse puhul eeldatakse, et tegu ei olnud tahtliku kavatsusega sohki teha. Tahtlikult ebaõiglase eelise otsimine läheb punkti *Mittesobilik käitumine – Sohk* alla. Karistuseks on hoiatus.
- 2. **7.12.2 Juhiste eiramine:** igal mängijal on kohustus järgida Korraldaja ja kohtunike juhiseid. Nende eiramine võib endaga kaasa tuua viivitusi ning vaidlusi. Karistuseks on esimese valiku tegemise kaotus.
+ 2. **7.12.2 Juhiste eiramine:** igal mängijal on kohustus järgida Korraldaja ja kohtunike juhiseid. Nende eiramine võib endaga kaasa tuua viivitusi ning vaidlusi. Karistuseks on esimese valiku tegemise kaotus.
- Spetsiifiliselt ühele tiimile või mängijale tehtud korralduse eiramine on eraldi eksimus ning kuulub *Mittesobilik käitumine – Keskmine eksimus* alla.
-13. **7.13** Mittesobilik käitumine.
- Mittesobilik käitumine on turniiri käiku häiriv ning võib negatiivselt mõjutada turvalisust, võistlushimu, mängurõõmu või turniiri ausameelsust ning terviklikkust. See ei ole sama, mis konkurentsihimuline käitumine.
+13. **7.13** Mittesobilik käitumine.
+ Mittesobilik käitumine on turniiri käiku häiriv ning võib negatiivselt mõjutada turvalisust, võistlushimu, mängurõõmu või turniiri ausameelsust ning terviklikkust. See ei ole sama, mis konkurentsihimuline käitumine.
Mittesobiliku käitumise eksimused jagunevad:
1. **7.13.1 Kerge eksimus:** käitumine, mis on ebameeldiv, ebaeetiline või häiriv, näiteks liigne ropendamine; nõudmine, et vastane saaks karistuse peale kohtuniku otsust; lõugamine; prügi maha loopimine jne. Karistuseks on hoiatus.
2. **7.13.2 Keskmine eksimus:** kolm tüüpi juhtumeid:
- - Eirab kohtuniku või Korraldaja juhiseid, mis on mõeldud spetsiaalselt ühele tiimile või ühele mängijale
- - Kasutab avalikult vihakõnet kellegi suunas
- - On agressiivne või vägivaldne, kuid see ei ole suunatud teise inimese vastu
+ - Eirab kohtuniku või Korraldaja juhiseid, mis on mõeldud spetsiaalselt ühele tiimile või ühele mängijale
+ - Kasutab avalikult vihakõnet kellegi suunas
+ - On agressiivne või vägivaldne, kuid see ei ole suunatud teise inimese vastu
Karistuseks on mängu kaotus.
3. **7.13.3 Raske eksimus:** käitumine, mis on selgelt vastuolus turniiri reeglite ja heade tavadega, näiteks tahtlikult turniiri vahendite lõhkumine või ruumi määrimine/lõhkumine. Karistuseks on diskvalifikatsioon, turniiri toimumiskohast eemaldamine või ekstreemsematel juhtudel politsei teavitamine.
4. **7.13.4 Kokkumäng:** kahe tiimi kokkulepe ebaausalt teiste tiimide vastu mängida ja püüda mõjutada turniiri tulemusi. Karistuseks on mõlema tiimi diskvalifitseerimine.
5. **7.13.5 Altkäemaks ja panustamine:** keelatud on meelehea (mitte ainult rahaline) nimel loobuda turniirist või püüda muuta match’ide tulemusi. Samuti on keelatud pakkuda kohtunikule stiimulit mängu tulemuse mõjutamiseks või teha panuseid mängude tulemustele. Karistuseks on diskvalifitseerimine.
6. **7.13.6 Agressiivne käitumine:** kõik inimeste vastu suunatud agressiooni ilmingud, kaasa arvatud ähvardamine ja reaalne vägivald. Karistuseks on diskvalifitseerimine ja toimumiskohast eemaldamine, ekstreemsematel juhtudel politsei teavitamine.
7. **7.13.7 Vargus:** kuigi igal osalejal on kohustus oma varal silma peal hoida, eeldatakse heade tavade järgimist. Karistuseks on diskvalifitseerimine ja toimumiskohast eemaldamine, vajadusel politsei teavitamine.
- 8. **7.13.8 Alkohol ja joove:** alkoholi tarbimine ürituse raames on keelatud. Liigse joobe korral on Korraldajal õigus osaleja toimumiskohast eemaldada.
+ 8. **7.13.8 Alkohol ja joove:** alkoholi tarbimine ürituse raames on keelatud. Liigse joobe korral on Korraldajal õigus osaleja toimumiskohast eemaldada.
- Kui joobes osaleja on alaealine, informeeritakse sellest tema vanemaid ning politseid.
- 9. **7.13.9 Sohk:** teadlik tegevus mängus eelise saavutamiseks, isegi kui see ei ole edukas.
+ 9. **7.13.9 Sohk:** teadlik tegevus mängus eelise saavutamiseks, isegi kui see ei ole edukas.
Sohki tegemise näited:
- - Püüab näha enda mängu spectator mode’s või saab infot kelleltki, kes saab mängu spectator mode’s vaadata
- - Mängu modifitseerimine või lisatarkvara kasutamine, mis ei ole tavapärane (nt löögiraadiuse või torni laskeraadiuse nähtavaks tegemine, spawn-taimerid jms; VOIP-programmide kasutamine ei kuulu siia alla)
- - Teise mängijana või vale nime all esinemine, konto jagamine
- - Varustuse tahtlik rikkumine või moonutamine, et tekitada viivitusi või mõjutada mängu kulgu
- - Mängusiseste vigade tahtlik ärakasutamine (glitchid) eelise saamiseks
+ - Püüab näha enda mängu spectator mode’s või saab infot kelleltki, kes saab mängu spectator mode’s vaadata
+ - Mängu modifitseerimine või lisatarkvara kasutamine, mis ei ole tavapärane (nt löögiraadiuse või torni laskeraadiuse nähtavaks tegemine, spawn-taimerid jms; VOIP-programmide kasutamine ei kuulu siia alla)
+ - Teise mängijana või vale nime all esinemine, konto jagamine
+ - Varustuse tahtlik rikkumine või moonutamine, et tekitada viivitusi või mõjutada mängu kulgu
+ - Mängusiseste vigade tahtlik ärakasutamine (glitchid) eelise saamiseks
Karistuseks on diskvalifikatsioon.
## 8. Double Elimination
-1. **8.1** Double Elimination on turniiri formaat, kus esimeses voorus mängivad kõik 16 tiimi.
-2. **8.2** Pärast avavooru jagunevad tiimid kaheks:
- 1. **8.2.1** Võitjate elimineerimispuu (*upper bracket*) – sinna liiguvad esimeses voorus võitnud tiimid.
- 2. **8.2.2** Kaotajate elimineerimispuu (*lower bracket*) – sinna liiguvad esimeses voorus kaotanud tiimid.
-3. **8.3** Väljalangemine:
- 1. **8.3.1** Iga järgmises voorus kaotav tiim langeb turniirilt välja.
-4. **8.4** Mänguformaat:
- 1. **8.4.1** Esimesed kolm vooru: *Best of 1* – võitja liigub edasi järgmisesse vooru.
- 2. **8.4.2** Upper- ja lower-finaalid: *Best of 3* – võidab see, kes võidab esimesena kaks mängu.
- 3. **8.4.3** Finaal: *Best of 5* – võidab see, kes võidab esimesena kolm mängu.
-5. **8.5** III koha määramine:
- 1. **8.5.1** Finaali kaotaja mängib kaotajate elimineerimispuu võitjaga.
- 2. **8.5.2** Selle kohtumise võitja saab turniiri **III koha**.
+1. **8.1** Double Elimination on turniiri formaat, kus esimeses voorus mängivad kõik 16 tiimi.
+2. **8.2** Pärast avavooru jagunevad tiimid kaheks:
+ 1. **8.2.1** Võitjate elimineerimispuu (*upper bracket*) – sinna liiguvad esimeses voorus võitnud tiimid.
+ 2. **8.2.2** Kaotajate elimineerimispuu (*lower bracket*) – sinna liiguvad esimeses voorus kaotanud tiimid.
+3. **8.3** Väljalangemine:
+ 1. **8.3.1** Iga järgmises voorus kaotav tiim langeb turniirilt välja.
+4. **8.4** Mänguformaat:
+ 1. **8.4.1** Esimesed kolm vooru: *Best of 1* – võitja liigub edasi järgmisesse vooru.
+ 2. **8.4.2** Upper- ja lower-finaalid: *Best of 3* – võidab see, kes võidab esimesena kaks mängu.
+ 3. **8.4.3** Finaal: *Best of 5* – võidab see, kes võidab esimesena kolm mängu.
+5. **8.5** III koha määramine:
+ 1. **8.5.1** Finaali kaotaja mängib kaotajate elimineerimispuu võitjaga.
+ 2. **8.5.2** Selle kohtumise võitja saab turniiri **III koha**.
diff --git a/src/data/timetable.ts b/src/data/timetable.ts
index d91615e..db0cf2c 100644
--- a/src/data/timetable.ts
+++ b/src/data/timetable.ts
@@ -1,33 +1,68 @@
export type ScheduleItem = {
time?: string; // Aeg on ajutine praegu kuna pole 100% kindlalt paigas
- title: string;
- location: string;
+ titleKey: string;
+ locationKey: string;
description?: string;
};
export const scheduleData: Record = {
- "24. oktoober": [
+ oct24: [
{
- title: "League of Legends põhiturniir",
- location: "Aula",
- time: "-",
+ titleKey: "schedule.events.doorsOpen",
+ locationKey: "schedule.locations.registrationSetup",
+ time: "17:00",
},
{
- title: "Miniturniirid",
- location: "Tudengimaja",
- time: "-",
+ titleKey: "schedule.events.mainTournamentsStart",
+ locationKey: "schedule.locations.auditorium",
+ time: "20:00",
+ },
+ {
+ titleKey: "schedule.events.miniTournamentsKickoff",
+ locationKey: "schedule.locations.studentHouse",
+ time: "18:00",
+ },
+ {
+ titleKey: "schedule.events.fightingGamesStart",
+ locationKey: "schedule.locations.studentHouse",
+ time: "18:30",
+ },
+ {
+ titleKey: "schedule.events.doorsClose",
+ locationKey: "schedule.locations.auditoriumAndStudentHouse",
+ time: "*01:00",
},
],
- "25. oktoober": [
+ oct25: [
+ {
+ titleKey: "schedule.events.doorsOpen",
+ locationKey: "schedule.locations.auditoriumAndStudentHouse",
+ time: "10:00",
+ },
+ {
+ titleKey: "schedule.events.miniTournamentsStart",
+ locationKey: "schedule.locations.studentHouse",
+ time: "11:00",
+ },
+ {
+ titleKey: "schedule.events.granblue",
+ locationKey: "schedule.locations.studentHouse",
+ time: "11:30",
+ },
+ {
+ titleKey: "schedule.events.mainTournamentsStart",
+ locationKey: "schedule.locations.auditorium",
+ time: "12:00",
+ },
{
- title: "Counter-Strike 2 põhiturniir",
- location: "Aula",
- time: "-",
+ titleKey: "schedule.events.granTurismo",
+ locationKey: "schedule.locations.studentHouse",
+ time: "20:00",
},
{
- title: "Miniturniirid",
- location: "Tudengimaja",
- time: "-",
+ titleKey: "schedule.events.doorsClose",
+ locationKey: "schedule.locations.auditoriumAndStudentHouse",
+ time: "*01:00",
},
],
};
diff --git a/src/i18n/request.ts b/src/i18n/request.ts
new file mode 100644
index 0000000..07c6359
--- /dev/null
+++ b/src/i18n/request.ts
@@ -0,0 +1,17 @@
+import { getRequestConfig } from "next-intl/server";
+import { routing } from "./routing";
+
+export default getRequestConfig(async ({ requestLocale }) => {
+ // This typically corresponds to the `[locale]` segment
+ let locale = await requestLocale;
+
+ // Ensure that a valid locale is used
+ if (!locale || !routing.locales.includes(locale as "et" | "en")) {
+ locale = routing.defaultLocale;
+ }
+
+ return {
+ locale: locale!,
+ messages: (await import(`../../translations/${locale}.json`)).default,
+ };
+});
diff --git a/src/i18n/routing.ts b/src/i18n/routing.ts
new file mode 100644
index 0000000..9e833ed
--- /dev/null
+++ b/src/i18n/routing.ts
@@ -0,0 +1,55 @@
+import { defineRouting } from "next-intl/routing";
+import { createNavigation } from "next-intl/navigation";
+
+export const routing = defineRouting({
+ // A list of all locales that are supported
+ locales: ["et", "en"],
+
+ // Used when no locale matches
+ defaultLocale: "et",
+
+ // The `pathnames` object holds pairs of internal and
+ // external paths. The external paths are shown in the URL.
+ pathnames: {
+ // If all locales use the same pathname, a single
+ // external path can be used for all locales
+ "/": "/",
+ "/ajakava": {
+ et: "/ajakava",
+ en: "/schedule",
+ },
+ "/haldus": {
+ et: "/haldus",
+ en: "/admin",
+ },
+ "/kodukord": {
+ et: "/kodukord",
+ en: "/houserules",
+ },
+ "/messiala": {
+ et: "/messiala",
+ en: "/expo",
+ },
+ "/piletid": {
+ et: "/piletid",
+ en: "/tickets",
+ },
+ "/reeglid": {
+ et: "/reeglid",
+ en: "/gamerules",
+ },
+ "/striim": {
+ et: "/striim",
+ en: "/stream",
+ },
+ "/turniirid": {
+ et: "/turniirid",
+ en: "/tournaments",
+ },
+ },
+});
+
+// Lightweight wrappers around Next.js' navigation APIs
+// that will consider the routing configuration
+export const { Link, redirect, usePathname, useRouter } =
+ createNavigation(routing);
diff --git a/src/middleware.ts b/src/middleware.ts
new file mode 100644
index 0000000..c7fbd95
--- /dev/null
+++ b/src/middleware.ts
@@ -0,0 +1,20 @@
+import createMiddleware from 'next-intl/middleware';
+import {routing} from './i18n/routing';
+
+export default createMiddleware(routing);
+
+export const config = {
+ // Match only internationalized pathnames
+ matcher: [
+ // Enable a redirect to a matching locale at the root
+ '/',
+
+ // Set a cookie to remember the previous locale for
+ // all requests that have a locale prefix
+ '/(et|en)/:path*',
+
+ // Enable redirects that add missing locales
+ // (e.g. `/pathnames` -> `/en/pathnames`)
+ '/((?!_next|_vercel|.*\\..*).*)'
+ ]
+};
diff --git a/translations/en.json b/translations/en.json
new file mode 100644
index 0000000..93fd1ae
--- /dev/null
+++ b/translations/en.json
@@ -0,0 +1,227 @@
+{
+ "navigation": {
+ "home": "Home",
+ "schedule": "Schedule",
+ "admin": "Admin",
+ "houserules": "House rules",
+ "expo": "Expo",
+ "tickets": "Tickets",
+ "rules": "Game rules",
+ "stream": "Stream",
+ "tournaments": "Tournaments"
+ },
+ "common": {
+ "loading": "Loading...",
+ "error": "Error",
+ "success": "Success",
+ "save": "Save",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "edit": "Edit",
+ "close": "Close",
+ "next": "Next",
+ "previous": "Previous",
+ "search": "Search",
+ "filter": "Filter",
+ "reset": "Reset",
+ "theme": {
+ "light": "Light",
+ "dark": "Dark",
+ "system": "System"
+ },
+ "language": {
+ "et": "Eesti",
+ "en": "English"
+ }
+ },
+ "home": {
+ "title": "TipiLAN 2025",
+ "subtitle": "Estonia's largest student-organized LAN event!",
+ "welcome": "Welcome to TipiLAN 2025!",
+ "description": "Join us at Estonia's largest student-organized LAN event. Games, competitions and much more await you!",
+ "sections": {
+ "schedule": {
+ "description": "TipiLAN is packed with exciting tournaments, mini-competitions and much more."
+ },
+ "tournaments": {
+ "description": "TipiLAN features massive CS2 and LoL tournaments with a prize pool of €10,000."
+ },
+ "expo": {
+ "description": "The TipiLAN expo area hosts companies, additional activities and lectures."
+ },
+ "reserveSpot": "Reserve your spot today!",
+ "poweredBy": "TipiLAN is powered by..."
+ }
+ },
+ "tickets": {
+ "title": "TICKETS AND REGISTRATION",
+ "buyNow": "Buy now",
+ "soldOut": "Sold out",
+ "available": "Available",
+ "price": "Price",
+ "includes": "Includes",
+ "computerParticipant": {
+ "title": "Computer Participant",
+ "price": "8€",
+ "features": [
+ "Personal desk, power and internet connection",
+ "Access to demo area",
+ "Tournament spectating",
+ "Ability to participate in mini-tournaments"
+ ]
+ },
+ "competitor": {
+ "title": "Competitor",
+ "price": "12-15€",
+ "features": [
+ "Ability to participate in the CS2 or LoL tournament",
+ "Personal desk, power and internet connection",
+ "Access to demo area",
+ "Tournament spectating",
+ "Ability to participate in mini-tournaments"
+ ]
+ },
+ "visitor": {
+ "title": "Visitor",
+ "price": "6€",
+ "features": [
+ "Access to demo area",
+ "Tournament spectating",
+ "Ability to participate in mini-tournaments"
+ ]
+ },
+ "buyTicket": "BUY TICKETS"
+ },
+ "tournaments": {
+ "title": "Tournaments",
+ "register": "Register",
+ "participants": "Participants",
+ "prizePool": "Prize pool",
+ "schedule": "Schedule",
+ "rules": "Rules",
+ "cs2": {
+ "title": "CS2 Tournament",
+ "timing": "Timing to be announced",
+ "description1": "TipiLAN hosts one of Estonia's largest CS2 tournaments with a significant prize pool this fall. Grab your friends and experience the adrenaline rush!",
+ "description2": "The prize pool is €5,250, distributed among the TOP3 teams. Each team member receives €600, €300, or €150 based on their placement.",
+ "readRules": "READ RULES",
+ "buyTicket": "BUY TICKETS"
+ },
+ "lol": {
+ "title": "LoL Tournament",
+ "timing": "Timing to be announced",
+ "description1": "TipiLAN hosts one of Estonia's largest LoL tournaments with a significant prize pool this fall. Grab your friends and experience the adrenaline rush!",
+ "description2": "The prize pool is €3,500, distributed among the TOP3 teams. Each team member receives €400, €200, or €100 based on their placement.",
+ "readRules": "READ RULES",
+ "buyTicket": "BUY TICKETS"
+ },
+ "mini": {
+ "title": "Mini-tournaments",
+ "timing": "Timing to be announced",
+ "description1": "TipiLAN hosts various fun and competitive mini-tournaments. Mini-tournaments take place in the following games: SimRacing, Tekken, FIFA, Minecraft Bedwars, Buckshot Roulette, LostGamer and many more.",
+ "description2": "The total prize pool for all tournaments is €1,250 and typically the mini-tournament winner receives a cash prize.",
+ "readRules": "READ RULES",
+ "buyTicket": "BUY TICKETS"
+ }
+ },
+ "schedule": {
+ "title": "Schedule",
+ "day": "Day",
+ "time": "Time",
+ "event": "Event",
+ "location": "Location",
+ "oct24": "October 24th",
+ "oct25": "October 25th",
+ "events": {
+ "doorsOpen": "Doors open",
+ "mainTournamentsStart": "Main tournaments begin",
+ "miniTournamentsKickoff": "Mini-tournaments kick-off",
+ "fightingGamesStart": "Fighting game tournaments start",
+ "doorsClose": "Doors close",
+ "miniTournamentsStart": "Mini-tournaments begin",
+ "granblue": "Granblue tournament",
+ "granTurismo": "Gran Turismo tournament"
+ },
+ "locations": {
+ "registrationSetup": "Registration and setup in auditorium",
+ "auditorium": "Auditorium",
+ "studentHouse": "Student House (Tudengimaja)",
+ "auditoriumAndStudentHouse": "Auditorium and Student House",
+ "entranceHall": "Entrance Hall"
+ }
+ },
+ "stream": {
+ "title": "Stream",
+ "live": "Live",
+ "offline": "Offline",
+ "watchNow": "Watch now"
+ },
+ "footer": {
+ "copyright": "© 2025 TipiLAN. All rights reserved.",
+ "contact": "Contact",
+ "privacy": "Privacy",
+ "terms": "Terms",
+ "studentUnion": "IT Faculty Student Council",
+ "organization": "MTÜ For Tsükkel",
+ "registrationCode": "Registration code",
+ "madeBy": "The TipiLAN website is made with love by",
+ "withHelpFrom": "with the help of"
+ },
+ "notFound": {
+ "title": "404",
+ "message": "We couldn't find this page."
+ },
+ "expo": {
+ "title": "Expo Area",
+ "description": "The TipiLAN expo area hosts companies, additional activities and lectures.",
+ "areas": {
+ "bar": "Bar Area",
+ "boardGames": "Board Games Area",
+ "simRacing": "Red Bull Sim Racing",
+ "fighting": "Fighting Games Area",
+ "photobooth": "Photo booth",
+ "ityk": "TalTech IT Faculty Student Council",
+ "tartuyk": "Tartu University",
+ "estoniagamedev": "Estonia Gamedev",
+ "info": "Information booth",
+ "tly": "Tallinn University",
+ "ittk": "TalTech School of Information Technologies",
+ "gameup": "GameUP!"
+ },
+ "hide": "Hide walls",
+ "show": "Show walls"
+ },
+ "rules": {
+ "title": "Rules",
+ "houseRules": "House Rules",
+ "cs2Rules": "CS2 Rules",
+ "lolRules": "LoL Rules",
+ "miniRules": "Mini-tournament Rules"
+ },
+ "admin": {
+ "title": "Admin",
+ "users": "Users",
+ "teams": "Teams",
+ "success": {
+ "title": "Operation was successful!",
+ "description": "Database data has been updated."
+ },
+ "sync": {
+ "title": "Do you want to update the database?",
+ "description1": "This will pull current data from Fienta and replace",
+ "all": "ALL",
+ "description2": "existing data in the database!",
+ "warning": "If you're not sure, click \"Cancel\".",
+ "update": "Update"
+ },
+ "roles": {
+ "captain": "Captain",
+ "teammate": "Teammate"
+ },
+ "table": {
+ "name": "Name",
+ "members": "Members",
+ "noMembers": "No members"
+ }
+ }
+}
diff --git a/translations/et.json b/translations/et.json
new file mode 100644
index 0000000..826307f
--- /dev/null
+++ b/translations/et.json
@@ -0,0 +1,227 @@
+{
+ "navigation": {
+ "home": "Avaleht",
+ "schedule": "Ajakava",
+ "admin": "Haldus",
+ "houserules": "Kodukord",
+ "expo": "Messiala",
+ "tickets": "Piletid",
+ "rules": "Reeglid",
+ "stream": "Striim",
+ "tournaments": "Turniirid"
+ },
+ "common": {
+ "loading": "Laadimine...",
+ "error": "Viga",
+ "success": "Õnnestus",
+ "save": "Salvesta",
+ "cancel": "Tühista",
+ "delete": "Kustuta",
+ "edit": "Muuda",
+ "close": "Sulge",
+ "next": "Järgmine",
+ "previous": "Eelmine",
+ "search": "Otsi",
+ "filter": "Filtreeri",
+ "reset": "Lähtesta",
+ "theme": {
+ "light": "Hele",
+ "dark": "Tume",
+ "system": "Süsteemipõhine"
+ },
+ "language": {
+ "et": "Eesti",
+ "en": "English"
+ }
+ },
+ "home": {
+ "title": "TipiLAN 2025",
+ "subtitle": "Eesti suurim tudengite korraldatud LAN!",
+ "welcome": "Tere tulemast TipiLAN 2025 sündmusele!",
+ "description": "Liitu meiega Eesti suurimal tudengite korraldatud LAN-üritusel. Mängud, võistlused ja palju muud ootavad sind!",
+ "sections": {
+ "schedule": {
+ "description": "TipiLAN on pungil põnevatest turniiridest, mini-võistlustest ja paljust muust."
+ },
+ "tournaments": {
+ "description": "TipiLANil toimuvad suurejoonelised CS2 ja LoL turniirid, mille auhinnafond on 10 000€."
+ },
+ "expo": {
+ "description": "TipiLANi messialal paiknevad ettevõtted, lisategevused ja toimuvad loengud."
+ },
+ "reserveSpot": "Broneeri oma koht juba täna!",
+ "poweredBy": "TipiLANi tõmbab käima..."
+ }
+ },
+ "tickets": {
+ "title": "PILETID JA REGISTREERIMINE",
+ "buyNow": "Osta nüüd",
+ "soldOut": "Välja müüdud",
+ "available": "Saadaval",
+ "price": "Hind",
+ "includes": "Sisaldab",
+ "computerParticipant": {
+ "title": "Arvutiga osaleja",
+ "price": "8€",
+ "features": [
+ "Isiklik laud, voolu- ja internetiühendus",
+ "Ligipääs demoalale",
+ "Turniiride pealt vaatamine",
+ "Võimalus osaleda miniturniiridel"
+ ]
+ },
+ "competitor": {
+ "title": "Võistleja",
+ "price": "12-15€",
+ "features": [
+ "Võimalus osaleda CS2 või LoL turniiril",
+ "Isiklik laud, voolu- ja internetiühendus",
+ "Ligipääs demoalale",
+ "Turniiride pealt vaatamine",
+ "Võimalus osaleda miniturniiridel"
+ ]
+ },
+ "visitor": {
+ "title": "Külastaja",
+ "price": "6€",
+ "features": [
+ "Ligipääs demoalale",
+ "Turniiride pealt vaatamine",
+ "Võimalus osaleda miniturniiridel"
+ ]
+ },
+ "buyTicket": "OSTA PILET"
+ },
+ "tournaments": {
+ "title": "Turniirid",
+ "register": "Registreeru",
+ "participants": "Osalejad",
+ "prizePool": "Auhinnafond",
+ "schedule": "Ajakava",
+ "rules": "Reeglid",
+ "cs2": {
+ "title": "CS2 turniir",
+ "timing": "Toimumisaeg veel selgumisel",
+ "description1": "TipiLANil toimub Eesti ühe suurima auhinnafondiga CS2 turniire juba sel sügisel. Haara kaasa sõbrad ja saa osa adrenaliinirohkest kogemusest!",
+ "description2": "Auhinnafond on suuruses 5250€, mis jaotatakse TOP3 meeskonna vahel ära. Iga tiimiliige saab vastavalt saavutatud kohale auhinnaks kas 600€, 300€ või 150€.",
+ "readRules": "LOE REEGLEID",
+ "buyTicket": "OSTA PILET"
+ },
+ "lol": {
+ "title": "LoL turniir",
+ "timing": "Toimumisaeg veel selgumisel",
+ "description1": "TipiLANil toimub Eesti ühe suurima auhinnafondiga LoL turniire juba sel sügisel. Haara kaasa sõbrad ja saa osa adrenaliinirohkest kogemusest!",
+ "description2": "Auhinnafond on suuruses 3500€, mis jaotatakse TOP3 meeskonna vahel ära. Iga tiimiliige saab vastavalt saavutatud kohale auhinnaks kas 400€, 200€ või 100€.",
+ "readRules": "LOE REEGLEID",
+ "buyTicket": "OSTA PILET"
+ },
+ "mini": {
+ "title": "Miniturniirid",
+ "timing": "Toimumisaeg veel selgumisel",
+ "description1": "TipiLANil toimub mitmeid erinevaid lõbusaid ja võistlushimu tekitavaid miniturniire. Miniturniirid toimuvad järgnevates mängudes: SimRacing, Tekken, FIFA, Minecraft Bedwars, Buckshot Roulette, LostGamer ja palju muud.",
+ "description2": "Auhinnafond on kõigi turniiride peale 1250€ ja reeglina saab rahalise auhinna miniturniiri võitja.",
+ "readRules": "LOE REEGLEID",
+ "buyTicket": "OSTA PILET"
+ }
+ },
+ "schedule": {
+ "title": "Ajakava",
+ "day": "Päev",
+ "time": "Aeg",
+ "event": "Sündmus",
+ "location": "Asukoht",
+ "oct24": "24. oktoober",
+ "oct25": "25. oktoober",
+ "events": {
+ "doorsOpen": "Uksed avatakse",
+ "mainTournamentsStart": "Põhiturniirid algavad",
+ "miniTournamentsKickoff": "Miniturniiride kick-off",
+ "fightingGamesStart": "Fighting games turniiride algus",
+ "doorsClose": "Uksed suletakse",
+ "miniTournamentsStart": "Miniturniirid algavad",
+ "granblue": "Granblue turniir",
+ "granTurismo": "Gran Turismo turniir"
+ },
+ "locations": {
+ "registrationSetup": "Registreerimine ja setup aulas",
+ "auditorium": "Aula",
+ "studentHouse": "Tudengimaja",
+ "auditoriumAndStudentHouse": "Aula ja Tudengimaja",
+ "entranceHall": "Fuajee"
+ }
+ },
+ "stream": {
+ "title": "Striim",
+ "live": "Otse-eetris",
+ "offline": "Väljas",
+ "watchNow": "Vaata nüüd"
+ },
+ "footer": {
+ "copyright": "© 2025 TipiLAN. Kõik õigused kaitstud.",
+ "contact": "Kontakt",
+ "privacy": "Privaatsus",
+ "terms": "Tingimused",
+ "studentUnion": "IT-teaduskonna üliõpilaskogu",
+ "organization": "MTÜ For Tsükkel",
+ "registrationCode": "Registrikood",
+ "madeBy": "TipiLANi veebileht on tehtud armastusega",
+ "withHelpFrom": "poolt, kellele oli abiks"
+ },
+ "notFound": {
+ "title": "404",
+ "message": "Seda lehte me ei leidnud."
+ },
+ "expo": {
+ "title": "Messiala",
+ "description": "TipiLANi messialal paiknevad ettevõtted, lisategevused ja toimuvad loengud.",
+ "areas": {
+ "bar": "Baariala",
+ "boardGames": "Lauamängude ala",
+ "simRacing": "Red Bull Sim Racing",
+ "fighting": "Võitlusmängu ala",
+ "photobooth": "Fotoboks",
+ "ityk": "IT-teaduskonna üliõpilaskogu",
+ "tartuyk": "Tartu Ülikool",
+ "estoniagamedev": "Eesti Gamedev",
+ "info": "Infoboks",
+ "tly": "Tallinna Ülikool",
+ "ittk": "TalTech IT-Teaduskond",
+ "gameup": "GameUP!"
+ },
+ "hide": "Peida seinad",
+ "show": "Näita seinu"
+ },
+ "rules": {
+ "title": "Reeglid",
+ "houseRules": "Kodukord",
+ "cs2Rules": "CS2 Reeglid",
+ "lolRules": "LoL Reeglid",
+ "miniRules": "Miniturniiride Reeglid"
+ },
+ "admin": {
+ "title": "Haldus",
+ "users": "Kasutajaid",
+ "teams": "Meeskondasid",
+ "success": {
+ "title": "Toiming oli edukas!",
+ "description": "Andmebaasi andmed on uuendatud."
+ },
+ "sync": {
+ "title": "Kas soovite värskendada andmebaasi?",
+ "description1": "See tõmbab Fientast praegused andmed ning asendab",
+ "all": "KÕIK",
+ "description2": "olemasolevad andmed andmebaasis!",
+ "warning": "Kui sa ei ole kindel, vajuta \"Tühista\".",
+ "update": "Värskenda"
+ },
+ "roles": {
+ "captain": "Kapten",
+ "teammate": "Meeskonnaliige"
+ },
+ "table": {
+ "name": "Nimi",
+ "members": "Liikmed",
+ "noMembers": "Liikmeid puuduvad"
+ }
+ }
+}