Merge branch 'main' into credentials

This commit is contained in:
Avris 2021-08-29 18:56:42 +02:00
commit 3d6117bd57
61 changed files with 759 additions and 593 deletions

View File

@ -171,12 +171,6 @@ form[disabled] {
list-style: none;
li {
white-space: nowrap;
a:not([href='#']) {
display: none;
}
&:hover a:not([href='#']) {
display: inline;
}
}
>li:before {
content: "";
@ -190,12 +184,6 @@ form[disabled] {
list-style: none;
li {
white-space: nowrap;
a:not([href='#']) {
display: none;
}
&:hover a:not([href='#']) {
display: inline;
}
}
>li:before {
content: "";

View File

@ -14,7 +14,7 @@
</li>
</draggable>
<div class="input-group py-1">
<input v-model="search" class="form-control form-control-sm" :placeholder="$t('crud.search')"/>
<input v-model="search" class="form-control" :placeholder="$t('crud.search')"/>
<button v-if="search" type="button" class="btn btn-light btn-sm border text-danger" @click.prevent="search = ''">
<Icon v="times"/>
</button>

View File

@ -45,13 +45,11 @@
<ul class="list-singular">
<li v-for="w in s.el.masc">
{{ w }}
<a :href="`/api/nouns/${w}.png`" target="_blank" rel="noopener"><Icon v="image"/></a>
</li>
</ul>
<ul v-if="config.nouns.plurals" class="list-plural">
<li v-for="w in s.el.mascPl">
<Spelling :text="w"/>
<a :href="`/api/nouns/${w}.png`" target="_blank" rel="noopener"><Icon v="image"/></a>
</li>
</ul>
@ -73,13 +71,11 @@
<ul class="list-singular">
<li v-for="w in s.el.fem">
<Spelling :text="w"/>
<a :href="`/api/nouns/${w}.png`" target="_blank" rel="noopener"><Icon v="image"/></a>
</li>
</ul>
<ul v-if="config.nouns.plurals" class="list-plural">
<li v-for="w in s.el.femPl">
<Spelling :text="w"/>
<a :href="`/api/nouns/${w}.png`" target="_blank" rel="noopener"><Icon v="image"/></a>
</li>
</ul>
@ -102,14 +98,12 @@
<li v-for="w in s.el.neutr">
<Declension v-if="config.nouns.declension" :word="w" tooltip/>
<template v-else><Spelling :text="w"/></template>
<a :href="`/api/nouns/${w}.png`" target="_blank" rel="noopener"><Icon v="image"/></a>
</li>
</ul>
<ul v-if="config.nouns.plurals" class="list-plural">
<li v-for="w in s.el.neutrPl">
<Declension v-if="config.nouns.declension" :word="w" plural :singularOptions="s.el.neutr" tooltip/>
<template v-else><Spelling :text="w"/></template>
<a :href="`/api/nouns/${w}.png`" target="_blank" rel="noopener"><Icon v="image"/></a>
</li>
</ul>
@ -172,6 +166,16 @@
</span>
</button>
</li>
<li>
<a :href="`/api/nouns/${s.el.id}.png`" target="_blank" rel="noopener"
class="btn btn-concise btn-outline-primary btn-sm m-1"
>
<Icon v="image"/>
<span class="btn-label">
<T>nouns.image</T>
</span>
</a>
</li>
</ul>
</td>
</template></template>

View File

@ -1,6 +1,6 @@
<template>
<span class="flag-wrapper">
<a v-if="link" :href="`/${config.nouns.route}/${config.nouns.terms.route}#${link.toLowerCase()}`" :title="alt">
<a v-if="link" :href="`/${config.nouns.route}/${config.terminology.route}#${link.toLowerCase()}`" :title="alt">
<img :src="img" :alt="name" class="flag-mini rounded"/>
<Spelling escape :text="name"/><sup v-if="custom" class="text-muted"><small><Icon v="user"/></small></sup>
</a>
@ -29,23 +29,37 @@
},
computed: {
link() {
if (!this.config.nouns.terms.enabled || !(this.config.nouns.terms.published || this.$isGranted('terms'))) {
if (!this.config.terminology.enabled || !(this.config.terminology.published || this.$isGranted('terms'))) {
return null;
}
let fallback = null;
for (let term of this.terms || []) {
if (term.key && term.key.toLowerCase().includes(this.alt.toLowerCase())) {
// exact match
if (term.key && term.key.toLowerCase() === this.alt.toLowerCase()) {
return term.key;
}
if (term.term.toLowerCase().includes(this.name.toLowerCase())) {
if (term.term.toLowerCase() === this.name.toLowerCase()) {
return this.name;
}
if (term.original.toLowerCase().includes(this.alt.toLowerCase())) {
if (term.original.toLowerCase() === this.alt.toLowerCase()) {
return this.alt;
}
// fallback
if (term.key && term.key.toLowerCase().includes(this.alt.toLowerCase())) {
fallback = term.key;
}
if (term.term.toLowerCase().includes(this.name.toLowerCase())) {
fallback = this.name;
}
if (term.original.toLowerCase().includes(this.alt.toLowerCase())) {
fallback = this.alt;
}
}
return null;
return fallback;
},
},
}

View File

@ -160,11 +160,11 @@
for (let subroute of this.config.nouns.subroutes || []) {
extras.push(`/${this.config.nouns.route}/${subroute}`);
}
if (this.config.nouns.inclusive.enabled) {
extras.push(`/${this.config.nouns.route}/${this.config.nouns.inclusive.route}`);
if (this.config.inclusive.enabled) {
extras.push(`/${this.config.inclusive.route}`);
}
if (this.config.nouns.terms.enabled) {
extras.push(`/${this.config.nouns.route}/${this.config.nouns.terms.route}`);
if (this.config.terminology.enabled) {
extras.push(`/${this.config.terminology.route}`);
}
links.push({

View File

@ -22,7 +22,7 @@
</button>
</div>
<div class="btn-group mb-3 d-none d-md-flex bg-white category-filter">
<button v-for="category in config.nouns.inclusive.categories"
<button v-for="category in config.inclusive.categories"
:class="['btn btn-sm', filter === ':' + category ? 'btn-primary' : 'btn-outline-primary']"
@click="filter = filter === ':' + category ? '' : ':' + category"
>
@ -35,15 +35,15 @@
<template v-slot:header>
<th class="text-nowrap">
<Icon v="comment-times"/>
<T>nouns.inclusive.insteadOf</T>
<T>inclusive.insteadOf</T>
</th>
<th class="text-nowrap">
<Icon v="comment-check"/>
<T>nouns.inclusive.say</T>
<T>inclusive.say</T>
</th>
<th class="text-nowrap">
<Icon v="comment-dots"/>
<T>nouns.inclusive.because</T>
<T>inclusive.because</T>
</th>
<th></th>
</template>
@ -278,7 +278,7 @@
},
watch: {
filter() {
this.setHash(this.config.nouns.inclusive.hashNamespace || '', this.filter);
this.setHash(this.config.inclusive.hashNamespace || '', this.filter);
if (this.$refs.dictionarytable) {
this.$refs.dictionarytable.reset();
this.$refs.dictionarytable.focus();

View File

@ -17,7 +17,7 @@
<div class="form-group">
<label class="text-nowrap"><strong>
<Icon v="comment-times"/>
<T>nouns.inclusive.insteadOf</T>
<T>inclusive.insteadOf</T>
</strong></label>
<NounForm v-model="form.insteadOf" maxlength="128"/>
</div>
@ -26,7 +26,7 @@
<div class="form-group">
<label class="text-nowrap"><strong>
<Icon v="comment-check"/>
<T>nouns.inclusive.say</T>
<T>inclusive.say</T>
</strong></label>
<NounForm v-model="form.say" maxlength="128"/>
</div>
@ -36,14 +36,14 @@
<div class="form-group">
<label class="text-nowrap"><strong>
<Icon v="comment-dots"/>
<T>nouns.inclusive.because</T>
<T>inclusive.because</T>
</strong></label>
<textarea v-model="form.because" class="form-control form-control-sm" required rows="6"></textarea>
</div>
<div class="form-group">
<label><strong><T>nouns.inclusive.categories</T>:</strong></label>
<a v-for="category in config.nouns.inclusive.categories"
<label><strong><T>inclusive.categories</T>:</strong></label>
<a v-for="category in config.inclusive.categories"
href="#" :class="['badge border mx-1 text-decoration-none', form.categories.includes(category) ? 'bg-primary text-white' : 'bg-light text-primary']"
@click.prevent="form.categories = form.categories.includes(category) ? form.categories.filter(c => c !== category) : [...form.categories, category]"
>
@ -52,7 +52,7 @@
</div>
<div class="form-group">
<label><strong><T>nouns.inclusive.sources</T>:</strong></label>
<label><strong><T>inclusive.sources</T>:</strong></label>
<ListInput v-model="form.links" v-slot="s">
<input v-model="s.val" type="url" class="form-control" @keyup="s.update(s.val)" required/>
</ListInput>

View File

@ -1,6 +1,7 @@
<template>
<draggable tag="ul" v-model="iVal" handle=".handle" ghostClass="ghost" @end="$emit('input', iVal)" class="list-unstyled" :group="group">
<li v-for="(v, i) in iVal" ref="items">
<div>
<div class="input-group input-group-sm mb-1">
<button class="btn btn-light border handle" type="button" :aria-label="$t('table.sort')">
<Icon v="bars"/>
@ -12,6 +13,8 @@
<Icon v="times"/>
</button>
</div>
<slot name="validation" v-bind:val="iVal[i]"></slot>
</div>
</li>
<li slot="footer">

View File

@ -1,5 +1,6 @@
<template>
<ListInput v-model="v" :prototype="{key: '', value: 0}" v-slot="s" :group="group">
<ListInput v-model="v" :prototype="{key: '', value: 0}" :group="group">
<template v-slot="s">
<button type="button" :class="['btn', parseInt(s.val.value) === 1 ? 'btn-primary' : 'btn-outline-secondary']"
:aria-label="$t('profile.opinion.yes')"
:title="$t('profile.opinion.yes')"
@ -24,11 +25,14 @@
@click="s.update({key: s.val.key, value: -1})">
<Icon v="thumbs-down"/>
</button>
<input v-model="s.val.key" class="form-control mw-input" @keyup="s.update(s.val)" required/>
<small v-if="validation && s.val.key && validation(s.val.key)" class="input-group-text bg-danger text-white">
<input v-model="s.val.key" :class="['form-control', 'mw-input', invalid(s.val) ? 'border-danger' : '']" @keyup="s.update(s.val)" required/>
</template>
<template v-slot:validation="s">
<p v-if="invalid(s.val)" class="small text-danger">
<Icon v="exclamation-triangle"/>
<span class="ml-1">{{$t(validation(s.val.key))}}</span>
</small>
</p>
</template>
</ListInput>
</template>
@ -40,6 +44,11 @@
validation: {},
},
data() { return { v: this.value } },
watch: { v() { this.$emit('input', this.v); } }
watch: { v() { this.$emit('input', this.v); } },
methods: {
invalid(val) {
return this.validation && val.key && this.validation(val.key)
},
},
}
</script>

View File

@ -1,7 +1,7 @@
<template>
<div>
<div class="mb-3 d-flex justify-content-between flex-column flex-md-row">
<h2 class="text-nowrap">
<h2 class="text-nowrap mw-50">
<Avatar :user="user"/>
@{{user.username}}
</h2>
@ -47,7 +47,7 @@
</section>
<section class="row">
<div v-if="Object.keys(profile.names).length" class="col-6 col-lg-4">
<div v-if="Object.keys(profile.names).length" :class="['col-6', mainRowCount === 3 ? 'col-lg-4' : 'col-lg-6']">
<h3>
<Icon v="signature"/>
<T>profile.names</T>
@ -57,7 +57,7 @@
<li v-for="(opinion, name) in profile.names"><Opinion :word="name" :opinion="opinion"/></li>
</ul>
</div>
<div v-if="Object.keys(profile.pronouns).length" class="col-6 col-lg-4">
<div v-if="Object.keys(profile.pronouns).length" :class="['col-6', mainRowCount === 3 ? 'col-lg-4' : 'col-lg-6']">
<h3>
<Icon v="tags"/>
<T>profile.pronouns</T>
@ -69,7 +69,7 @@
</li>
</ul>
</div>
<div v-if="profile.links.length" class="col-12 col-lg-4">
<div v-if="profile.links.length" :class="['col-12', mainRowCount === 3 ? 'col-lg-4' : 'col-lg-6']">
<h3>
<Icon v="link"/>
<T>profile.links</T>
@ -83,14 +83,14 @@
</div>
</section>
<section class="clearfix">
<section class="clearfix" v-if="Object.values(profile.words).map(w => Object.keys(w).length).reduce((a, b) => a + b, 0) > 0">
<h3>
<Icon v="scroll-old"/>
<T>profile.words</T>
</h3>
<div class="row">
<div v-for="group in profile.words" v-if="Object.keys(profile.words).length" class="col-6 col-lg-3">
<div v-for="group in profile.words" v-if="Object.keys(group).length" class="col-6 col-lg-3">
<ul class="list-unstyled">
<li v-for="(opinion, word) in group"><Opinion :word="word" :opinion="opinion"/></li>
</ul>
@ -185,6 +185,13 @@
hasDescriptionColumn() {
return this.profile.age || this.profile.description.trim().length || this.profile.team;
},
mainRowCount() {
let c = 0;
if (Object.keys(this.profile.names).length) { c++; }
if (Object.keys(this.profile.pronouns).length) { c++; }
if (this.profile.links.length) { c++; }
return c;
}
},
};
</script>
@ -195,4 +202,8 @@
max-width: 5rem;
max-height: 5rem;
}
.mw-50 {
min-width: 50%;
}
</style>

View File

@ -56,13 +56,18 @@
<p class="small text-muted mb-0">
<T>sources.submit.pronounsInfo</T>
</p>
<ListInput v-model="form.pronouns" v-slot="s">
<ListInput v-model="form.pronouns">
<template v-slot="s">
<input v-model="s.val" type="text" class="form-control" @keyup="s.update(s.val)" required maxlength="24"/>
<small v-if="s.val && !pronounLibrary.isCanonical(s.val) && !(config.sources.extraTypes || []).includes(s.val)"
class="input-group-text bg-danger text-white">
</template>
<template v-slot:validation="s">
<p v-if="s.val && !pronounLibrary.isCanonical(s.val) && !(config.sources.extraTypes || []).includes(s.val)"
class="small text-danger"
>
<Icon v="exclamation-triangle"/>
<span class="ml-1"><T>profile.pronounsNotFound</T></span>
</small>
</p>
</template>
</ListInput>
</div>
<div class="form-group">

View File

@ -22,7 +22,7 @@
</button>
</div>
<div class="btn-group mb-3 d-none d-md-flex bg-white category-filter">
<button v-for="category in config.nouns.terms.categories"
<button v-for="category in config.terminology.categories"
:class="['btn btn-sm', filter === ':' + category ? 'btn-primary' : 'btn-outline-primary']"
@click="filter = filter === ':' + category ? '' : ':' + category"
>
@ -177,7 +177,15 @@
// those must be methods, not computed, because when modified, they don't get updated in the view for some reason
visibleEntries() {
return Object.values(this.entries).filter(n => n.matches(this.filter));
const values = Object.values(this.entries).filter(n => n.matches(this.filter));
if (this.filter) {
return values.sort((a, b) => {
if (a.key && a.key.toLowerCase() === this.filter.toLowerCase()) { return -1; }
if (b.key && b.key.toLowerCase() === this.filter.toLowerCase()) { return 1; }
return a.term[0].localeCompare(b.term[0]);
})
}
return values;
},
entriesCountApproved() {
return Object.values(this.entries).filter(n => n.approved).length;
@ -212,7 +220,7 @@
},
watch: {
filter() {
this.setHash(this.config.nouns.terms.hashNamespace || '', this.filter);
this.setHash(this.config.terminology.hashNamespace || '', this.filter);
if (this.$refs.dictionarytable) {
this.$refs.dictionarytable.reset();
this.$refs.dictionarytable.focus();

View File

@ -16,7 +16,7 @@
<div class="col-12 col-lg-6">
<div class="form-group">
<label class="text-nowrap"><strong>
<T>nouns.terms.term</T>
<T>terminology.term</T>
</strong></label>
<NounForm v-model="form.term" required maxlength="128"/>
</div>
@ -24,7 +24,7 @@
<div class="col-12 col-lg-6">
<div class="form-group">
<label class="text-nowrap"><strong>
<T>nouns.terms.original</T>
<T>terminology.original</T>
</strong></label>
<NounForm v-model="form.original" maxlength="1024"/>
</div>
@ -33,14 +33,14 @@
<div class="form-group">
<label class="text-nowrap"><strong>
<T>nouns.terms.definition</T>
<T>terminology.definition</T>
</strong></label>
<textarea v-model="form.definition" class="form-control form-control-sm" required rows="6"></textarea>
</div>
<div class="form-group">
<label><strong><T>nouns.terms.category</T>:</strong></label>
<a v-for="category in config.nouns.terms.categories"
<label><strong><T>terminology.category</T>:</strong></label>
<a v-for="category in config.terminology.categories"
href="#" :class="['badge border mx-1 text-decoration-none', form.categories.includes(category) ? 'bg-primary text-white' : 'bg-light text-primary']"
@click.prevent="form.categories = form.categories.includes(category) ? form.categories.filter(c => c !== category) : [...form.categories, category]"
>
@ -65,7 +65,7 @@
<div class="col-12 col-lg-4">
<div class="form-group">
<label class="text-nowrap"><strong>
<T>nouns.terms.images</T>
<T>terminology.images</T>
</strong></label>
<ImageWidget v-model="form.images" multiple sizes="big,thumb"/>
</div>

View File

@ -10,9 +10,11 @@ sources:
nouns:
enabled: false
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: false
names:

View File

@ -42,9 +42,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'sexuelle Orientierung'

View File

@ -70,7 +70,7 @@ pronouns:
short: 'beliebig'
description: >
Auch wenn es für manche Menschen sehr wichtig ist, dass bestimmte Pronomen benutzt werden, wenn über sie geredet wird, ist es anderen egal, welche Pronomen für sie verwendet werden.
options: 'Überprüfe die Optionen [share]{/=hier}.'
options: 'Überprüfe die Optionen [share]{/pronomen=hier}.'
others: 'Andere Formen'
othersRaw: 'andere'
or: 'oder'
@ -163,7 +163,9 @@ nouns:
plural: 'Plural'
pluralShort: 'Pl.'
terms:
image: 'Bild'
terminology:
header: 'Terminologie'
headerLong: 'Wörterbuch von Queerer Terminologie'
info:
@ -405,8 +407,11 @@ profile:
description: 'Beschreibung'
names: 'Namen'
pronouns: 'Pronomen'
pronounsInfo: 'Du kannst entweder ein Pronomen (z.B. „sier“ or „sie/ihr“) oder einen Link (z.B. „https://de.pronouns.page/dey“) oder vier benutzerdefinierten Formen (z.B. „xier/xies/xiem/xien“).'
pronounsNotFound: 'Wir können keinen Link zu diesem Pronomen finden!'
pronounsInfo: >
Du kannst entweder ein <strong>Pronomen</strong> (z.B. „sier“ or „sie/ihr“) oder einen <strong>Link</strong> (z.B. „https://de.pronouns.page/dey“)
oder <strong>vier benutzerdefinierten Formen</strong> (z.B. „xier/xies/xiem/xien“).
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: 'Wir können keinen Link zu diesem Pronomen finden!' # TODO 'Unrecognised format. Please check out the instruction above.'
words: 'Wörter'
birthday: 'Alter'
birthdayInfo: 'Wir veröffentlichen nicht dein Geburtstag, sondern nur das errechnete Alter.'

View File

@ -27,7 +27,7 @@ Yup, she calls it “torture” when someone… asks her a question. And not a d
She's not being asked what her genitals are. She's not being asked her gender identity.
Someone's literally just trying to establish the basis for the conversation by knowing how to talk to / about her.
And the answer is literally two syllables!
Yes, that question _might_ be tricky sometimes,
Yes, that question _might_ be tricky _sometimes_,
but she's not a closeted trans person who could feel anxious trying to decide if the situation is safe enough
to give someone their real pronouns. No. She's just a brat. A snowflake.

View File

@ -15,7 +15,7 @@ Another thing that we see quite often in people's cards is a description like th
Sure, policing someone's neopronouns would be transphobic. And that's why we don't do that.
Paw can easily link to paw's pronouns by putting in all five grammatical forms
([paw/paw/paw's/paw's/pawself](https://en.pronouns.page/paw/paw/paw's/paw's/pawself)),
by using a shorthand notation for nameself pronouns ([:paw](https://en.pronouns.page/:paw)),
by using a shorthand notation for the nameself pronouns ([:paw](https://en.pronouns.page/:paw)),
or by using a generator that's available in the [Pronouns](/pronouns) section.
We talk about it in the instructions in the card editor
if only people would read them before rushing to get angry…
@ -32,4 +32,4 @@ There's _actual_ queerphobia destroying people's lives all around the world
but you use that word to describe a _minor inconvenience_ completely unrelated to your gender or orientation?
Think about it… If you message a group of queer volunteers doing their best to create a free website for the community,
and you call them “homophobes”, how do you expect allocishet people take queerphobia seriously?
and you call them “homophobes”, how do you expect allocishet people to take queerphobia seriously?

View File

@ -71,9 +71,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'sexual orientation'
@ -87,7 +89,7 @@ nouns:
- 'politics'
- 'prejudice'
route: 'terms'
route: 'terminology'
names:
enabled: false

View File

@ -1,4 +1,5 @@
name pronouns description
Normative forms she,he It's worth mentioning that pronouns ≠ gender. One can still be nonbinary while using pronouns that are congruent with (or opposite to) their gender assigned at birth.
Normative-ish forms they,they/them/themself,it,one Those pronouns have been in common use in normative English already, but recently they got a slightly different new usage: describing a single, specific person.
Neopronouns ae,co,e,e/em/es,ey,fae,hu,ne,ne/nir,per,s/he,thon,ve,vi,vi/vim,xe,ze,ze/zir,zhe Unlike the other pronouns, which are officially recognised as “grammatically correct”, albeit used in a different meaning than we're used to, neopronouns are novel. Not being included in dictionaries doesn't make them any worse, though! Some neoprouns' names are derived from the names of their creators.
Popular neopronouns ae,ey,fae,xe,ze,ze/zir Unlike the other pronouns, which are officially recognised as “grammatically correct”, albeit used in a different meaning than we're used to, neopronouns are novel. Not being included in dictionaries doesn't make them any worse, though!
Other neopronouns co,e,e/em/es,hu,ne,ne/nir,per,s/he,thon,ve,vi,vi/vim,zhe These neopronouns are less often used than their more popular counterparts, but it doesn't make them any worse (and some of them are historically notable). Some neoprouns' names are derived from the names of their creators. If your pronoun is not on the list, use the generator below!

1 name pronouns description
2 Normative forms she,he It's worth mentioning that pronouns ≠ gender. One can still be nonbinary while using pronouns that are congruent with (or opposite to) their gender assigned at birth.
3 Normative-ish forms they,they/them/themself,it,one Those pronouns have been in common use in normative English already, but recently they got a slightly different new usage: describing a single, specific person.
4 Neopronouns Popular neopronouns ae,co,e,e/em/es,ey,fae,hu,ne,ne/nir,per,s/he,thon,ve,vi,vi/vim,xe,ze,ze/zir,zhe ae,ey,fae,xe,ze,ze/zir Unlike the other pronouns, which are officially recognised as “grammatically correct”, albeit used in a different meaning than we're used to, neopronouns are novel. Not being included in dictionaries doesn't make them any worse, though! Some neoprouns' names are derived from the names of their creators. Unlike the other pronouns, which are officially recognised as “grammatically correct”, albeit used in a different meaning than we're used to, neopronouns are novel. Not being included in dictionaries doesn't make them any worse, though!
5 Other neopronouns co,e,e/em/es,hu,ne,ne/nir,per,s/he,thon,ve,vi,vi/vim,zhe These neopronouns are less often used than their more popular counterparts, but it doesn't make them any worse (and some of them are historically notable). Some neoprouns' names are derived from the names of their creators. If your pronoun is not on the list, use the generator below!

View File

@ -73,7 +73,7 @@ pronouns:
description: >
Even though for many people it's incredibly important that people use specific pronouns to talk about them,
others don't mind being addressed in any way as long as the context is clear as to who one talks about.
options: 'check out the options [share]{/=here}.'
options: 'check out the options [share]{/pronouns=here}.'
others: 'Other forms'
othersRaw: 'other'
or: 'or'
@ -207,7 +207,9 @@ nouns:
plural: 'plural'
pluralShort: 'pl.'
terms:
image: 'Picture'
terminology:
header: 'Terminology'
headerLong: 'Dictionary of queer terminology'
info:
@ -487,12 +489,15 @@ profile:
names: 'Names'
pronouns: 'Pronouns'
pronounsInfo: >
You can enter a pronoun (eg. “they” or “she/her”)
or a link (eg. “https://en.pronouns.page/e”)
You can enter a <strong>pronoun</strong> (eg. “they” or “she/her”)
or a <strong>link</strong> (eg. “https://en.pronouns.page/e”)
or the custom five forms (eg. “ze/zem/zir/zirs/zirself”).
Keep in mind that <strong>all five forms</strong> are required in that case,
otherwise the app can only guess what exactly do you mean.
pronounsNotFound: 'We can''t find a link to this pronoun!'
You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
If your pronouns follow the {/pronouns#nameself=<strong>nameself pattern</strong>},
you can also use a colon shorthand (eg. “:star”).
pronounsNotFound: 'Unrecognised format. Please check out the instruction above.'
words: 'Words'
birthday: 'Age'
birthdayInfo: 'We do not publish your birthday, just the calculated age.'

View File

@ -46,9 +46,11 @@ nouns:
declension: false
submit: true
templates: false
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'orientación sexual'

View File

@ -75,7 +75,7 @@ pronouns:
description: >
Aunque para mucha gente sea muy importante que se utilicen pronombres específicos para hablar de elles,
a otres no les molesta que les llamen de cualquier manera - mientras que en el contexto sea claro a quién se está hablando.
options: 'Checa las opciones [compartir]{/=aquí}.'
options: 'Checa las opciones [share]{/pronombres=aquí}.'
others: 'Otras formas'
othersRaw: 'Otras'
or: 'o'
@ -168,7 +168,9 @@ nouns:
plural: 'plural'
pluralShort: 'pl.'
terms:
image: 'Imagen'
terminology:
header: 'Terminología'
headerLong: 'Diccionario de terminología queer'
info:
@ -418,8 +420,11 @@ profile:
description: 'Descripción'
names: 'Nombres'
pronouns: 'Pronombres'
pronounsInfo: 'Puedes introducir un pronombre (p. ej. “elle” o “ella”) o un enlace (“http://es.pronouns.page/ellx”).'
pronounsNotFound: '¡No podemos encontrar un enlace a este pronombre!'
pronounsInfo: >
Puedes introducir un <strong>pronombre</strong> (p. ej. “elle” o “ella”)
o un <strong>enlace</strong> (“http://es.pronouns.page/ellx”).
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: '¡No podemos encontrar un enlace a este pronombre!' # TODO 'Unrecognised format. Please check out the instruction above.'
words: 'Palabras'
birthday: 'Edad'
birthdayInfo: 'No publicamos la fecha de tu cumpleaños, sólo la edad calculada.'

View File

@ -7,7 +7,7 @@ pronouns:
route: 'pronoms'
default: 'il'
any: 'any'
plurals: true
plurals: false
honorifics: false
multiple:
name: 'Formes interchangeables'
@ -25,9 +25,13 @@ pronouns:
pronunciation:
enabled: true
voices:
GB:
language: 'en-GB'
voice: 'Emma'
FR:
language: 'fr-FR'
voice: 'Lea'
engine: 'standard'
CA:
language: 'fr-CA'
voice: 'Gabrielle'
engine: 'neural'
sources:
@ -46,9 +50,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'orientation sexuelle'
@ -130,7 +136,7 @@ profile:
- ['[sans titre]', 'Mx.', 'M.', 'Mme.', 'MM.', 'Mmes.', 'Mlle.', 'Mlles.', 'Vve.', 'messieurs', 'monsieur', 'madame', 'mesdames', 'mademoiselle', 'mesdemoiselles', 'veuve']
- ['personne', 'homme', 'femme', 'demoiselle', 'monsieur', 'mec', 'meuf', 'garçon', 'fille', 'poto', 'fréro', 'sœurette']
- ['beauté', 'beau gosse', 'belle gosse']
- ['ami', 'partenaire', 'mec', 'meuf', 'petit ami', 'petite amie', 'joyfriend', 'mari', 'femme', 'kissmate', 'chéri', 'chérie', 'mon amour']
- ['ami', 'partenaire', 'mec', 'meuf', 'petit ami', 'petite amie', 'mari', 'femme', 'kissmate', 'chéri', 'chérie', 'mon amour']
flags:
defaultPronoun: 'iel'

View File

@ -9,20 +9,18 @@
<table class="table table-sm">
<thead>
<tr>
<th>Subject</th>
<th>Object</th>
<th>Possessive determiner</th>
<th>Possessive pronoun</th>
<th>Reflexive</th>
<th>Sujet</th>
<th>Objet direct</th>
<th>Objet indirect</th>
<th>Possessif</th>
</tr>
</thead>
<tbody>
<tr>
<td><Morpheme :pronoun="selectedPronoun" morpheme="pronoun_subject" :counter="counter"/></td>
<td><Morpheme :pronoun="selectedPronoun" morpheme="pronoun_object" :counter="counter"/></td>
<td><Morpheme :pronoun="selectedPronoun" morpheme="possessive_determiner" :counter="counter"/></td>
<td><Morpheme :pronoun="selectedPronoun" morpheme="possessive_pronoun" :counter="counter"/></td>
<td><Morpheme :pronoun="selectedPronoun" morpheme="reflexive" :counter="counter"/></td>
<td><Morpheme :pronoun="selectedPronoun" morpheme="pronoun_disjunctive" :counter="counter"/></td>
<td><Morpheme :pronoun="selectedPronoun" morpheme="pronoun_possessive" :counter="counter"/></td>
</tr>
</tbody>
</table>

View File

@ -1,5 +1,5 @@
singular plural isHonorific
Je pense qu'{pronoun_subject} est très gentil. FALSE
{'pronoun_subject} est {pronoun_possessive} voisi{conjugation_n}. FALSE
Je pense qu'{pronoun_subject} est très genti{inflection_l}. FALSE
{'pronoun_subject} est {pronoun_possessive} voisi{inflection_n}. FALSE
Je vais {pronoun_object} rencontrer bientôt. FALSE
Je me fie à {pronoun_disjunctive}. FALSE

1 singular plural isHonorific
2 Je pense qu'{pronoun_subject} est très gentil. Je pense qu'{pronoun_subject} est très genti{inflection_l}. FALSE
3 {'pronoun_subject} est {pronoun_possessive} voisi{conjugation_n}. {'pronoun_subject} est {pronoun_possessive} voisi{inflection_n}. FALSE
4 Je vais {pronoun_object} rencontrer bientôt. FALSE
5 Je me fie à {pronoun_disjunctive}. FALSE

View File

@ -3,8 +3,8 @@ export default [
'pronoun_object',
'pronoun_disjunctive',
'pronoun_possessive',
'conjugation_l',
'conjugation_x',
'conjugation_e',
'conjugation_n',
'inflection_l',
'inflection_x',
'inflection_e',
'inflection_n',
];

View File

@ -1,4 +1,4 @@
name pronouns description
Formes normatives il,elle Il convient de mentionner que les pronoms ≠ genre. On peut toujours être non-binaire tout en utilisant des pronoms adéquats (ou opposés) à son genre assigné à la naissance.
Formes semi-normatives on Ces pronoms font parties de la norme dans la langue française, mais généralement pas pour des personnes spécifiques.
Néo-pronoms al,ael,el,em,iel,ielle,ille,im,ol,ul,yel,yelle Contrairement aux autres pronoms, qui sont officiellement reconnus comme " grammaticalement corrects ", bien qu'utilisés dans un sens différent de celui auquel nous sommes habitués, les néo-pronoms sont inédits. Le fait de ne pas figurer dans les dictionnaires ne les rend pas pires pour autant !
Néo-pronoms al,ael,el,em,iel,ielle,ille,im,ol,ul,yel,yelle Contrairement aux autres pronoms, qui sont officiellement reconnus comme « grammaticalement corrects », bien qu'utilisés dans un sens différent de celui auquel nous sommes habitués, les néo-pronoms sont inédits. Le fait de ne pas figurer dans les dictionnaires ne les rend pas pires pour autant !

Can't render this file because it contains an unexpected character in line 4 and column 134.

View File

@ -1,16 +1,16 @@
key description normative pronoun_subject pronoun_object pronoun_disjunctive pronoun_possessive conjugation_l conjugation_x conjugation_e conjugation_n plural pluralHonorific pronounceable history thirdForm smallForm sourcesInfo
il Normatif, masculin TRUE il le lui mon l x é n FALSE FALSE TRUE
elle Normatif, féminin TRUE elle la elle ma le se e ne FALSE FALSE TRUE
on Normatif, indéfini TRUE on en soi man l·le x·se é·e n·e FALSE FALSE TRUE
al Neopronom «al» FALSE al lea al mo l·le x·se é·e n·e FALSE FALSE TRUE
ael Neopronom «ael» FALSE ael lea ael mo l·le x·se é·e n·e FALSE FALSE TRUE
el Neopronom «el» FALSE el lea el mo l·le x·se é·e n·e FALSE FALSE TRUE
em Neopronom «em» FALSE em lea em mo l·le x·se é·e n·e FALSE FALSE TRUE Proche à «elle»
iel Neopronom «iel» FALSE iel lea ellui mo l·le x·se é·e n·e FALSE FALSE TRUE Mélange de «il» et «elle»
ielle Neopronom «ielle» FALSE ielle lea ielle mo l·le x·se é·e n·e FALSE FALSE TRUE
ille Neopronom «ille» FALSE ille lea ille mo l·le x·se é·e n·e FALSE FALSE TRUE
im Neopronom «im» FALSE im lea im mo l·le x·se é·e n·e FALSE FALSE TRUE Proche à «il»
ol Neopronom «ol» FALSE ol lo ol mo l·le x·se é·e n·e FALSE FALSE TRUE
ul Neopronom «ul» FALSE ul lu ul mo l·le x·se é·e n·e FALSE FALSE TRUE
yel Neopronom «yel» FALSE yel lea yel mo l·le x·se é·e n·e FALSE FALSE TRUE Une orthographe alternative de «iel»
yelle Neopronom «yelle» FALSE yelle lea yelle mo l·le x·se é·e n·e FALSE FALSE TRUE
key description normative pronoun_subject pronoun_object pronoun_disjunctive pronoun_possessive inflection_l inflection_x inflection_e inflection_n plural pluralHonorific pronounceable history thirdForm smallForm sourcesInfo
il,il/le Normatif, masculin TRUE il le lui mon l x é n FALSE FALSE TRUE
elle,elle/la Normatif, féminin TRUE elle la elle ma lle se ée ne FALSE FALSE TRUE
on,on/en Normatif, indéfini TRUE on en soi man l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
al,al/lea Neopronom « al » FALSE al lea al man l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
ael,ael/lea Neopronom « ael » FALSE ael lea ael man l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
el,el/lea Neopronom « el » FALSE el lea el mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
em,em/lea Neopronom « em » FALSE em lea em mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE Proche à « elle »
iel,iel/lea Neopronom « iel » FALSE iel lea ellui mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE Mélange de « il » et « elle »
ielle,ielle/lea Neopronom « ielle » FALSE ielle lea ellui mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
ille,ille/lea Neopronom « ille » FALSE ille lea ellui mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
im,im/lea Neopronom « im » FALSE im lea im mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE Proche à « il »
ol,ol/lo Neopronom « ol » FALSE ol lo ol mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
ul,ul/lu Neopronom « ul » FALSE ul lu ul mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE
yel,yel/lea Neopronom « yel » FALSE yel lea ellui mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE Une orthographe alternative de « iel »
yelle,yell/lea Neopronom « yelle » FALSE yelle lea ellui mo l·le|=lé x·se é·e n·e|=né FALSE FALSE TRUE

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -21,9 +21,9 @@ home:
- >
Pourquoi est-ce que cest important ? Par simple décence humaine.
Vous nappelleriez pas Louise « Annette » simplement parce que vous préférez ce prénom,
ou parce quelle a «lair dune Annette selon vous».
ou parce quelle a « lair dune Annette selon vous ».
Ou même si le prénom « Annette » est <em>bien</em> inscrit sur son certificat de naissance,
mais quelle le déteste et préfère utiliser «Louise.»
mais quelle le déteste et préfère utiliser « Louise ».
Et cest la même chose avec les pronoms -
si vous ne voulez pas pas être impoli·e envers quelquun, adressez-vous à ellui correctement.
La seule différence est quon connaît généralement le nom des gens, mais pas leurs pronoms.
@ -73,7 +73,7 @@ pronouns:
Même si pour beaucoup de gens, c'est extrêmement important qu'on utilise des pronoms spécifiques pour parler d'eux,
d'autres ne voient pas de problème à ce qu'on s'adresse à eux de n'importe quelle façon
du moment que c'est évident de qui on parle dans le contexte.
options: 'voir les options [share]{/=ici}.'
options: 'voir les options [share]{/pronoms=ici}.'
others: 'Autres formes'
othersRaw: 'autre'
or: 'ou'
@ -167,7 +167,9 @@ nouns:
plural: 'pluriel'
pluralShort: 'pl.'
terms:
image: 'Photo'
terminology:
header: 'Terminologie'
headerLong: 'Dictionnaire des terminologies queer'
info:
@ -234,7 +236,7 @@ faq:
À la place, vous pouvez simplement demander « quels sont tes pronoms ? » ou « comment voudrais-tu que je te genre ? »)
- >
Cest aussi important de normaliser le fait de se présenter en donnant ses pronoms.
« Salut, je suis Michael, mes pronoms sont {/il=il/lui}. » Ce nest pas difficile mais pour les personnes trans et non-binaires,
« Salut, je suis Michel, mes pronoms sont {/il=il/lui}. » Ce nest pas difficile mais pour les personnes trans et non-binaires,
cest tellement important !
Cest encore plus facile en ligne: mettez simplement vos pronoms (ou un lien vers des exemples de notre site) dans votre bio.
- >
@ -354,6 +356,7 @@ contact:
members: 'Membres actuels'
blog: 'Blog'
upcoming: 'Versions en dautres langues à venir'
member: 'Membre du collectif'
support:
header: 'Soutien'
@ -411,8 +414,11 @@ profile:
description: 'Description'
names: 'Noms'
pronouns: 'Pronoms'
pronounsInfo: 'Vous pouvez entrer un pronom (ex. « ael » or « il/lui ») ou un lien (ex. « http://fr.pronouns.page/elle »).'
pronounsNotFound: 'Impossible de trouver un lien vers ce pronom !'
pronounsInfo: >
Vous pouvez entrer un <strong>pronom</strong> (ex. « ael » or « il/lui »)
ou un <strong>lien</strong> (ex. « http://fr.pronouns.page/elle »).
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: 'Impossible de trouver un lien vers ce pronom !' # TODO 'Unrecognised format. Please check out the instruction above.'
words: 'Mots'
birthday: ' ge'
birthdayInfo: 'Nous ne publions pas votre date de naissance, seulement lâge calculé.'
@ -455,7 +461,7 @@ share: 'Partager'
crud:
approve: 'Approuver'
hide: 'Cacher'
remove: 'Retiret'
remove: 'Retirer'
removeConfirm: 'Êtes-vous sûr·e de vouloir retirer cet item ?'
edit: 'Éditer'
add: 'Ajouter'
@ -557,34 +563,34 @@ report:
flags:
Abroromantic: 'Abroromantique'
Abrosexual: 'Abrosexuel·le'
Abrosexual: 'Abrosexue{inflection_l}'
Achillean: 'Achilléen'
Alloromantic_Asexual: 'Alloromantique asexuel·le'
Alloromantic_Asexual: 'Alloromantique asexue{inflection_l}'
Agender: 'Agenre'
Anarcha-Queer: 'Anarcho-queer'
Androgyne: 'Androgyne'
Androsexual: 'Androsexuel·le'
Androsexual: 'Androsexue{inflection_l}'
Aporagender: 'Aporagenre'
Archaeopronouns: 'Archéo-pronoms'
Aroace: 'Aroace'
Aromantic: 'Aromantique'
Aromantic_Allosexual: 'Aromantique allosexuel·le'
Asexual: 'Asexuel·le'
Aromantic_Allosexual: 'Aromantique allosexue{inflection_l}'
Asexual: 'Asexue{inflection_l}'
Autigender: 'Autigenre'
Bear: 'Bear'
Bicurious: 'Bicurieux·se'
Bicurious: 'Bicurieu{inflection_x}'
Bigender: 'Bigenre'
Biromantic: 'Biromantique'
Bisexual: 'Bisexuel·le'
Bisexual: 'Bisexue{inflection_l}'
Butch: 'Butch'
Ceteroromantic: 'Ceteroromantique'
Ceterosexual: 'Ceterosexuel·le'
Cis_Ally: 'Allié·e cis'
Ceterosexual: 'Ceterosexue{inflection_l}'
Cis_Ally: 'Alli{inflection_e} cis'
Demiboy: 'Demiboy'
Demigender: 'Demigenre'
Demigirl: 'Demigirl'
Demiromantic: 'Demiromantique'
Demisexual: 'Demisexuel·le'
Demisexual: 'Demisexue{inflection_l}'
Diamoric: 'Diamorique'
Enbian: 'Enbian'
Fa*afafine: 'Fa''afafine'
@ -595,12 +601,12 @@ flags:
Genderfluid: 'Genderfluid'
Genderflux: 'Genderflux'
Genderqueer: 'Genderqueer'
Greyasexual: 'Grisexuel·le'
Greyasexual: 'Grisexue{inflection_l}'
Greyaromantic: 'Grisromantique'
Gynesexual: 'Gynosexuel·le'
Gynesexual: 'Gynosexue{inflection_l}'
Heteroflexible: 'Hétéroflexible'
Heteroromantic: 'Hétéroromantique'
Heterosexual: 'Hétérosexuel'
Heterosexual: 'Hétérosexue{inflection_l}'
Hijra: 'Hijra'
Homoflexible: 'Homoflexible'
Homoromantic: 'Homoromantique'
@ -615,17 +621,17 @@ flags:
Neopronouns: 'Néopronoms'
Neutrois: 'Neutrois'
Nonbinary: 'Non-binaire'
Omnisexual: 'Omnisexuel·le'
Omnisexual: 'Omnisexue{inflection_l}'
Omniromantic: 'Omniromantique'
Oriented_Aroace: 'Aroace orienté·e'
Oriented_Aroace: 'Aroace orient{inflection_e}'
Pangender: 'Pangenre'
Panromantic: 'Panromantique'
Pansexual: 'Pansexuel·le'
Polyamorous: 'Polyamoureux·se'
Pansexual: 'Pansexue{inflection_l}'
Polyamorous: 'Polyamoureu{inflection_x}'
Polyromantic: 'Panromantique'
Polysexual: 'Polysexuel·le'
Polysexual: 'Polysexue{inflection_l}'
Pomoromantic: 'Pomoromantique'
Pomosexual: 'Pomosexuel·le'
Pomosexual: 'Pomosexue{inflection_l}'
Progress_Pride: 'Progress Pride'
Queer: 'Queer'
Queerian: 'Queerian'
@ -633,11 +639,11 @@ flags:
Quoiromantic: 'Queeromantique'
Sapphic: 'Saphique'
Sexuality_Questioning: 'En questionnement de sexualité'
Straight_Ally: 'Allié hétéro'
Straight_Ally: 'Alli{inflection_e} hétéro'
Toric: 'Toric'
Transfeminine: 'Transféminin·e'
Transfeminine: 'Transfémini{inflection_n}'
Transgender: 'Transgenre'
Transmasculine: 'Transmasculin·e'
Transmasculine: 'Transmasculi{inflection_n}'
Transneutral: 'Transneutre'
Trigender: 'Trigenre'
Trixic: 'Trixic'

View File

@ -64,9 +64,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: false
names:

View File

@ -74,7 +74,7 @@ pronouns:
Ook al is het voor veel mensen erg belangrijk dat men specifieke voornaamwoorden gebruikt om over hun te praten,
vinden anderen het geen probleem om op wat voor manier dan ook aangesproken te worden
- zolang de context duidelijk is wat betreft degene over wie wordt gesproken.
options: 'bekijk de mogelijkheden [share]{/=hier}.'
options: 'bekijk de mogelijkheden [share]{/voornaamwoorden=hier}.'
others: 'Andere vormen'
othersRaw: 'andere'
or: 'of'
@ -167,6 +167,8 @@ nouns:
plural: 'meervoud'
pluralShort: 'meerv.'
image: 'Beeld'
faq:
header: 'FAQ'
headerLong: 'Veelgestelde vragen'
@ -399,8 +401,12 @@ profile:
description: 'Omschrijving'
names: 'Namen'
pronouns: 'Voornaamwoorden'
pronounsInfo: 'Je kunt een voornaamwoord (bijv. “die” of “zij/haar”) of een link (bijv. “http://nl.pronouns.page/zem”) of vijf eigen vormen (bijv. “hen/hen/hun/hunne/hunzelf”) invoeren.'
pronounsNotFound: 'We kunnen geen link naar dit voornaamwoord vinden!'
pronounsInfo: >
Je kunt een <strong>voornaamwoord</strong> (bijv. “die” of “zij/haar”)
of een <strong>link</strong> (bijv. “http://nl.pronouns.page/zem”)
of <strong>vijf eigen vormen</strong> (bijv. “hen/hen/hun/hunne/hunzelf”) invoeren.
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: 'We kunnen geen link naar dit voornaamwoord vinden!' # TODO 'Unrecognised format. Please check out the instruction above.'
words: 'Woorden'
birthday: 'Leeftijd'
birthdayInfo: 'We laten jouw verjaardagsdatum niet zien, alleen de berekende leeftijd.'

View File

@ -45,9 +45,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'seksuell legning'

View File

@ -73,7 +73,7 @@ pronouns:
description: >
Selv om det for mange folk er veldig viktig at andre bruker spesifikke pronomen til å omtale dem
så er det også andre som ikke bryr seg om hvilke pronomen du bruker for dem, eller bruker alle pronomen - så lenge det er klart hvem man snakker om.
options: 'sjekk ut valgene her [del]{/=her}.'
options: 'sjekk ut valgene her [share]{/pronomen=her}.'
others: 'Andre former'
othersRaw: 'andre'
or: 'eller'
@ -169,7 +169,9 @@ nouns:
plural: 'flertall.'
pluralShort: 'fl.'
terms:
image: 'Bilde'
terminology:
header: 'Terminologi'
headerLong: 'Ordbok av queer terminologi'
info:
@ -353,6 +355,7 @@ contact:
members: 'Nåværende medlemmer'
blog: 'Blogg'
upcoming: 'Kommende språk versjoner'
member: 'Member of the collective' # TODO
support:
header: 'Hjelp'
@ -410,8 +413,12 @@ profile:
description: 'Beskrivelse'
names: 'Navn'
pronouns: 'Pronomen'
pronounsInfo: 'Du kan taste inn ett pronomen (feks. “de” eller “hun/henne” eller en link (feks. “http://no.pronouns.page/hun”).'
pronounsNotFound: 'Vi kan ikke finne en link til dette pronomenet!'
pronounsInfo: >
Du kan taste inn ett <strong>pronomen</strong> (feks. “de” eller “hun/henne”)
eller en <strong>link</strong> (feks. “http://no.pronouns.page/hun”).
# TODO add: or the <strong>custom five forms</strong> (eg. “ze/zem/zir/zirs/zirself”).
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: 'Vi kan ikke finne en link til dette pronomenet!' # TODO 'Unrecognised format. Please check out the instruction above.'
words: 'Ord'
birthday: 'Alder'
birthdayInfo: 'Vi viser ikke bursdagen din, bare den kalkulerte alderen.'

View File

@ -0,0 +1,18 @@
# Poradnik języka neutralnego płciowo
<small>2021-08-28 | [@Sybil](/@Sybil)</small>
Prezentacja Sybila stworzona na V Kongres Anarchistyczny Kongresono (kliknij na obrazek, aby otworzyć).
<p>
<a href="/docs/Poradnik języka neutralnego płciowo.pdf" target="_blank">
<img src="/img-local/blog/poradnik-języka-neutralnego-płciowo.png" class="hero" alt="Prezentacja w formacie PDF"/>
</a>
</p>
<p>
<a href="/docs/Poradnik języka neutralnego płciowo.pdf" target="_blank" class="btn btn-primary d-block">
<span class="fal fa-file-pdf"></span>
Prezentacja
</a>
</p>

View File

@ -74,6 +74,7 @@ sources:
nouns:
enabled: true
route: 'slowniki'
routeMain: 'neutratywy'
collapsable: false
plurals: true
pluralsRequired: true
@ -85,11 +86,13 @@ nouns:
- 'dukatywy'
- 'osobatywy'
- 'iksatywy'
inclusive:
inclusive:
enabled: true
categories: ['nieheteronormatywność', 'transpłciowość', 'interpłciowość', 'feminizm', 'niepełnosprawność', 'rasa i narodowość', 'ubóstwo', 'zdrowie psychiczne']
route: 'inkluzywny'
terms:
terminology:
enabled: true
published: true
categories:
@ -1325,13 +1328,13 @@ census:
spis-2021: 'Raport ze Spisu 2021'
redirects:
- { from: '^/neutratywy$', to: '/slowniki/neutratywy' }
- { from: '^/dukatywy$', to: '/slowniki/dukatywy' }
- { from: '^/osobatywy$', to: '/slowniki/osobatywy' }
- { from: '^/iksatywy$', to: '/slowniki/iksatywy' }
- { from: '^/inkluzywny', to: '/slowniki/inkluzywny' }
- { from: '^/inkluzywnosc', to: '/slowniki/inkluzywny' }
- { from: '^/terminologia', to: '/slowniki/terminologia' }
- { from: '^/slowniki/neutratywy$', to: '/neutratywy' }
- { from: '^/slowniki/dukatywy$', to: '/dukatywy' }
- { from: '^/slowniki/osobatywy$', to: '/osobatywy' }
- { from: '^/slowniki/iksatywy$', to: '/iksatywy' }
- { from: '^/slowniki/inkluzywny', to: '/inkluzywny' }
- { from: '^/slowniki/inkluzywnosc', to: '/inkluzywny' }
- { from: '^/slowniki/terminologia', to: '/terminologia' }
- { from: '^/rzeczowniki$', to: '/slowniki' }
- { from: '^/slownik$', to: '/slowniki' }
- { from: '^/s%C5%82ownik$', to: '/slowniki' }

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

View File

@ -5,7 +5,7 @@
:to="buildRoute(route)"
:class="['btn', isActiveRoute(route) ? 'btn-primary' : 'btn-outline-primary']">
<Icon :v="icon"/>
<T>nouns.{{name}}.header</T>
<T>{{name}}</T>
</router-link>
</div>
<div class="d-block d-md-none btn-group-vertical btn-block mb-2 w-100">
@ -13,7 +13,7 @@
:to="buildRoute(route)"
:class="['btn', isActiveRoute(route) ? 'btn-primary' : 'btn-outline-primary']">
<Icon :v="icon"/>
<T>nouns.{{name}}.header</T>
<T>{{name}}</T>
</router-link>
</div>
</section>
@ -23,18 +23,18 @@
export default {
data() {
const links = [
{name: 'neuterNouns', icon: 'deer', route: 'neutratywy'},
{name: 'dukajNouns', icon: 'ghost', route: 'dukatywy'},
{name: 'personNouns', icon: 'user-friends', route: 'osobatywy'},
{name: 'xNouns', icon: 'comment-times', route: 'iksatywy'},
{name: 'nouns.neuterNouns.header', icon: 'deer', route: 'neutratywy'},
{name: 'nouns.dukajNouns.header', icon: 'ghost', route: 'dukatywy'},
{name: 'nouns.personNouns.header', icon: 'user-friends', route: 'osobatywy'},
{name: 'nouns.xNouns.header', icon: 'comment-times', route: 'iksatywy'},
];
if (this.config.nouns.inclusive.enabled) {
links.push({name: 'inclusive', icon: 'book-heart', route: this.config.nouns.inclusive.route});
if (this.config.inclusive.enabled) {
links.push({name: 'inclusive.header', icon: 'book-heart', route: this.config.inclusive.route});
}
if (this.config.nouns.terms.enabled) {
links.push({name: 'terms', icon: 'flag', route: this.config.nouns.terms.route});
if (this.config.terminology.enabled) {
links.push({name: 'terminology.header', icon: 'flag', route: this.config.terminology.route});
}
return {
@ -43,7 +43,7 @@
},
methods: {
buildRoute(route) {
return `/${this.config.nouns.route}/${route}`;
return `/${route}`;
},
isActiveRoute(route) {
let current = decodeURIComponent(this.$route.fullPath).replace(/\/$/, '');

View File

@ -85,7 +85,7 @@ pronouns:
description: >
Choć dla wielu osób niezmiernie ważne jest, by używać wobec nich konkretnych zaimków,
innym nie przeszkadza zwracanie się w dowolny sposób o ile wiadomo z kontekstu, że to o nich mowa.
options: 'przejrzyj listę możliwości [share]{/=tutaj}.'
options: 'przejrzyj listę możliwości [share]{/zaimki=tutaj}.'
avoiding:
header: 'Unikanie form nacechowanych płciowo'
description: >
@ -246,7 +246,7 @@ nouns:
- >
Płeć człowieka wymyka się jednak prostemu podziałowi kobieta/mężczyzna.
Jakimi rzeczownikami mogą się opisywać {/pytania#niebinarnosc=osoby niebinarne}?
Jeśli używają {/ono=rodzaju neutralnego}, {/onu=postpłciowego} czy {/=innych nienormatywnych form},
Jeśli używają {/ono=rodzaju neutralnego}, {/onu=postpłciowego} czy {/zaimki=innych nienormatywnych form},
to które formy rzeczowników pasują do nich gramatycznie?
Jak przetłumaczyć z angielskiego zawód osoby używającej zaimków <em>they/them</em>?
Jak opisywać grupy mieszane?
@ -371,7 +371,9 @@ nouns:
plural: 'liczba mnoga'
pluralShort: 'l. mn.'
inclusive:
image: 'Obrazek'
inclusive:
header: 'Inkluzywność'
headerLong: 'Słownik inkluzywnego języka'
insteadOf: 'Zamiast'
@ -389,7 +391,7 @@ nouns:
categories: 'Kategorie'
sources: 'Linki źródłowe'
terms:
terminology:
header: 'Terminologia'
headerLong: 'Słownik terminologii queerowej'
info:
@ -497,7 +499,7 @@ faq:
question: 'Czy ktoś tego w ogóle używa?'
answer:
- >
Tak! Niemal wszystkie formy, które {/=tu prezentujemy},
Tak! Niemal wszystkie formy, które {/zaimki=tu prezentujemy},
zostały nam podesłane przez osoby rzeczywiście ich używające,
albo wzięte z tekstów literatury.
Ewentualnie {/ona/ich=uzupełniłośmy} je jedynie w miejscach, gdzie którejś części brakowało,
@ -709,7 +711,7 @@ faq:
Jednak nie każda osoba chce używać zaimków i form męskich czy żeńskich,
choćby dlatego, że płeć człowieka wymyka się tym dwóm kategoriom.
Coraz więcej osób używa w odniesieniu do siebie
{/ono=rodzaju neutralnego} i {/=innych form}.
{/ono=rodzaju neutralnego} i {/zaimki=innych form}.
Formy te zaczynają być także potrzebne w tłumaczeniach z języków,
gdzie używane są formy niebinarne takie jak choćby angielskie zaimki they/them.
Z tego powodu proponujemy rozbudowę niebinarnej polszczyzny poprzez wspólne tworzenie form neutralnych.
@ -780,7 +782,7 @@ faq:
question: 'Jak zwracać się do osoby, której płci nie znamy, lub do mieszanej grupy osób?'
answer:
- >
Wiele form, które {/=tutaj proponujemy}, można zastosować właśnie w takich sytuacjach, np.:
Wiele form, które {/zaimki=tutaj proponujemy}, można zastosować właśnie w takich sytuacjach, np.:
„{/on/a=moi drodzy/drogie}”, „drogie osoby”, „{/on*=wszys* chętn*}”, „{/onx=jesteś wspaniałx}”, itp.
zmiana:
question: 'Czy mogę zmienić swoje zaimki?'
@ -874,7 +876,7 @@ people:
Przede wszystkim, nie idź na łatwiznę i nie opisuj jej zaimkami, które <em>wydaje ci się</em>,
że <em>„powinna”</em> używać ze względu na „męskie” czy „żeńskie” ciało.
Niektórzy używają zamiennie na przykład „they” i „she”, wtedy żeńskie zaimki w polszczyźnie są na miejscu.
W przciwnym wypadku zajrzyj na naszą [home] {/=stronę główną},
W przciwnym wypadku zajrzyj do sekcji [tags] {/zaimki=Zaimki},
gdzie opisujemy neutralne możliwości. Zapoznaj się z nimi i na tej podstawie dokonaj wyboru.
Możesz też spróbować spytać bezpośrednio osobę zainteresowaną o jej preferencje
posiłkując się naszymi [globe-americas] {/english=anglojęzycznymi materiałami}.
@ -901,7 +903,7 @@ english:
- >
This website is an effort to put together in a structured and accessible way
the existing ideas for less gendered pronouns and other forms.
We create it in Polish (see: [home] {/=Homepage}),
We create it in Polish (see: [tags] {/zaimki=Zaimki}),
but if you don't speak it, yet still are interested in
how this language tries to cope with the omnipresent binaries,
we've prepared a short overview of those ideas in English.
@ -1022,8 +1024,10 @@ profile:
description: 'Opis'
names: 'Imiona'
pronouns: 'Zaimki'
pronounsInfo: 'Możesz tu wpisać zaimek (np. „onu”, „on/jego”) lub wkleić linka do niego (np. „https://zaimki.pl/ona/ich”).'
pronounsNotFound: 'Nie możemy znaleźć tego zaimka!'
pronounsInfo: >
Możesz tu wpisać <strong>zaimek</strong> (np. „onu”, „on/jego”) lub wkleić <strong>linka</strong> do niego (np. „https://zaimki.pl/ona/ich”).
Użyj {/zaimki#generator=<strong>generatora</strong>} by wypełnić luki w zdaniach niestandardowymi formami.'
pronounsNotFound: 'Niepoprawny format. Szczegóły w instrukcji powyżej'
words: 'Słowa'
birthday: 'Wiek'
birthdayInfo: 'Nie pokazujemy publicznie pełnej daty urodzenia, jedynie obliczony wiek.'

View File

@ -47,9 +47,11 @@ nouns:
declension: false
submit: true
templates: false
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'orientação sexual'

View File

@ -74,7 +74,7 @@ pronouns:
description: >
Enquanto para muita gente é importante que se utilize pronomes específicos para falar dels,
a outres não ês incomoda que sejam chamades de qualquer maneira - conquanto que no contexto esteja claro com quem se está falando.
options: 'Verifique as opções [compartilhar]{/= aqui}.'
options: 'Verifique as opções [share] {/pronomes= aqui}.'
others: 'Outras formas'
othersRaw: 'Outras'
or: 'ou'
@ -166,7 +166,9 @@ nouns:
plural: 'plural'
pluralShort: 'pl.'
terms:
image: 'Imagem'
terminology:
header: 'Terminologia'
headerLong: 'Dicionário de terminologia queer'
info:
@ -415,8 +417,11 @@ profile:
description: 'Descrição'
names: 'Nomes'
pronouns: 'Pronomes'
pronounsInfo: 'Pode introduzir um pronome (p. ex. “ele” ou “ela”) ou um link (“http://pt.pronouns.page/elx”).'
pronounsNotFound: '˜Não podemos encontrar um link com este pronome!'
pronounsInfo: >
Pode introduzir um <strong>pronome</strong> (p. ex. “ele” ou “ela”)
ou um <strong>link</strong> (“http://pt.pronouns.page/elx”).
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: '˜Não podemos encontrar um link com este pronome!' # TODO 'Unrecognised format. Please check out the instruction above.'
words: 'Palavras'
birthday: 'Idade'
birthdayInfo: 'Não publicamos a data do aniversário, somente a idade calculada.'

View File

@ -50,9 +50,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: true
categories:
- 'orientacja seksualna'

View File

@ -26,12 +26,12 @@
{name: 'nouns', icon: 'book', route: ''},
];
if (this.config.nouns.inclusive.enabled) {
links.push({name: 'inclusive', icon: 'book-heart', route: this.config.nouns.inclusive.route});
if (this.config.inclusive.enabled) {
links.push({name: 'inclusive', icon: 'book-heart', route: this.config.inclusive.route});
}
if (this.config.nouns.terms.enabled) {
links.push({name: 'terms', icon: 'flag', route: this.config.nouns.terms.route});
if (this.config.terminology.enabled) {
links.push({name: 'terms', icon: 'flag', route: this.config.terminology.route});
}
return {
@ -40,7 +40,7 @@
},
methods: {
buildRoute(route) {
return `/${this.config.nouns.route}/${route}`;
return `/${route}`;
},
isActiveRoute(route) {
return decodeURIComponent(this.$route.fullPath).replace(/\/$/, '') === this.buildRoute(route).replace(/\/$/, '');

View File

@ -74,7 +74,7 @@ pronouns:
description: >
Even though for many people it's incredibly important that people use specific pronouns to talk about them,
others don't mind being addressed in any way as long as the context is clear as to who one talks about.
options: 'check out the options [share]{/=here}.'
options: 'check out the options [share]{/pronouns=here}.'
others: 'Other forms'
othersRaw: 'other'
or: 'or'
@ -171,7 +171,9 @@ nouns:
nouns:
header: 'נײטראַלע סובסטאַנטיװן'
terms:
image: 'Image'
terminology:
header: 'טערמינאָלאָגיע'
headerLong: 'Słownik terminologii queerowej'
info:
@ -418,8 +420,16 @@ profile:
description: 'באַשרײַבונג'
names: 'נעמען'
pronouns: 'פּראָנאָמען'
pronounsInfo: 'You can enter a pronoun (eg. “they” or “she/sher”) or a link (eg. “http://en.pronouns.page/e”) or the custom five forms (eg. “ze/zem/zir/zirs/zirself”).'
pronounsNotFound: 'We can''t find a link to this pronoun!'
pronounsInfo: >
You can enter a <strong>pronoun</strong> (eg. “they” or “she/her”)
or a <strong>link</strong> (eg. “https://en.pronouns.page/e”)
or the custom five forms (eg. “ze/zem/zir/zirs/zirself”).
Keep in mind that <strong>all five forms</strong> are required in that case,
otherwise the app can only guess what exactly do you mean.
You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
If your pronouns follow the {/pronouns#nameself=<strong>nameself pattern</strong>},
you can also use a colon shorthand (eg. “:star”).
pronounsNotFound: 'Unrecognised format. Please check out the instruction above.'
words: 'װערטער'
birthday: 'עלטער'
birthdayInfo: 'We do not publish your birthday, just the calculated age.'

View File

@ -49,9 +49,11 @@ nouns:
declension: false
submit: true
templates: true
inclusive:
inclusive:
enabled: false
terms:
terminology:
enabled: false
names:

View File

@ -71,7 +71,7 @@ pronouns:
description: >
其實對很多人來說,別人用特定代詞來談論他們是非常重要的,
但其他人不介意別人怎麼叫他們,只要內容清楚在談論誰。
options: '查看選項 [share]{/= 這裡}.'
options: '查看選項 [share] {/pronouns= 這裡}.'
others: '其他形式'
othersRaw: '其他'
or: '或'
@ -153,6 +153,8 @@ nouns:
plural: '複數'
pluralShort: '複數'
image: 'Image' # TODO
faq:
header: 'FAQ'
headerLong: 'Frequently asked questions'
@ -384,8 +386,10 @@ profile:
description: '傳記'
names: '名字'
pronouns: '代詞'
pronounsInfo: '您可以輸入代詞(例如“他”或“他/你”)或鏈接(例如“ http://zh.pronouns.page/佢”'
pronounsNotFound: '我們找不到這個代詞的鏈接'
pronounsInfo: '您可以輸入代詞(例如“他”或“他/你”或鏈接例如“http://zh.pronouns.page/佢”)'
# TODO add <strong></strong> around the words "pronoun" and "link"
# TODO add: You can also use {/pronouns#generator=<strong>the generator</strong>} to fill out sentences with custom forms.
pronounsNotFound: '我們找不到這個代詞的鏈接' # TODO 'Unrecognised format. Please check out the instruction above.'
words: '詞匯'
birthday: '嵗'
birthdayInfo: '我們不發布您的生日,只發布計算出的年齡。'

View File

@ -188,14 +188,18 @@ export default {
if (config.nouns.enabled) {
routes.push({ path: '/' + config.nouns.route, component: resolve(__dirname, 'routes/nouns.vue') });
for (let subroute of config.nouns.subroutes || []) {
routes.push({ path: `/${config.nouns.route}/${subroute}`, component: resolve(__dirname, `data/nouns/${subroute}.vue`) });
routes.push({ path: `/${subroute}`, component: resolve(__dirname, `data/nouns/${subroute}.vue`) });
}
if (config.nouns.inclusive.enabled) {
routes.push({path: `/${config.nouns.route}/${config.nouns.inclusive.route}`, component: resolve(__dirname, 'routes/inclusive.vue')});
}
if (config.nouns.terms.enabled) {
routes.push({path: `/${config.nouns.route}/${config.nouns.terms.route}`, component: resolve(__dirname, 'routes/queerTerms.vue')});
if (config.inclusive.enabled) {
routes.push({path: `/${config.inclusive.route}`, component: resolve(__dirname, 'routes/inclusive.vue')});
}
if (config.terminology.enabled) {
routes.push({path: `/${config.terminology.route}`, component: resolve(__dirname, 'routes/terminology.vue')});
// TODO remove later
routes.push({path: `/${config.nouns.route}/${config.terminology.route}`, component: resolve(__dirname, 'routes/terminology.vue')});
}
if (config.names.enabled) {

View File

@ -68,16 +68,16 @@
nouns_search: ['GET', '/api/nouns/search/{term}'],
},
}, {
enabled: this.config.nouns.inclusive.enabled,
header: 'nouns.inclusive.header',
enabled: this.config.inclusive.enabled,
header: 'inclusive.header',
icon: 'book-heart',
endpoints: {
inclusive_all: ['GET', '/api/inclusive'],
inclusive_search: ['GET', '/api/inclusive/search/{term}'],
},
}, {
enabled: this.config.nouns.terms.enabled,
header: 'nouns.terms.header',
enabled: this.config.terminology.enabled,
header: 'terminology.header',
icon: 'flag',
endpoints: {
terms_all: ['GET', '/api/terms'],

View File

@ -4,12 +4,12 @@
<h2>
<Icon v="book-heart"/>
<T>nouns.inclusive.headerLong</T>
<T>inclusive.headerLong</T>
</h2>
<section>
<T>nouns.inclusive.info</T>
<Share :title="$t('nouns.inclusive.headerLong')"/>
<T>inclusive.info</T>
<Share :title="$t('inclusive.headerLong')"/>
</section>
<InclusiveDictionary load ref="inclusivedictionary"/>
@ -25,14 +25,14 @@
components: { NounsNav },
mixins: [ hash ],
mounted() {
this.handleHash(this.config.nouns.inclusive.hashNamespace || '', filter => {
this.handleHash(this.config.inclusive.hashNamespace || '', filter => {
this.$refs.inclusivedictionary.setFilter(filter);
});
},
head() {
return head({
title: this.$t('nouns.inclusive.headerLong'),
description: this.$t('nouns.inclusive.info')[0],
title: this.$t('inclusive.headerLong'),
description: this.$t('inclusive.info')[0],
});
},
}

View File

@ -30,6 +30,7 @@
pronouns.page/@{{user.username}}
</a>
</div>
<!--
<div v-if="($user() && $user().username === profile.username) || $isGranted('users')">
<small>
<Icon v="id-card"/>
@ -49,6 +50,7 @@
</template>
<small v-else><T>profile.card.generating</T></small>
</div>
-->
</Profile>
<Ban :user="user"/>
@ -103,7 +105,7 @@
};
},
async mounted() {
if (this.config.nouns.terms.enabled) {
if (this.config.terminology.enabled) {
this.terms = await this.$axios.$get(`/terms`);
}
},

View File

@ -90,35 +90,37 @@
<OpinionLegend/>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="signature"/>
<T>profile.names</T>
</h3>
<OpinionListInput v-model="names"/>
</div>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="link"/>
<T>profile.pronouns</T>
</h3>
<p class="small mb-2">
<div class="alert alert-info">
<p class="small mb-0">
<Icon v="info-circle"/>
<T>profile.pronounsInfo</T>
</p>
<OpinionListInput v-model="pronouns" :validation="validatePronoun"/>
<Answer question="custom-pronouns" small/>
</div>
<OpinionListInput v-model="pronouns" :validation="validatePronoun"/>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="comment-edit"/>
<T>profile.description</T>
</h3>
<textarea class="form-control form-control-sm" v-model="description" maxlength="256" rows="4"/>
</div>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="flag"/>
<T>profile.flags</T>
@ -129,7 +131,6 @@
<ButtonList v-model="flags" :options="allFlags" v-slot="s">
<Flag :name="s.desc.split('|')[0]" :alt="s.desc.split('|')[1]" :img="`/flags/${s.v}.png`"/>
</ButtonList>
</div>
<details class="form-group border rounded" :open="Object.keys(customFlags).length > 0">
<summary class="px-3 py-2">
@ -141,8 +142,9 @@
</details>
<Answer question="flags" small/>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="link"/>
<T>profile.links</T>
@ -159,9 +161,9 @@
</a>
😉
</p>
</div>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="birthday-cake"/>
<T>profile.birthday</T>
@ -175,9 +177,9 @@
<Icon v="times"/>
</button>
</div>
</div>
</section>
<div class="form-group">
<section class="form-group">
<h3 class="h4">
<Icon v="scroll-old"/>
<T>profile.words</T>
@ -188,12 +190,14 @@
</h4>
<OpinionListInput v-model="words[i]" group="words"/>
</template>
</div>
</section>
<section>
<button class="btn btn-primary w-100" type="submit">
<Icon v="save"/>
<T>profile.editor.save</T>
</button>
</section>
</form>
</div>
</template>
@ -401,4 +405,7 @@
.saving {
opacity: .5;
}
section.form-group {
margin-bottom: 5rem;
}
</style>

View File

@ -14,7 +14,7 @@
</div>
<SimplePronounList :pronouns="groupPronouns"/>
</li>
<li class="list-group-item">
<li class="list-group-item" id="generator">
<p class="h5">
<T>home.generator.header</T>
</p>
@ -107,7 +107,7 @@
</div>
</div>
</li>
<li v-if="config.pronouns.multiple !== false" class="list-group-item">
<li v-if="config.pronouns.multiple !== false" class="list-group-item" id="multiple">
<p class="h5">
<Spelling :text="config.pronouns.multiple.name"/>
</p>
@ -143,7 +143,7 @@
</div>
</div>
</li>
<li v-if="config.pronouns.null !== false" class="list-group-item">
<li v-if="config.pronouns.null !== false" class="list-group-item" id="nameself">
<p class="h5">
<Spelling :text="config.pronouns.null.description"/>
</p>

View File

@ -4,12 +4,12 @@
<h2>
<Icon v="flag"/>
<T>nouns.terms.headerLong</T>
<T>terminology.headerLong</T>
</h2>
<section>
<T>nouns.terms.info</T>
<Share :title="$t('nouns.terms.headerLong')"/>
<T>terminology.info</T>
<Share :title="$t('terminology.headerLong')"/>
</section>
<TermsDictionary load ref="termsdictionary"/>
@ -26,14 +26,14 @@
mixins: [ hash ],
mounted() {
this.handleHash(this.config.nouns.terms.hashNamespace || '', filter => {
this.handleHash(this.config.terminology.hashNamespace || '', filter => {
this.$refs.termsdictionary.setFilter(filter);
});
},
head() {
return head({
title: this.$t('nouns.terms.headerLong'),
description: this.$t('nouns.terms.info')[0],
title: this.$t('terminology.headerLong'),
description: this.$t('terminology.info')[0],
});
},
}

View File

@ -6,7 +6,10 @@ import cookieParser from 'cookie-parser';
import grant from "grant";
import router from "./routes/user";
import { loadSuml } from './loader';
import {isGranted} from "../src/helpers";
import {handleErrorAsync, isGranted} from "../src/helpers";
import cookieSettings from "../src/cookieSettings";
import SQL from "sql-template-strings";
import {createCanvas, loadImage, registerFont} from "canvas";
global.config = loadSuml('config');
@ -25,7 +28,7 @@ app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(session({
secret: process.env.SECRET,
cookie: {},
cookie: cookieSettings,
resave: false,
saveUninitialized: false,
}));
@ -77,6 +80,8 @@ app.use(async function (req, res, next) {
router.use(grant.express()(require('./social').config));
app.use(require('./routes/home').default);
app.use(require('./routes/banner').default);
app.use(require('./routes/user').default);

10
server/routes/home.js Normal file
View File

@ -0,0 +1,10 @@
import { Router } from 'express';
import {buildLocaleList, handleErrorAsync} from "../../src/helpers";
const router = Router();
router.get('/versions', handleErrorAsync(async (req, res) => {
return res.json(buildLocaleList(global.config.locale));
}));
export default router;

View File

@ -166,45 +166,33 @@ router.post('/nouns/remove/:id', handleErrorAsync(async (req, res) => {
return res.json('ok');
}));
const findBaseForm = (noun, query) => {
for (let form of ['masc', 'fem', 'neutr', 'mascPl', 'femPl', 'neutrPl']) {
for (let formPart of noun[form].split('|')) {
if (formPart.toLowerCase() === query.toLowerCase()) {
return formPart;
}
}
}
return null;
}
router.get('/nouns/:word.png', handleErrorAsync(async (req, res) => {
const query = req.params.word.toLowerCase();
const term = '%' + query + '%';
const noun = (await req.db.all(SQL`
router.get('/nouns/:id.png', async (req, res) => {
const noun = (await req.db.get(SQL`
SELECT * FROM nouns
WHERE locale = ${global.config.locale}
AND id = ${req.params.id}
AND approved >= ${req.isGranted('nouns') ? 0 : 1}
AND (masc like ${term} OR fem like ${term} OR neutr like ${term} OR mascPl like ${term} OR femPl like ${term} OR neutrPl like ${term})
ORDER BY masc
`)).filter(noun =>
noun.masc.toLowerCase().split('|').includes(query)
|| noun.fem.toLowerCase().split('|').includes(query)
|| noun.neutr.toLowerCase().split('|').includes(query)
|| noun.mascPl.toLowerCase().split('|').includes(query)
|| noun.femPl.toLowerCase().split('|').includes(query)
|| noun.neutrPl.toLowerCase().split('|').includes(query)
)[0]
AND deleted = 0
`));
if (!noun) {
return res.status(404).json({error: 'Not found'});
}
const base = findBaseForm(noun, query);
let maxItems = 0;
['masc', 'fem', 'neutr'].forEach((form, column) => {
let items = 0;
for (let [key, symbol] of [['', '⋅'], ['Pl', '⁖']]) {
items += noun[form + key].split('|').filter(x => x.length).length;
}
if (items > maxItems) {
maxItems = items;
}
});
const width = 1200;
const height = 600;
const padding = 48;
const width = 1200;
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'});
@ -218,14 +206,13 @@ router.get('/nouns/:word.png', handleErrorAsync(async (req, res) => {
context.drawImage(bg, 0, 0, width, height);
context.font = 'bold 64pt Quicksand';
context.fillText(base, width / 2 - context.measureText(base).width / 2, 120);
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, 192);
context.fillText(icon, column * (width - 2 * padding) / 3 + padding, padding * 1.5);
context.font = 'bold 24pt Quicksand';
context.fillText(translations.nouns[key], column * (width - 2 * padding) / 3 + padding + 36, 192);
context.fillText(translations.nouns[key], column * (width - 2 * padding) / 3 + padding + 36, padding * 1.5);
}
context.font = 'regular 24pt Quicksand';
@ -233,18 +220,22 @@ router.get('/nouns/:word.png', handleErrorAsync(async (req, res) => {
let i = 0;
for (let [key, symbol] of [['', '⋅'], ['Pl', '⁖']])
noun[form + key].split('|').filter(x => x.length).forEach(part => {
context.fillText(symbol + ' ' + part, column * (width - 2 * padding) / 3 + padding, 244 + i * 48);
context.fillText(symbol + ' ' + part, column * (width - 2 * padding) / 3 + padding, padding * 2.5 + i * 48);
i++;
});
})
context.fillStyle = '#C71585';
context.font = 'regular 24pt FontAwesome';
context.fillText('\uf02c', padding, height - padding);
context.font = `regular 24pt Quicksand`;
context.fillText(translations.title, padding + 48, height - padding - 4);
context.font = 'regular 16pt FontAwesome';
context.fillText('\uf02c', padding, height - padding + 12);
context.font = `regular 16pt Quicksand`;
context.fillText(
translations.title + '/' + (global.config.nouns.routeMain || global.config.nouns.route),
padding + 36,
height - padding + 8
);
return res.set('content-type', mime).send(canvas.toBuffer(mime));
}));
});
export default router;

View File

@ -414,7 +414,7 @@ router.get('/user/social/:provider', handleErrorAsync(async (req, res) => {
}
await saveAuthenticator(req.db, req.params.provider, dbUser, payload);
return res.cookie('token', token).redirect('/' + config.user.route);
return res.cookie('token', token, cookieSettings).redirect('/' + config.user.route);
}));
router.get('/user/social-connections', handleErrorAsync(async (req, res) => {

View File

@ -1,3 +1,7 @@
const inAYear = new Date();
inAYear.setFullYear(inAYear.getFullYear() + 1);
export default {
maxAge: 365 * 24 * 60 * 60,
// secure: process.env.NODE_ENV === 'production',
expires: inAYear,
}

View File

@ -7,7 +7,7 @@ class Jwt {
this.publicKey = fs.readFileSync(publicKey);
}
sign(payload, expiresIn = '30d') {
sign(payload, expiresIn = '365d') {
return jwt.sign(payload, this.privateKey, {
expiresIn,
algorithm: 'RS256',

View File

@ -2,12 +2,12 @@ module.exports = [
['de', 'Deutsch', 'https://de.pronouns.page', true],
['es', 'Español', 'https://es.pronouns.page', true],
['en', 'English', 'https://en.pronouns.page', true],
['fr', 'Français', 'https://fr.pronouns.page', false],
['fr', 'Français', 'https://fr.pronouns.page', true],
['nl', 'Nederlands', 'https://nl.pronouns.page', true],
['no', 'Norsk (Bokmål)', 'https://no.pronouns.page', true],
['pl', 'Polski', 'https://zaimki.pl', true],
['pt', 'Português', 'https://pt.pronouns.page', true],
['ru', 'Русский', 'https://ru.pronouns.page', false],
// ['ru', 'Русский', 'https://ru.pronouns.page', false],
['yi', 'ייִדיש', 'https://yi.pronouns.page', false],
['zh', '中文', 'https://zh.pronouns.page', true],
];

Binary file not shown.