diff --git a/assets/fonts.scss b/assets/fonts.scss
index e0979986..5405e45b 100644
--- a/assets/fonts.scss
+++ b/assets/fonts.scss
@@ -1,52 +1,88 @@
-/* quicksand-regular - latin-ext_latin */
-@font-face {
- font-family: 'Quicksand';
- font-style: normal;
- font-weight: 400;
- src: url('/fonts/quicksand-v21-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */
- src: local('Quicksand'),
- url('/fonts/quicksand-v21-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('/fonts/quicksand-v21-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
- url('/fonts/quicksand-v21-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */
- url('/fonts/quicksand-v21-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
- url('/fonts/quicksand-v21-latin-ext_latin-regular.svg#Quicksand') format('svg'); /* Legacy iOS */
+@use "sass:list";
+
+@if list.index($fonts, 'Quicksand') {
+ /* quicksand-regular - latin-ext_latin */
+ @font-face {
+ font-family: 'Quicksand';
+ font-style: normal;
+ font-weight: 400;
+ src: url('/fonts/quicksand-v21-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */
+ src: local('Quicksand'),
+ url('/fonts/quicksand-v21-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('/fonts/quicksand-v21-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('/fonts/quicksand-v21-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('/fonts/quicksand-v21-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('/fonts/quicksand-v21-latin-ext_latin-regular.svg#Quicksand') format('svg'); /* Legacy iOS */
+ }
+ /* quicksand-700 - latin-ext_latin */
+ @font-face {
+ font-family: 'Quicksand';
+ font-style: normal;
+ font-weight: 700;
+ src: url('/fonts/quicksand-v21-latin-ext_latin-700.eot'); /* IE9 Compat Modes */
+ src: local('Quicksand'),
+ url('/fonts/quicksand-v21-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('/fonts/quicksand-v21-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */
+ url('/fonts/quicksand-v21-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */
+ url('/fonts/quicksand-v21-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('/fonts/quicksand-v21-latin-ext_latin-700.svg#Quicksand') format('svg'); /* Legacy iOS */
+ }
}
-/* quicksand-700 - latin-ext_latin */
-@font-face {
- font-family: 'Quicksand';
- font-style: normal;
- font-weight: 700;
- src: url('/fonts/quicksand-v21-latin-ext_latin-700.eot'); /* IE9 Compat Modes */
- src: local('Quicksand'),
- url('/fonts/quicksand-v21-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('/fonts/quicksand-v21-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */
- url('/fonts/quicksand-v21-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */
- url('/fonts/quicksand-v21-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
- url('/fonts/quicksand-v21-latin-ext_latin-700.svg#Quicksand') format('svg'); /* Legacy iOS */
+
+@if list.index($fonts, 'Nunito') {
+ /* nunito-regular - latin-ext_latin_cyrillic-ext_cyrillic */
+ @font-face {
+ font-family: 'Nunito';
+ font-style: normal;
+ font-weight: 400;
+ src: url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff') format('woff'), /* Modern Browsers */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.svg#Nunito') format('svg'); /* Legacy iOS */
+ }
+ /* nunito-700 - latin-ext_latin_cyrillic-ext_cyrillic */
+ @font-face {
+ font-family: 'Nunito';
+ font-style: normal;
+ font-weight: 700;
+ src: url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2') format('woff2'), /* Super Modern Browsers */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.woff') format('woff'), /* Modern Browsers */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.svg#Nunito') format('svg'); /* Legacy iOS */
+ }
}
-/* nunito-regular - latin-ext_latin_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Nunito';
- font-style: normal;
- font-weight: 400;
- src: url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot'); /* IE9 Compat Modes */
- src: local(''),
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2') format('woff2'), /* Super Modern Browsers */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff') format('woff'), /* Modern Browsers */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.ttf') format('truetype'), /* Safari, Android, iOS */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-regular.svg#Nunito') format('svg'); /* Legacy iOS */
-}
-/* nunito-700 - latin-ext_latin_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Nunito';
- font-style: normal;
- font-weight: 700;
- src: url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.eot'); /* IE9 Compat Modes */
- src: local(''),
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2') format('woff2'), /* Super Modern Browsers */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.woff') format('woff'), /* Modern Browsers */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.ttf') format('truetype'), /* Safari, Android, iOS */
- url('/fonts/nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-700.svg#Nunito') format('svg'); /* Legacy iOS */
+
+@if list.index($fonts, 'Zen Maru Gothic') {
+ /* zen-maru-gothic-regular - latin_japanese */
+ @font-face {
+ font-family: 'Zen Maru Gothic';
+ font-style: normal;
+ font-weight: 400;
+ src: url('/fonts/zen-maru-gothic-v4-latin_japanese-regular.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff') format('woff'), /* Modern Browsers */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-regular.svg#ZenMaruGothic') format('svg'); /* Legacy iOS */
+ }
+ /* zen-maru-gothic-700 - latin_japanese */
+ @font-face {
+ font-family: 'Zen Maru Gothic';
+ font-style: normal;
+ font-weight: 700;
+ src: url('/fonts/zen-maru-gothic-v4-latin_japanese-700.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-700.woff2') format('woff2'), /* Super Modern Browsers */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-700.woff') format('woff'), /* Modern Browsers */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-700.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('/fonts/zen-maru-gothic-v4-latin_japanese-700.svg#ZenMaruGothic') format('svg'); /* Legacy iOS */
+ }
}
diff --git a/assets/style.scss b/assets/style.scss
index 62759616..6ae710d5 100644
--- a/assets/style.scss
+++ b/assets/style.scss
@@ -1,7 +1,7 @@
-@import "fonts";
-
@import "variables";
+@import "fonts";
+
@import "~bootstrap/scss/root";
@import "~bootstrap/scss/reboot";
@import "~bootstrap/scss/type";
diff --git a/assets/variables.scss b/assets/variables.scss
index 39e8d3c1..5fc0fc5c 100644
--- a/assets/variables.scss
+++ b/assets/variables.scss
@@ -1,5 +1,8 @@
-$font-family-sans-serif: Nunito, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
-$headings-font-family: Quicksand, Nunito, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
+@import "../data/variables";
+$fonts: $fontHeadings $fontText;
+
+$font-family-sans-serif: $fontText, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
+$headings-font-family: $fontHeadings, $fontText, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
$primary: #C71585;
$alert-border-level: -3;
diff --git a/locale/_/variables.scss b/locale/_/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/_/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/_base/variables.scss b/locale/_base/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/_base/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/de/variables.scss b/locale/de/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/de/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/en/variables.scss b/locale/en/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/en/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/es/variables.scss b/locale/es/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/es/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/fr/variables.scss b/locale/fr/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/fr/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/gl/variables.scss b/locale/gl/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/gl/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/ja/variables.scss b/locale/ja/variables.scss
new file mode 100644
index 00000000..c7a3c753
--- /dev/null
+++ b/locale/ja/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Zen Maru Gothic';
+$fontText: 'Zen Maru Gothic';
diff --git a/locale/nl/variables.scss b/locale/nl/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/nl/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/no/variables.scss b/locale/no/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/no/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/pl/variables.scss b/locale/pl/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/pl/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/pt/variables.scss b/locale/pt/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/pt/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/ru/variables.scss b/locale/ru/variables.scss
new file mode 100644
index 00000000..62e46727
--- /dev/null
+++ b/locale/ru/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Nunito';
+$fontText: 'Nunito';
diff --git a/locale/yi/variables.scss b/locale/yi/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/yi/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/locale/zh/variables.scss b/locale/zh/variables.scss
new file mode 100644
index 00000000..2c90afdf
--- /dev/null
+++ b/locale/zh/variables.scss
@@ -0,0 +1,2 @@
+$fontHeadings: 'Quicksand';
+$fontText: 'Nunito';
diff --git a/server/localeFont.js b/server/localeFont.js
new file mode 100644
index 00000000..03b5ae17
--- /dev/null
+++ b/server/localeFont.js
@@ -0,0 +1,27 @@
+import {registerFont} from "canvas";
+import fs from 'fs';
+
+const vars = {};
+
+for (let [, name, value] of fs.readFileSync(__dirname + '/../data/variables.scss').toString('utf-8').matchAll(/^\$([^:]+): '([^']+)';$/gm)) {
+ vars[name] = value;
+}
+
+const fontSources = {
+ 'Quicksand': 'quicksand-v21-latin-ext_latin-{weight}.ttf',
+ 'Nunito': 'nunito-v16-latin-ext_latin_cyrillic-ext_cyrillic-{weight}.ttf',
+ 'Zen Maru Gothic': 'zen-maru-gothic-v4-latin_japanese-{weight}.ttf',
+}
+
+const weightsValues = {
+ 'bold': '700',
+}
+
+export const registerLocaleFont = (v, weights = ['regular']) => {
+ const family = vars[v];
+ const source = fontSources[family];
+ for (let weight of weights) {
+ registerFont('static/fonts/' + source.replace('{weight}', weightsValues[weight] || weight), {family, weight});
+ }
+ return family;
+}
diff --git a/server/routes/banner.js b/server/routes/banner.js
index f9257d59..c9d68b23 100644
--- a/server/routes/banner.js
+++ b/server/routes/banner.js
@@ -7,6 +7,7 @@ import {buildPronoun, parsePronouns} from "../../src/buildPronoun";
import {loadTsv} from "../../src/tsv";
import {handleErrorAsync} from "../../src/helpers";
import { CacheObject } from "../../src/cache";
+import {registerLocaleFont} from "../localeFont";
const translations = loadSuml('translations');
@@ -38,8 +39,7 @@ router.get('/banner/:pronounName*.png', handleErrorAsync(async (req, res) => {
const pronounName = req.params.pronounName + req.params[0];
const result = await new CacheObject('banner', `${pronounName}.png`, 24 * 60).fetch(async () => {
- registerFont('static/fonts/quicksand-v21-latin-ext_latin-regular.ttf', {family: 'Quicksand', weight: 'regular'});
- registerFont('static/fonts/quicksand-v21-latin-ext_latin-700.ttf', {family: 'Quicksand', weight: 'bold'});
+ const fontName = registerLocaleFont('fontHeadings', ['regular', 'bold']);
const canvas = createCanvas(width, height)
const context = canvas.getContext('2d')
@@ -51,7 +51,7 @@ router.get('/banner/:pronounName*.png', handleErrorAsync(async (req, res) => {
const logo = await loadImage('node_modules/@fortawesome/fontawesome-pro/svgs/light/tags.svg');
leftRatio = 5;
context.drawImage(logo, width / leftRatio - imageSize / 2, height / 2 - imageSize / 1.25 / 2, imageSize, imageSize / 1.25);
- context.font = `regular ${translations.title.length < 10 ? 120 : translations.title.length < 14 ? 80 : 72}pt Quicksand`;
+ context.font = `regular ${translations.title.length < 10 ? 120 : translations.title.length < 14 ? 80 : 72}pt '${fontName}'`;
context.fillText(translations.title, width / leftRatio + imageSize / 1.5, height / 2 + (translations.title.length < 10 ? 48 : translations.title.length < 14 ? 24 : 24));
}
@@ -66,12 +66,12 @@ router.get('/banner/:pronounName*.png', handleErrorAsync(async (req, res) => {
drawCircle(context, avatarImage, width / leftRatio - imageSize / 2, height / 2 - imageSize / 2, imageSize);
- context.font = `regular 48pt Quicksand`
+ context.font = `regular 48pt '${fontName}'`
context.fillText('@' + user.username, width / leftRatio + imageSize, height / 2)
const logo = await loadImage('static/favicon.svg');
- context.font = 'regular 24pt Quicksand'
+ context.font = `regular 24pt '${fontName}'`
context.fillStyle = '#C71585';
const logoSize = 24 * 1.25;
context.drawImage(logo, width / leftRatio + imageSize, height / 2 + logoSize - 4, logoSize, logoSize / 1.25)
@@ -93,11 +93,11 @@ router.get('/banner/:pronounName*.png', handleErrorAsync(async (req, res) => {
}
context.drawImage(logo, width / leftRatio - imageSize / 2, height / 2 - imageSize / 1.25 / 2, imageSize, imageSize / 1.25)
- context.font = 'regular 48pt Quicksand'
+ context.font = `regular 48pt '${fontName}'`;
context.fillText(translations.pronouns.intro + ':', width / leftRatio + imageSize / 1.5, height / 2 - 36)
const pronounNameOptions = pronounName === global.config.pronouns.any ? [global.config.pronouns.any] : pronoun.nameOptions();
- context.font = `bold ${pronounNameOptions.length <= 2 ? '70' : '36'}pt Quicksand`
+ context.font = `bold ${pronounNameOptions.length <= 2 ? '70' : '36'}pt '${fontName}'`;
context.fillText(
pronounNameOptions.map(o => o.replace(/ ?\[[^\]]+] ?/g, '').trim()).join('\n'),
width / leftRatio + imageSize / 1.5,
diff --git a/server/routes/nouns.js b/server/routes/nouns.js
index feef7326..11d28c21 100644
--- a/server/routes/nouns.js
+++ b/server/routes/nouns.js
@@ -5,6 +5,7 @@ import {createCanvas, loadImage, registerFont} from "canvas";
import {loadSuml} from "../loader";
import {clearKey, handleErrorAsync, isTroll} from "../../src/helpers";
import { caches } from "../../src/cache";
+import {registerLocaleFont} from "../localeFont";
const translations = loadSuml('translations');
@@ -195,8 +196,7 @@ router.get('/nouns/:id.png', async (req, res) => {
const height = padding * 2.5 + (maxItems + 1) * 48 + padding;
const mime = 'image/png';
- registerFont('static/fonts/quicksand-v21-latin-ext_latin-regular.ttf', { family: 'Quicksand', weight: 'regular'});
- registerFont('static/fonts/quicksand-v21-latin-ext_latin-700.ttf', { family: 'Quicksand', weight: 'bold'});
+ const fontName = registerLocaleFont('fontHeadings', ['regular', 'bold']);
registerFont('node_modules/@fortawesome/fontawesome-pro/webfonts/fa-light-300.ttf', { family: 'FontAwesome', weight: 'regular'});
const canvas = createCanvas(width, height);
@@ -205,17 +205,17 @@ router.get('/nouns/:id.png', async (req, res) => {
const bg = await loadImage('static/bg.png');
context.drawImage(bg, 0, 0, width, height);
- context.font = 'bold 64pt Quicksand';
+ context.font = `bold 64pt '${fontName}'`;
for (let [column, key, icon] of [[0, 'masculine', '\uf222'], [1, 'feminine', '\uf221'], [2, 'neuter', '\uf22c']]) {
context.font = 'regular 24pt FontAwesome';
context.fillText(icon, column * (width - 2 * padding) / 3 + padding, padding * 1.5);
- context.font = 'bold 24pt Quicksand';
+ context.font = `bold 24pt '${fontName}'`;
context.fillText(translations.nouns[key], column * (width - 2 * padding) / 3 + padding + 36, padding * 1.5);
}
- context.font = 'regular 24pt Quicksand';
+ context.font = `regular 24pt '${fontName}'`;
['masc', 'fem', 'neutr'].forEach((form, column) => {
let i = 0;
for (let [key, symbol] of [['', '⋅'], ['Pl', '⁖']])
@@ -228,7 +228,7 @@ router.get('/nouns/:id.png', async (req, res) => {
context.fillStyle = '#C71585';
context.font = 'regular 16pt FontAwesome';
context.fillText('\uf02c', padding, height - padding + 12);
- context.font = `regular 16pt Quicksand`;
+ context.font = `regular 16pt '${fontName}'`;
context.fillText(
translations.title + '/' + (global.config.nouns.routeMain || global.config.nouns.route),
padding + 36,
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-700.eot b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.eot
new file mode 100644
index 00000000..2b418730
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.eot differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-700.svg b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.svg
new file mode 100644
index 00000000..1f4dfaff
--- /dev/null
+++ b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.svg
@@ -0,0 +1,405 @@
+
+
+
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-700.ttf b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.ttf
new file mode 100644
index 00000000..eeeb18da
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.ttf differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-700.woff b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.woff
new file mode 100644
index 00000000..9a8da98c
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.woff differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-700.woff2 b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.woff2
new file mode 100644
index 00000000..5900db02
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-700.woff2 differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.eot b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.eot
new file mode 100644
index 00000000..91b5a9ff
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.eot differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.svg b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.svg
new file mode 100644
index 00000000..9337dfb4
--- /dev/null
+++ b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.svg
@@ -0,0 +1,399 @@
+
+
+
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.ttf b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.ttf
new file mode 100644
index 00000000..b0f62df5
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.ttf differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff
new file mode 100644
index 00000000..f136dbd5
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff differ
diff --git a/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff2 b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff2
new file mode 100644
index 00000000..d5830dd5
Binary files /dev/null and b/static/fonts/zen-maru-gothic-v4-latin_japanese-regular.woff2 differ