mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-09-24 05:05:20 -04:00
Merge branch 'main' into spis-2024-raport
This commit is contained in:
commit
f55e130b81
@ -179,7 +179,7 @@
|
||||
</div>
|
||||
<EasterEgg />
|
||||
<SupportBanners class="my-3" />
|
||||
<SafariWarning />
|
||||
<!-- <SafariWarning /> -->
|
||||
</div>
|
||||
</footer>
|
||||
<div v-else>
|
||||
|
@ -182,9 +182,9 @@
|
||||
>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
<div class="container">
|
||||
<!--<div class="container">
|
||||
<SafariWarning dismissable />
|
||||
</div>
|
||||
</div>-->
|
||||
<div v-if="$user() && $user().bannedReason" class="alert alert-danger mb-0 container">
|
||||
<p class="h4 mb-2">
|
||||
<Icon v="ban" />
|
||||
|
@ -14,6 +14,10 @@
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p v-if="maxitems && events.length > maxitems" class="alert alert-danger">
|
||||
<Icon v="exclamation-triangle" />
|
||||
<T :params="{ maxlength: maxitems }" class="ml-1">crud.validation.listMaxLength</T>
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -25,6 +29,7 @@ export default {
|
||||
year: { required: true },
|
||||
events: { required: true },
|
||||
removeButton: { type: Boolean },
|
||||
maxitems: { default: null },
|
||||
},
|
||||
computed: {
|
||||
eventObjects() {
|
||||
|
103
locale/en/blog/civil-partnerships-poland.md
Normal file
103
locale/en/blog/civil-partnerships-poland.md
Normal file
@ -0,0 +1,103 @@
|
||||
# We're consulting on a civil partnerships bill in Poland!
|
||||
|
||||
<small>2024-03-21 | [@Tess](/@Tess), [@andrea](/@andrea)</small>
|
||||
|
||||

|
||||
|
||||
It's a historical moment for Polish queers – a bill guaranteeing at least a makeshift replacement for marriage equality
|
||||
_finally_ has a real chance of getting passed! Representatives of fifty LGBTQ+ organisations have been invited
|
||||
to take part in pre-consultations about its content by the Minister for Equality, Katarzyna Kotula –
|
||||
and among them was [Anna Tess Gołębiowska](/@Tess) from our Collective!
|
||||
|
||||
The meeting took place on March 18th 2024 in the Chancellery of the Prime Minister, in the building's biggest hall.
|
||||
It was the first ministerial meeting of that scale with the queer community –
|
||||
but not the first official meeting of the new minister with queer people – two weeks earlier she met with the foundation
|
||||
“Rainbow Families” to talk about their life in Poland, their needs, and children waiting for a safer future.
|
||||
|
||||
We invite you to read Tess's report from the meeting:
|
||||
|
||||
**I believe that the meeting was not only important, but also fruitful. The Minister for Equality showed
|
||||
that the voice of the queer community is important to her, that she knows our needs,
|
||||
and she takes the law on civil partnerships seriously and does not intend to accept a bill watered-down
|
||||
by the coalition partners.**
|
||||
|
||||
The meeting of the queer community with the government at the ministerial level is new, but by no means a one-time thing –
|
||||
further pre-consultations have already been announced; Until then, we as organizations should think about specific issues
|
||||
so that we can consciously vote on them. We heard that we were at home in the Chancellery of the Prime Minister.
|
||||
I realize that politics is politics and I may be wrong, but at this point I sincerely believe that Katarzyna Kotula
|
||||
wants to fight for our rights and is outraged that they are not yet obvious to everyone.
|
||||
|
||||
{embed=//youtube.com/embed/Dpaj1DBG3ek=Polish news station TVN24 on the meeting}
|
||||
|
||||
The meeting consisted of two parts: presentation and discussion. First, people from our community, i.e. Mirosława Makuchowska
|
||||
(“Campaign Against Homophobia”) and Hubert Sobecki (“Love Does Not Exclude”), briefly recalled the history of the Polish LGBTQIAP+ movement,
|
||||
with particular emphasis on the demands of civil partnerships and marriage equality, as well as previous draft bills,
|
||||
along with their shortcomings and advantages. Minister Joanna Knapińska from the Government Legislation Center, in turn,
|
||||
presented what exactly the work on each act looks like, with particular emphasis on the consultation and pre-consultation processes.
|
||||
|
||||
From the very beginning, Minister Kotula and Magdalena Dropek from the Coordination and Processes Department
|
||||
of the Office of the Director General of the Chancellery of the Prime Minister
|
||||
(who together with Dawid Dobrogowski from the Office of the Ministry for Equality, representative of the National Council of the Razem party)
|
||||
stated that this meeting is primarily about listening – because what matters is the demands of our community,
|
||||
and queer people should say what they expect. Each person present in the room could speak on behalf of their collective, organization or foundation.
|
||||
|
||||
An extremely wide range of issues was discussed, both regarding the content of the act and legislative issues.
|
||||
In many cases, the minister replied that she was already working on it. She did not present her own bill as part of the presentation,
|
||||
as she wants to talk to the queer community first to hear our demands and only then start working on the bill.
|
||||
She spoke about specific demands, and her statements showed that she would fight for this law – but to do that well
|
||||
she must know what we care about the most.
|
||||
|
||||
Of course, our baseline postulate is simple: we want marriage equality.
|
||||
But at the same time, we know perfectly well that the right-wing-conservative Sejm, in which the Left is a minority,
|
||||
will prohibit marriage equality for as long as it can. We may be offended by that reality,
|
||||
or we could decide to work on the best civil partnership act possible, with the widest package of rights.
|
||||
I believe that it is in our interest to have a good, refined bill preceded by pre-consultations,
|
||||
and not a watered-down, meaningless act that will only serve as a “ticked off” item for the Prime Minister
|
||||
to show off on the international arena.
|
||||
|
||||
As a person representing the [“Neutral Language Council” collective](/team), I was of course talking, among others, on issues of inclusivity –
|
||||
we cannot imagine a situation in which the civil unions act does not cover the rights of transgender and nonbinary people,
|
||||
and therefore also inclusive language.
|
||||
|
||||
Moreover, I personally consider the possibility of adopting a partner's child to be an extremely important issue –
|
||||
it's not an issue that we can treat as a “controversial issue”, it is simply something that Polish society
|
||||
owes to children living in rainbow families, whose rights are violated every day.
|
||||
It is a scandal that when a child loses one parent, which is a huge trauma in itself, Poland condemns them
|
||||
to be torn away from their family, from their parent who is a person they knows, loves and who could support them in dealing with grief.
|
||||
Instead, they end – best case – with a foster family or – worst, more realistic case – in an institution.
|
||||
This is horrendous and our state has no right to continue their suffering.
|
||||
I hope that in 2024 this is something obvious, even for people with conservative views:
|
||||
after all, the well-being of children and families is proudly carried on their banners.
|
||||
A large part of the discussion was devoted to this issue.
|
||||
|
||||
The meeting was initially scheduled for two hours, but it was extended by an hour and a half.
|
||||
At the very beginning, minister Kotula promised that she would listen to the demands of each and every person,
|
||||
and despite the big delay she kept her word. One may think that it's a minor thing or that my bar is set too low,
|
||||
but I believe that this is how politicians should respect the rest of society –
|
||||
since the political class has accustomed us to different standards, it is worth noting that this does not always have to be the case.
|
||||
|
||||
Here's a nice little detail: the catering was entirely vegetarian, mostly vegan, which –
|
||||
if I understood correctly from the conversations on the sidelines – was a completely new thing
|
||||
at the Chancellery of the Prime Minister. I think this is a great idea!
|
||||
Meat has a huge carbon footprint and while consumers' personal choices are their business,
|
||||
the government should not promote this business. A salad instead of kabanos sausages
|
||||
during a meeting doesn't hurt anyone, and it is definitely more inclusive.
|
||||
|
||||
**The Minister for Equality announced that this will not be our last meeting – and I hope that our cooperation
|
||||
will develop effectively, and Katarzyna Kotula will be our voice in the government.
|
||||
She has already shown that although she is a minister without portfolio, she has the enthusiasm to work hard,
|
||||
it is clear that she is a person who started her political career with activism.
|
||||
The most important issue left to us now is to formulate the most important demands for us,
|
||||
five from each organization, which, in our opinion, must be included in the civil partnerships act.
|
||||
So we're turning to the Polish nonbinary community, asking what do they think is most important to bring up –
|
||||
after all the act will not apply to the organizations, but to all LGBTQIAP+ people in the country,
|
||||
so those organizations must speak with _your_ voice.**
|
||||
|
||||
— Anna Tess Gołębiowska (ono/jego, they/them)
|
||||
|
||||
{gallery={
|
||||
"//zaimki.pl/img-local/blog/kprm-konsultacje-1.jpg": "! Tess and Ali Kopacz (on/jego) from the collective Równoważni_k",
|
||||
"//zaimki.pl/img-local/blog/kprm-konsultacje-2.jpg": "! Lu Olszewski (ona/jej) from niebinarnosc.pl, Katarzyna Kotula and Tess",
|
||||
"//zaimki.pl/img-local/blog/kprm-konsultacje-3.jpg": "! Minister Joanna Knapińska from the Government Legislation Center",
|
||||
"//zaimki.pl/img-local/blog/kprm-konsultacje-4.jpg": "! In front of the Chancellery of the Prime Minister",
|
||||
}}
|
85
locale/en/blog/nonbinary-eurovision.md
Normal file
85
locale/en/blog/nonbinary-eurovision.md
Normal file
@ -0,0 +1,85 @@
|
||||
# Nonbinary Eurovision
|
||||
|
||||
<small>2024-03-06 | [@andrea](/@andrea), [@T_Vos](/@T_Vos)</small>
|
||||
|
||||

|
||||
|
||||
_Content warning: This text contains a mention of sexual violence_
|
||||
|
||||
The [Eurovision Song Contest](https://eurovision.tv/) has long been popular in the queer community.
|
||||
It's also full of representations of diverse queer identities: in terms of gender nonconformity,
|
||||
[Dana International](https://www.youtube.com/watch?v=Fv83u7-mNWQ), a transgender winner from 1998 representing Israel, and Austrian drag queen [Conchita Wurst](https://www.youtube.com/watch?v=SaolVEJEjV4),
|
||||
who won the contest in 2014, come to mind.
|
||||
|
||||
A very positive manifestation of the growing acceptance of non-binary in our society is that this year's
|
||||
Eurovision can boast an unprecedented representation of openly non-binary and gender-nonconforming individuals –
|
||||
as many as four countries have nominated such persons! We invite you to get to know them and their songs:
|
||||
|
||||
## 🇬🇧 Olly Alexander – Dizzy
|
||||
|
||||
Great Britain will be represented by pop music star, vocalist of the band Years & Years – Olly Alexander.
|
||||
|
||||
Olly comes from England, he's most well-known as the lead voice of Years & Years and his later solo career.
|
||||
He is also a recognized actor, starring in a series about the HIV/AIDS epidemic in the 80s “It's a sin”.
|
||||
He often uses his platform to address issues important to the LGBTQ+ community.
|
||||
|
||||
Olly is a non-binary person who uses [he/him](/he) pronouns:
|
||||
|
||||
> I feel very nonbinary, and you know, I identify as gay and queer and nonbinary <sup>[[link]](https://nonbinary.wiki/wiki/Olly_Alexander)</sup>
|
||||
|
||||
Olly wrote his Eurovision song together with Danny L. Harle, a well-known UK producer.
|
||||
“Dizzy” is a song about losing oneself in love. It will be heard both during the first semi-final of Eurovision
|
||||
and during the Saturday final.
|
||||
|
||||
{embed=//youtube.com/embed/mvs92WfR8lM=Olly Alexander – Dizzy}
|
||||
|
||||
## 🇮🇪 Bambie Thug – Doomsday Blue
|
||||
|
||||
Irish representation to the 2024 Eurovision will be Bambie Thug – singer and songwriter, who describes fær musical style
|
||||
as ouija-pop and hyperpunk. In their work, they often tackle themes of breakups, witchcraft, and drug addiction.
|
||||
|
||||
Bambie uses [they/them](/they) and [fae/faer](/fae) pronouns.
|
||||
|
||||
Fær song “Doomsday Blue” can be described as a “genre breaker”.
|
||||
In a short, 3-minute (Eurovision requirement) song, Bambie includes alternative rock, pop, and jazz.
|
||||
They describe it as an “electric-metal breakdown”. The song contains numerous references to spells
|
||||
including the famous Avada Kedavra. The lyrics are about an unnamed close person who raped Bambie in May 2023;
|
||||
writing the song and performing it at Eurovision in May is meant to “curse” those memories and the perpetrator.
|
||||
|
||||
{embed=//youtube.com/embed/eA2fKlT8Khw=Bambie Thug – Doomsday Blue}
|
||||
|
||||
## 🇨🇭Nemo – The Code
|
||||
|
||||
Switzerland is represented this year by rapper, singer, and musician performing under the mononym Nemo.
|
||||
Nemo's career began in 2015 with the song “Clownfisch”, and in 2017 they achieved a big success with the single “Du”.
|
||||
In the following years, they were nominated for many awards in the Swiss music market. Nemo is 24 years old.
|
||||
|
||||
Nemo uses [they/them](they) pronouns in English, but in their native German, they prefer to be referred [by name, without pronouns](https://de.pronouns.page/:Nemo).
|
||||
|
||||
“The Code” is a song about coming out and living as a non-binary person, about the difficulties and benefits that come with it.
|
||||
Nemo sings how coming out gave Nemo a sense of freedom to break the "code" of society, to be themselves.
|
||||
We'll hear Nemo's song during the Thursday semi-final and probably during the Saturday final.
|
||||
At the time of writing this article, Nemo is among the favorites to win the contest.
|
||||
|
||||
{embed=//youtube.com/embed/kiGDvM14Kwg=Nemo – The Code}
|
||||
|
||||
## 🇦🇺 Electric Fields - One Milkali (One Blood)
|
||||
|
||||
Electric Fields is an Australian duo creating electronic music that combines contemporary soul with Australian Aboriginal culture.
|
||||
It consists of vocalist Zaachariaha Fielding and keyboardist and producer Michael Ross.
|
||||
|
||||
They describe themselves as “two feminine brothers” and both use [he/him](/he) pronouns.
|
||||
|
||||
> Michael: We wrote that we are “two feminine brothers” in our bio and some people questioned if we should keep it in.
|
||||
> Running and throwing “like a girl” was always an insult and that’s total horse shit. Girls and woman are total bosses and we love that part of us.
|
||||
>
|
||||
> Zaachariaha: There’s room for everybody but the modern world loves building walls and categorizing everything.
|
||||
> Am I a man, a woman, are we an Indigenous band, a queer band? All these boxes feel like barriers and we just fly right over the top on them… sorry suckers!
|
||||
>
|
||||
> <sup>[[link]](https://www.dnamagazine.com.au/electric-fields/)</sup>
|
||||
|
||||
One Mikali is a song promoting interpersonal dialogue and resolving conflicts through conversation,
|
||||
praising the culture of Australian Aboriginal People (from which Zaachariaha comes).
|
||||
The lyrics are in English and in the Yankunytjatjara language.
|
||||
|
||||
{embed=//youtube.com/embed/tJ2IaHxCvdw=Electric Fields - One Milkali}
|
93
locale/pl/blog/cielesnosc-milosc-seksualnosc.md
Normal file
93
locale/pl/blog/cielesnosc-milosc-seksualnosc.md
Normal file
@ -0,0 +1,93 @@
|
||||
# Cielesność, miłość, seksualność – Charline Vermont
|
||||
|
||||
<small>2024-03-19 | [@andrea](/@andrea)</small>
|
||||
|
||||

|
||||
|
||||
Podesłano nam do zrecenzowania polskie wydanie książki „Cielesność, miłość, seksualność”
|
||||
francuskiej seksuolożki Charline Vermont. I muszę przyznać, że czytanie jej co chwilę przynosiło mi uśmiech na twarz.
|
||||
Gdybym tylko miało dostęp do takich materiałów, gdy samo byłom dzieckiem!
|
||||
|
||||
Jest to podręcznik poruszający tematy takie jak ludzkie ciało, intymność, dojrzewanie, zgoda, związki,
|
||||
czy oczywiście słynne pytanie „skąd się biorą dzieci?”. Nie jest kierowany wyłącznie do rodziców
|
||||
szukających pomocy, jak te tematy poruszyć ze swoimi dziećmi, ani wyłącznie do dzieci,
|
||||
które szukają odpowiedzi na nurtujące je pytania – lecz jest to książka do czytania całą rodziną.
|
||||
Każdy rozdział zawiera wstęp z radami dla rodziców (a na początku ksiązki jest też „Zestaw narzędzi” –
|
||||
świetnych rad, jak rozmawiać z dzieckiem na trudne tematy) oraz garść pytań i odpowiedzi kierowanych do dzieci,
|
||||
z podziałem na grupy wiekowe (choć nie jest to podział sztywny, rodzice są zachęcani, by samodzielnie
|
||||
ocenić dojrzałość emocjonalną dziecka).
|
||||
|
||||
Bardzo ważną cechą podręcznika jest fakt używania języka inkluzywnego – co w tematyce płciowości
|
||||
jest niezmiernie istotne, a niestety rzadkie. Cytując autorkę:
|
||||
|
||||
> Dlaczego warto używać języka inkluzywnego?
|
||||
>
|
||||
> Po pierwsze dlatego, że nie ma żadnego powodu, by stawiać rodzaj męski ponad żeńskim. Po drugie ponieważ binarne podejście do płci zostało nam narzucone i możemy to zmienić. A zmiany zachodzą również poprzez słowa, których używamy. 😉
|
||||
>
|
||||
> Ponadto gdy mowa o anatomii czy genitaliach, lepiej wspominać o osobach z penisem czy osobach z łechtaczką/macicą: istnienie osób transpłciowych i niebinarnych (tym bardziej dzieci) jest faktem. Dlatego nie możemy zakładać, że dziecko, które przyszło na świat z penisem, jest chłopcem, a urodzone z łechtaczką – dziewczynką.
|
||||
>
|
||||
> W książce staramy się używać takiego języka, by nie dopuścić u dzieci do poczucia wykluczenia.
|
||||
>
|
||||
> Ale poradnik ten absolutnie nie jest skryptem do wyuczenia się na pamięć. Ma ci towarzyszyć, ma cię wspierać i ma ci pomagać.
|
||||
>
|
||||
> Jeśli czujesz się lepiej, stosując słowa „kobiety”, „mężczyźni”, „dziewczynki”, „chłopcy” – używaj właśnie ich!
|
||||
|
||||
Niezmiernie cieszy nas promowanie i normalizowanie takiego podejścia do kwestii binarności płci i inkluzywności –
|
||||
dzięki niemu queerowe dzieci pewnego dnia nie będą już musiały przechodzić przez traumę czucia się inne i wyobcowane,
|
||||
lecz od samego początku będzie im łatwiej poznać siebie i wiedzieć, że w różnorodności płci i seksualności nie ma nic złego.
|
||||
|
||||
Aczkolwiek nie byłobym sobą, gdybym nie dopatrzyło się paru niedociągnięć w kwestii inkluzywnego języka.
|
||||
Sformułowanie „obu płci” można by zastąpić zwrotem nie sugerującym, że istnieją tylko dwie, np. „wielu płci” lub „wszystkich płci”.
|
||||
Podrozdziały „Droga Mamo, Drogi Tato” lepiej włączałyby niebinarnych rodziców, gdyby nazywały się po prostu „Drodzy Rodzice”.
|
||||
A [przestarzałe](/inkluzywny#seksualista) „homoseksualista/homoseksualistka” w słowniczku pojęć warto by zastąpić
|
||||
przez „osoba homoseksualna”. Ale to już naprawdę pedantyzm z mojej strony, wciąż ogromne plusy za inkluzywny język!
|
||||
|
||||
Co również cieszy, to fakt, że dzieci traktuje się poważnie – nawet najmłodsze grupy wiekowe otrzymują
|
||||
rzetelne informacje podane w sposób przystępny, ale nie infantylny. Chyba najlepiej ilustruje to ten fragment
|
||||
(kierowany do rodziców):
|
||||
|
||||
> Jak nazywasz nos swojego dziecka? A uszy? Prawdopodobnie mówisz „nos” i „uszy”.
|
||||
>
|
||||
> W takim razie jak nazywasz intymne części ciała?
|
||||
>
|
||||
> Pewnie usłyszę „ptaszek”, „siusiaczek”, „cipcia”, „myszka”. 😉
|
||||
>
|
||||
> Zapytałam już wcześniej, dlaczego nazywając tylko te części ciała, używamy sformułowań dziecięcych, a nie anatomicznych, które wybieramy dla pozostałych narządów.
|
||||
>
|
||||
> A gdyby tak używać prawdziwych słów?
|
||||
>
|
||||
> Wiele osób wyrosło w takim otoczeniu językowym, jak gdyby oczywiste było, że nazw „tego tam między nogami” się nie wypowiada. Kogo chcemy chronić, gdy mówiąc o genitaliach, używamy słów innych niż nazwy anatomiczne? Dzieci czy raczej dorosłych, niechętnych odebraniu tym słowom znaczenia seksualnego?
|
||||
>
|
||||
> Penis, pochwa, łechtaczka, jądra są przede wszystkim częściami ludzkiego ciała, a dopiero w dalszej kolejności źródłem przyjemności i fantazji czy obiektem pożądania.
|
||||
>
|
||||
> Zmiany zachowań społecznych zaczynają się od zmian w języku!
|
||||
>
|
||||
> Ewolucja (czy rewolucja?) w edukacji, dzięki której możemy być pierwszym pokoleniem rodziców wychowującym dzieci w duchu pozytywnej edukacji seksualnej, zaczyna się od doboru odpowiednich słów!
|
||||
|
||||
Podręcznik wyjaśnia nie tylko cishormatywne „podstawy” wiedzy o seksualności człowieka,
|
||||
ale przybliża również kwestie transpłciowości, niebinarności i interpłciowości.
|
||||
W rozdziale o związkach tłumaczy nie tylko, jak działają te „konwencjonalne”, ale również,
|
||||
że w porządku jest kochać osoby różnych płci, nie chcieć być w związku albo chcieć być w kilku związkach naraz.
|
||||
|
||||
Autorka tłumaczy kwestie pytania o zgodę oraz stawiania granic nie tylko w kontekście seksu (co jest oczywiście niezmiernie ważne),
|
||||
ale też tłumacząc na przykład, dlaczego ciotka próbująca na siłę dać ci buziaka nie ma prawa tego robić.
|
||||
Kwestie intymności, wstydu i zgody przewijają się przez cały podręcznik, a hasło „Twoje ciało – Twój wybór” powtarza się jak mantra.
|
||||
|
||||
W podręczniku poruszone są chyba wszystkie tematy, których po tego typu publikacji należało by się spodziewać:
|
||||
wspomnę choćby o menstruacji, owłosieniu ciała, antykoncepcji, przebiegu ciąży czy pomocy w odróżnieniu pornografii od rzeczywistości.
|
||||
Natomiast jest parę kwestii, których obecność mnie bardzo pozytywnie zaskoczyła:
|
||||
dzieci są uczone, jak budować poczucie własnej wartości ❤️,
|
||||
pytanie o zakochaniu zilustrowane jest chłopcem na wózku inwalidzkim ❤️,
|
||||
a dzieci nie muszą się martwić o to, że ich intymne części ciała są „dziwne”
|
||||
dzięki załączeniu rysunków przedstawiających naturalną różnorodność piersi, penisów i sromów ❤️
|
||||
|
||||
Szczerze mówiąc, czuję się trochę staro, gdy widzę, jak w przeciągu pokolenia diametralnie zmienia się nasze podejście
|
||||
do edukacji seksualnej 😅 Ale zmienia się na lepsze – więc choć trochę młodszym pokoleniom zazdroszczę,
|
||||
to jednak przede wszystkim się cieszę z tego, jak wiele problemów zmyślonych przez patriarchat, queerfobię i tabu
|
||||
ich już w dużej części nie bedzie dotykało. A książka Charline Vermont jest zdecydowanie istotnym elementem
|
||||
tej pożytecznej zmiany społecznej.
|
||||
|
||||
<a href="https://purana.com.pl/ebook-cielesnosc-milosc-seksualnosc-120-pytan-ktore-zada-ci-twoje-dziecko-charline-vermont-kopia/" target="_blank" rel="noopener" class="btn btn-outline-primary d-block-force my-5">
|
||||
<span class="fal fa-shopping-basket"></span>
|
||||
Zamów na stronie Wydawnictwa Purana
|
||||
</a>
|
@ -40,7 +40,7 @@ Dizzy to piosenka o zatracaniu się w miłości. Usłyszeć ją będzie można z
|
||||
Z Irlandii na Eurowizję pojedzie Bambie Thug – piosenkarze i autorze piosenek, które swój styl muzyczny opisuje jako ouija-pop oraz hyperpunk.
|
||||
W swojej twórczości często porusza tematy rozstań, wiedźmiństwa i uzależnień od narkotyków.
|
||||
|
||||
Bambie używa zaimków [they/them](https://en.pronouns.page/them) oraz [fae/faer](https://en.pronouns.page/fae).
|
||||
Bambie używa zaimków [they/them](https://en.pronouns.page/they) oraz [fae/faer](https://en.pronouns.page/fae).
|
||||
|
||||
Faego piosenka „Doomsday Blue” może być określona jako „łamacz gatunków”. W krótkim, 3-minutowym (wymagania Eurowizji)
|
||||
utworze Bambie mieści rock alternatywny, pop i jazz. Samo określa ją jako „elektryczno-metalowe załamanie”.
|
||||
@ -56,7 +56,7 @@ Szwajcarcarię reprezentuje w tym roku raperze, piosenkarze i muzycze występuj
|
||||
Kariera Nemo rozpoczęła się w 2015 roku od piosenki „Clownfisch”, a 2017 roku duży sukces odniósł singiel „Du”.
|
||||
W kolejnych latach było nominowane do wielu nagród Szwajcarskiego rynku muzycznego. Nemo ma 24 lata.
|
||||
|
||||
Nemo używa po angielsku zaimków [they/them](https://en.pronouns.page/them), jednak w swoim rodzimym niemieckim
|
||||
Nemo używa po angielsku zaimków [they/them](https://en.pronouns.page/they), jednak w swoim rodzimym niemieckim
|
||||
woli kiedy mówi się o nim [po imieniu, bez używania zaimków](https://de.pronouns.page/:Nemo).
|
||||
|
||||
„The Code” to piosenka o wychodzeniu z szafy oraz o życiu jako osoba niebinarna, o trudnościach i korzyściach z tego płynących.
|
||||
|
58
locale/pl/blog/zwiazki-partnerskie.md
Normal file
58
locale/pl/blog/zwiazki-partnerskie.md
Normal file
@ -0,0 +1,58 @@
|
||||
# Konsultujemy ustawę o związkach partnerskich!
|
||||
|
||||
<small>2024-03-20 | [@Tess](/@Tess)</small>
|
||||
|
||||

|
||||
|
||||
Historyczny moment – spotykamy się na szczeblu ministerialnym w sprawie praw osób queerowych!
|
||||
|
||||
Ustawa o związkach partnerskich będzie projektem rządowym, a w prekonsultacjach na temat jej kształtu wzięło udział ponad 50 osób queerowych z całej Polski. Jako kolektyw Rada Języka Neutralnego jesteśmy częścią tego grona.
|
||||
|
||||
Ministra ds. Równości Katarzyna Kotula zaprosiła osoby aktywistyczne z całej Polski na spotkanie wokół projektu ustawy o związkach partnerskich, które odbyło się 18 marca w Kancelarii Prezesa Rady Ministrów. Było to pierwsze spotkanie na taką skalę z queerową społecznością – w dodatku w największej sali w gmachu Kancelarii Prezesa Rady Ministrów, czyli Sali Kolumnowej im. Anny Walentynowicz, ale nie pierwsze spotkanie nowej ministry z osobami queer; 5 marca w tym samym miejscu rozmawiała z Fundacją Tęczowe Rodziny o ich życiu w Polsce, potrzebach i dzieciach czekających na bezpieczną przyszłość.
|
||||
|
||||
**Zacznę może od podsumowania, bo to przecież jest dla większości osób najistotniejsze: uważam, że spotkanie było nie tylko ważne, ale i owocne. Ministra ds. Równości pokazała, że głos queerowej społeczności jest dla niej ważny, nasze potrzeby są jej znane, a ustawę o związkach partnerskich traktuje poważnie i nie zamierza podpisać się pod wydmuszką. Spotkanie queerowej społeczności z rządem na szczeblu ministerialnym to nowość, ale bynajmniej nie coś jednorazowego – już zostały zapowiedziane kolejne prekonsultacje; do ich czasu mamy jako organizacje przemyśleć konkretne kwestie, by móc nad nimi świadomie zagłosować. Usłyszałośmy, że w Kancelarii Prezesa Rady Ministrów jesteśmy u siebie. Zdaję sobie sprawę, że polityka jest polityką i mogę się pomylić, ale w tym momencie szczerze wierzę, że Katarzyna Kotula chce walczyć o nasze prawa i jest oburzona, że nie są one jeszcze oczywistością dla wszystkich.**
|
||||
|
||||
{embed=//youtube.com/embed/Dpaj1DBG3ek=TVN24 o spotkaniu}
|
||||
|
||||
Spotkanie składało się z dwóch części: prezentacji oraz dyskusji. Osoby z naszej społeczności, czyli Mirosława Makuchowska (Kampania Przeciw Homofobii) i Hubert Sobecki (Miłość Nie Wyklucza), przypomniały w telegraficznym skrócie historię polskiego ruchu LGBTQIAP+, ze szczególnym uwzględnieniem postulatów związków partnerskich i równości małżeńskiej oraz poprzednich projektów ustaw, wraz z ich wadami i zaletami. Ministra Joanna Knapińska z Rządowego Centrum Legislacji przedstawiła z kolei, jak dokładnie wygląda praca nad każdą ustawą, ze szczególnym uwzględnieniem procesów konsultacji i prekonsultacji.
|
||||
|
||||
Już na wstępie ministra Kotula oraz Magdalena Dropek z Wydziału Koordynacji i Procesów Biura Dyrektora Generalnego KPRM (która wspólnie z Dawidem Dobrogowskim z Biura Ministry ds. Równości, przedstawicielem Rady Krajowej partii Razem) oświadczyły, że to spotkanie służy przede wszystkim temu, żeby słuchać – ponieważ liczą się postulaty naszej społeczności i to osoby queerowe powinny mówić, czego oczekują. Każda osoba obecna na sali mogła zająć głos w imieniu swojego kolektywu, organizacji czy fundacji.
|
||||
|
||||
Poruszona została ogromnie szeroka gama zagadnień, zarówno dotyczących kwestii treści ustawy, jak i zagadnień legislacyjnych. W wielu przypadkach ministra odpowiadała, że już nad tym pracuje. Nie przedstawiła w ramach prezentacji własnego projektu ustawy – o czym z oburzeniem napisał Bart Staszewski – ale przyznam, że nie rozumiem tego zastrzeżenia. Oczywiście ideałem byłoby otrzymać dokument do zapoznania się wcześniej, by móc dyskutować o konkrecie, ale skoro nie miało to miejsca, to długi wykład w wykonaniu ministry, kiedy osoby queerowe przyjechały z całej Polski, a czas był ograniczony, byłby po prostu nie na miejscu. Jeśli oczekujemy, że rząd będzie nas słuchać, to jak możemy same postulować o skrócenie czasu, kiedy możemy mówić? Co więcej – strategia, w którym ministra najpierw rozmawia ze społecznością queerową, by usłyszeć nasze postulaty, a dopiero potem przystąpić do prac nad ustawą, nie wydaje mi się czymś skandalicznym. Tym bardziej, kiedy Katarzyna Kotula wypowiadała się o konkretnych postulatach, a z tych wypowiedzi wynikało, że będzie o tę ustawę walczyć. A skoro ma o nią walczyć, musi przecież wiedzieć, na czym zależy nam najbardziej.
|
||||
|
||||
Oczywiście, podstawowy postulat jest prosty: chcemy równości małżeńskiej. Jednocześnie doskonale wiemy, że prawicowo-konserwatywny Sejm, w którym Lewica stanowi mniejszość, będzie nam równości małżeńskiej zabraniać tak długo, jak tylko będzie w stanie. Możemy się obrazić na rzeczywistość, a możemy uznać, że skoro mamy taką możliwość, pracujmy nad ustawą o związkach i dbajmy o to, by ta okazała się jak najlepsza, a pakiet praw – jak najszerszy. Uważam, że w naszym interesie jest dobra, dopracowana, poprzedzona prekonsultacjami ustawa, a nie wydmuszka, którą premier będzie mógł pochwalić się na arenie międzynarodowej jako „odhaczoną”, a która niewiele zmieni w naszym życiu. Fakt, że będzie to ustawa rządowa, działa na naszą korzyść – projekt poselski mógłby zostać potraktowany jako „te gendery od lewaczek” i odrzucony, a konkurencyjny, okrojony i obraźliwy, złożyłaby zapewne któraś z prawicowych partii. Społeczności LGBTQIAP+ zostałyby wtedy ochłapy.
|
||||
|
||||
Jako osoba reprezentująca [kolektyw Rada Języka Neutralnego](/kolektyw-rjn) mówiłom oczywiście m.in. o kwestiach inkluzywności – nie wyobrażamy sobie sytuacji, w której ustawa o związkach nie obejmuje praw osób transpłciowych i niebinarnych, a więc także inkluzywnego języka.
|
||||
|
||||
Ponadto osobiście za niezwykle istotną kwestię uważam możliwość przysposobienia dziecka osoby partnerskiej – to nie jest zagadnienie, które możemy traktować jako „sprawę kontrowersyjną”, to jest po prostu coś, co polskie społeczeństwo jest winne dzieciom żyjącym w tęczowych rodzinach, których prawa są łamane każdego dnia. To skandal, że w sytuacji, gdy dziecko straci jednego rodzica, co jest ogromną traumą samo w sobie, zostaje przez Polskę skazane na wyrwanie z rodziny, od rodzica będącego osobą, którą zna, kocha i która mogłaby wesprzeć je w radzeniu sobie z żałobą. Zamiast tego trafia – w lepszej sytuacji – do rodziny zastępczej albo – w gorszej, bardziej realnej – do placówki. To jest zbrodnia i nasze państwo nie ma prawa jej kontynuować. Mam nadzieję, że w 2024 roku jest to coś oczywistego nawet dla osób o konserwatywnych poglądach: w końcu dobro dzieci i rodziny dumnie noszą na sztandarach. Tej kwestii została poświęcona naprawdę spora część dyskusji.
|
||||
|
||||
Oprócz postulatów dotyczących ustawy o związkach partnerskich poruszona została tematyka innej ustawy, która nas bezpośrednio dotyczy – ustawy o zmianie kodeksu karnego w zakresie mowy nienawiści oraz przestępstw z nienawiści. Wciąż trwają międzyresortowe dyskusje, jak szeroki będzie jej zakres. Ministra ds. Równości dba o to, by był jak najszerszy.
|
||||
|
||||
Spotkanie wstępnie zostało zaplanowane na dwie godziny, ale zostało przedłużone aż o półtorej. Mam pewne zastrzeżenia do strony organizacyjnej: przy debacie na taką skalę dwie godziny to zdecydowanie za mało; przydałoby się z góry zaplanować dłuższe wydarzenie z przerwą w trakcie. W efekcie kilka osób musiało opuścić salę przed końcem. Druga kwestia to moderacja. Zabrakło mi podziału debaty np. na kwestie dotyczące samej treści ustawy, treści dotyczące legislacji oraz pytania, przez co mieszały się skrajnie różne zagadnienia. Dodatkowo w trakcie zmieniana była kolejność zajmowania głosu – najpierw miały wypowiadać się kolejno osoby dookoła stołu, od prawej do lewej, później zmieniło się to w od lewej do prawej, następnie głos wrócił na prawo, a potem znowu na lewo; z pojedynczymi wskazaniami osób zgłaszających się po drodze… Mam świadomość, że wynikało to z próby sprawiedliwego podziału, ale przecież to nie tak, że osoby które usiadły po tej samej stronie sali prezentowały wspólną agendę, więc tak naprawdę było to nadal całkowicie losowe. Mam wrażenie, że właśnie podział tematyczny okazałby się tu pomocny, najlepiej połączony z głosowaniem, który blok powinien być poruszony jako pierwszy. Jaka jednak metoda nie zostałaby obrana, brakowało mi spójnego określenia zasad na samym początku i trzymania się ich – czyli np. albo rzeczywiście po kolei, albo według kolejności zgłoszeń. Może to kwestia neuroatypowości, ale nie byłoby dla mnie żadnym problemem np. od początku wiedzieć, że będę mówić jako ostatnie, za to mocno wybijało z rytmu dwukrotne „to już prawie ja”, po czym kolejność ulegała zmianie. Drobiazg? Jasne. Ale do naprawienia na przyszłość, więc uważam, że jako taki potrzebujący feedbacku.
|
||||
|
||||
Po dawce krytyki w stronę osób organizatorskich wspomnę jeszcze o czymś, co uderzyło mnie z zupełnie innej strony. W pewnym momencie Linus Lewandowski reprezentujący Homokomando wyskoczył na środek sali z flagą „Śluby, nie związki” i zaczął wymieniać postulaty znacznie wykraczające tematyką poza spotkanie. To był moment, gdy spotkanie już musiało zostać przedłużone i wciąż dobra połowa sali nie miała możliwości wypowiedzieć się na temat ustawy. Rozumiem takie wystąpienie w sytuacji exposé kogoś o poglądach konserwatywnych, by dotrzeć do wszystkich osób śledzących transmisję, ale w momencie, kiedy znajdujemy się w gronie, w którym równość małżeńską popierają chyba nawet winogrona w sałatce owocowej, a kamer brak, odbieram to jako brak szacunku dla czasu pozostałych osób aktywistycznych. Trudno pozbyć się wrażenia, że Linus zrobił to po to, żeby móc pochwalić się zdjęciami w social mediach (skoro miał transparent przy sobie, trudno mówić o spontaniczności), a te mógł bez problemu zrobić po zakończeniu części oficjalnej. Poruszanie tematyki równości małżeńskiej (wraz z pełnymi prawami do adopcji) w przestrzeni publicznej jest niezwykle ważne, ale post Homokomando nie byłby mniej edukacyjny, gdyby zdjęcie ilustracyjne zostało wykonane po tym, jak wszystkie osoby zajmą głos. Tym bardziej, że było widać, że niemal wszystkie obecne na sali osoby aktywistyczne naprawdę starały się unikać dygresji i wypowiadać się w sposób maksymalnie precyzyjny. Skoro domagamy się godności i szacunku (słusznie!), to szanujmy siebie nawzajem.
|
||||
|
||||
Na samym początku Katarzyna Kotula obiecała, że wysłucha postulatów każdej osoby i dotrzymała słowa, choć przecież mogłaby próbować się wymigać – np. oświadczyć, że znałośmy reżim czasowy i to wina pozostałych osób aktywistycznych, które nie uszanowały, że nie są jedynymi, które mają coś do powiedzenia, a nie jej. Trzeba opuścić salę, siła wyższa. Ktoś może uznać oczywiście, że to drobiazg albo że mam zawieszoną zbyt nisko poprzeczkę – wręcz przeciwnie. Uważam, że właśnie tak powinien wyglądać szacunek osób zajmujących się polityką do reszty społeczeństwa, ale ponieważ klasa polityczna przyzwyczaiła nas do innych standardów, warto odnotować, że nie zawsze musi tak być.
|
||||
|
||||
Tutaj mały drobiazg: catering był w całości wegetariański, w większości wegański, co – jeśli dobrze zrozumiałom z rozmów w kuluarach – stanowiło to w KPRM całkowitą nowość. Uważam, że to znakomity pomysł! Mięso ma ogromny ślad węglowy i o ile prywatne wyboru osób konsumenckich to ich sprawa, to rząd nie powinien promować tego biznesu. Sałatka zamiast kabanosów w czasie spotkania nikogo nie krzywdzi, a jest zdecydowanie bardziej inkluzywna. Dawid Dobrogowski dodał też, że w przyszłości dodatkowo przy potrawach mają pojawić się karteczki z alergenami, co jest jeszcze lepszą inicjatywą, ponieważ jako osoba chorująca na celiakię obawiałom się większości tych przekąsek. Jasne, że nie jest to kluczowa sprawa, ale jednak po kilku godzinach dyskusji odżywienie mózgu odrobiną glukozy jest czymś zdecydowanie pozytywnym. Jeśli biuro zdecyduje się podążać w tym kierunku, podpowiadam: przy mejlingu dotyczącym kwestii technicznych warto zapytać, czy na spotkaniu będą osoby na dietach wykluczeniowych, co od razu da jasną odpowiedź, czy niezbędna jest potrawa bezglutenowa, bez orzeszków arachidowych czy bez soi. A jeśli okaże się, że będą potrzebne, to takie produkty koniecznie muszą zostać zaserwowane w osobnych naczyniach i w oryginalnych opakowaniach, by nie zostały zanieczyszczone np. okruszkami zwykłych ciastek.
|
||||
|
||||
**Ministra ds. Równości zapowiedziała, że to nie ostatnie nasze spotkanie – i mam nadzieję, że nasza współpraca będzie rozwijać się efektywnie, a Katarzyna Kotula będzie naszym głosem w rządzie. Już teraz pokazała, że choć jest ministrą bez teki, to ma zapał, by ciężko pracować, widać, że to osoba, która zaczynała od aktywizmu. Najważniejszą kwestią, jaką pozostawiła nam teraz, jest sformułowanie najważniejszych dla nas postulatów, pięciu od każdej organizacji, które według nas muszą znaleźć się w ustawie o związkach partnerskich. I tutaj zwracamy się do Was: co jest według Was najważniejsze? Oczywiście mamy własne pomysły (wzięłośmy udział w prekonsultacjach, by móc je przedstawić) i mogłobyśmy zredagować tę wiadomość natychmiast, ale przecież ustawa będzie obowiązywać nie tylko organizacje, ale wszystkie osoby LGBTQIAP+ w kraju. Zatem nim sformułujemy odpowiedź, zależy nam na zorientowaniu się, czego oczekujecie. Doceniamy, że ministra chce słuchać głosu społeczności reprezentowanej przez kilkadziesiąt organizacji z całego kraju, ale te organizacje – w tym my – musimy mówić Waszym głosem. Możecie pisać do nas w komentarzach w social mediach oraz [mejlowo](mailto:kontakt@zaimki.pl).**
|
||||
|
||||
— Anna Tess Gołębiowska (ono/jego)
|
||||
|
||||
{gallery={
|
||||
"/img-local/blog/kprm-konsultacje-1.jpg": "! Tess i Ali Kopacz (on/jego) z kolektywu Równoważni_k",
|
||||
"/img-local/blog/kprm-konsultacje-2.jpg": "! Lu Olszewski (ona/jej) z niebinarnosc.pl, Katarzyna Kotula i Tess",
|
||||
"/img-local/blog/kprm-konsultacje-3.jpg": "! Ministra Joanna Knapińska z Rządowego Centrum Legislacji",
|
||||
"/img-local/blog/kprm-konsultacje-4.jpg": "! Przed Kancelarią Prezesa Rady Ministrów",
|
||||
}}
|
||||
|
||||
<!--
|
||||
TODO
|
||||
https://allmylinks.com/queer-ali
|
||||
|
||||
<a href="TODO" target="_blank" rel="noopener" class="btn btn-outline-primary d-block-force my-5">
|
||||
<span class="fal fa-file"></span>
|
||||
Nasze wybrane postulaty (PDF)
|
||||
</a>
|
||||
-->
|
@ -83,8 +83,10 @@ export default [
|
||||
return new Event(`{${e.link}=${e.name}}`, 'LGBTQ', e.date.month, dayYear(e.date.day, e.date.year), EventLevel.Day);
|
||||
}),
|
||||
|
||||
// marsze 2024
|
||||
// marsze i eventy 2024
|
||||
new Event('Parada Równości w Warszawie', 'LGBTQ', 6, dayYear(15, 2024), EventLevel.Day),
|
||||
new Event('Parada Równości w Warszawie', 'LGBTQ', 6, dayYear(22, 2024), EventLevel.Day),
|
||||
new Event('{https://dzientrans.pl/=Drugi Ogólnopolski Dzień Widoczności Osób Transpłciowych}', 'Transgender', 4, dayYear(13, 2024), EventLevel.Day),
|
||||
|
||||
// --- dynamic date ---
|
||||
|
||||
|
@ -2483,6 +2483,11 @@ links:
|
||||
quote: >
|
||||
Na stronie staramy się korzystać z języka neutralnego płciowo według wskazówek opracowanych
|
||||
przez autorza strony zaimki.pl (jeżeli koncept jest dla ciebie nowy, zachęcamy cię do zapoznania się z nim na ich stronie).
|
||||
-
|
||||
icon: 'play-circle'
|
||||
url: 'https://fakty.tvn24.pl/zobacz-fakty/historyczne-spotkanie-w-sprawie-zwiazkow-partnerskich-fakt-ze-zostalismy-wysluchani-to-jest-duza-zmiana-st7828970'
|
||||
headline: '"Historyczne spotkanie" w sprawie związków partnerskich. "Fakt, że zostaliśmy wysłuchani, to jest duża zmiana"'
|
||||
extra: ' – <strong>Fakty TVN24</strong>'
|
||||
recommended:
|
||||
-
|
||||
icon: 'isjp.svg'
|
||||
|
BIN
locale/pl/img/blog/cielesnosc-milosc-seksualnosc.png
Normal file
BIN
locale/pl/img/blog/cielesnosc-milosc-seksualnosc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 385 KiB |
BIN
locale/pl/img/blog/kprm-konsultacja.png
Normal file
BIN
locale/pl/img/blog/kprm-konsultacja.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 MiB |
BIN
locale/pl/img/blog/kprm-konsultacje-1.jpg
Normal file
BIN
locale/pl/img/blog/kprm-konsultacje-1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 143 KiB |
BIN
locale/pl/img/blog/kprm-konsultacje-2.jpg
Normal file
BIN
locale/pl/img/blog/kprm-konsultacje-2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 118 KiB |
BIN
locale/pl/img/blog/kprm-konsultacje-3.jpg
Normal file
BIN
locale/pl/img/blog/kprm-konsultacje-3.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 197 KiB |
BIN
locale/pl/img/blog/kprm-konsultacje-4.jpg
Normal file
BIN
locale/pl/img/blog/kprm-konsultacje-4.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 129 KiB |
@ -70,7 +70,7 @@ pronouns:
|
||||
intro: 'Meu conjunto é'
|
||||
normative: 'Normativo'
|
||||
alt:
|
||||
button: 'Gerar uma ligação à formas intercambiáveis'
|
||||
button: 'Gerar uma ligação a formas intercambiáveis'
|
||||
header: 'Formas intercambiáveis'
|
||||
raw: 'intercambiável'
|
||||
generated: 'Estes conjuntos foram criados com o gerador. A equipe do pronouns.page não é responsável por eles.'
|
||||
@ -631,7 +631,7 @@ profile:
|
||||
defaults: 'Restaurar valores padrão'
|
||||
propagate: 'Salvar alterações em seus cartões em todas as línguas'
|
||||
timezone:
|
||||
time: 'São %time% de um(a) %weekday% dentro do meu fuso horário'
|
||||
time: 'São %time% e é %weekday% dentro do meu fuso horário'
|
||||
areas:
|
||||
America: 'América'
|
||||
Africa: 'África'
|
||||
@ -667,11 +667,16 @@ profile:
|
||||
pink: 'Rosa'
|
||||
red: 'Vermelho'
|
||||
orange: 'Laranja'
|
||||
yellow: 'Amarelo'
|
||||
teal: 'Verde-azulado'
|
||||
green: 'Verde'
|
||||
blue: 'Azul'
|
||||
purple: 'Roxo'
|
||||
brown: 'Marrom'
|
||||
grey: 'Cinza'
|
||||
styles:
|
||||
_: '(Estilo…)'
|
||||
bold-italics: 'Negrito e itálico'
|
||||
bold: 'Negrito'
|
||||
italics: 'Itálico'
|
||||
small: 'Pequeno'
|
||||
@ -681,13 +686,16 @@ profile:
|
||||
duplicateIcon: 'Ícone deve ser único'
|
||||
duplicateDescription: 'A descrição deve ser única'
|
||||
invalidOpinion: 'O ícone selecionado não foi encontrado na legenda abaixo'
|
||||
expendableList:
|
||||
more: '… e %count% mais itens'
|
||||
show: '(clique para mostrar)'
|
||||
wordsColumnHeader: 'Coluna de cabeçalho'
|
||||
|
||||
banner: >
|
||||
Você pode usar o nosso site para criar cartões, {/@example=como esse},
|
||||
que está incluindo seus nomes, prononomes, bandeiras, palavras de que se gosta, etc.
|
||||
Depois pode por no seu bio ou rodapé de e-mail.
|
||||
Somente crie a sua conta {/conta=aqui}.
|
||||
example: 'Veja um cartão de @exemplo '
|
||||
bannerButton: 'Crie um cartão'
|
||||
card:
|
||||
link: 'Imagem do cartão'
|
||||
@ -712,7 +720,7 @@ profile:
|
||||
email:
|
||||
content: 'Ume moderadore aplicou o seguinte aviso de conteúdo em seu cartão:'
|
||||
subject: 'Aviso de conteúdo aplicado em seu perfil'
|
||||
display: 'Continuar para o cartão'
|
||||
display: 'Continuar'
|
||||
flagsCustomForm:
|
||||
altExample: 'Um exemplo de como um texto alternativo pode ser fraseado '
|
||||
alt: '(opcional) Texto alternativo descrevendo a aparência da bandeira (veja abaixo)'
|
||||
@ -728,10 +736,30 @@ profile:
|
||||
header: 'Backup de cartões'
|
||||
import:
|
||||
action: 'Recuperar backup'
|
||||
success: 'Seu backup foi restaurado com sucesso! A página será atualizada.'
|
||||
export:
|
||||
action: 'Gerar backup'
|
||||
success: 'Um arquivo de backup está sendo gerado. O download deverá iniciar em breve'
|
||||
error:
|
||||
signature: 'Assinatura inválida, não é possível verificar a integridade do arquivo'
|
||||
markdown:
|
||||
enable: 'Habilite a sintaxe Markdown no seu cartão. '
|
||||
features: 'Clique para mostrar os recursos Markdown suportados'
|
||||
calendar:
|
||||
header: 'Calendário'
|
||||
customEvents:
|
||||
header: 'Eventos pessoais/customizados'
|
||||
disclaimer: 'Evento personalizado adicionado pelo proprietário do cartão'
|
||||
month: 'Mês '
|
||||
day: 'Dia'
|
||||
comment: 'Comentário (opcional)'
|
||||
validation:
|
||||
missingName: 'O nome do evento é obrigatório'
|
||||
missingDate: 'A data é obrigatória '
|
||||
invalidDate: 'A data inserida não é válida'
|
||||
name: 'Nome do evento (por exemplo: “início de TH”)'
|
||||
publicEvents:
|
||||
header: 'Eventos do Calendário Queer'
|
||||
pronunciation:
|
||||
ipa: 'Pronúncia usando IPA'
|
||||
|
||||
@ -808,6 +836,9 @@ terms:
|
||||
header: 'Termos de Serviço'
|
||||
lastUpdate: 'Atualizados pela última vez em'
|
||||
consent: 'Ao se registrar, você aceita os {/termos=Termos de Serviço}.'
|
||||
translationDisclaimer: >
|
||||
O texto a seguir é apenas uma tradução auxiliadora. A única versão juridicamente oficial dos Termos de Serviço é
|
||||
a em inglês, disponível {https://en.pronouns.page/terms=aqui}.
|
||||
content:
|
||||
intro: >
|
||||
Os Termos de Serviço regulamentam o seu acesso e a sua utilização do Serviço fornecidos no site
|
||||
@ -956,15 +987,21 @@ ban:
|
||||
cientes acerca de determinados problemas. Se você acredita que sua conta não violou os nossos {/termos=Termos de
|
||||
Serviço}, entre em contato conosco em {mailto:contact@pronouns.page=contact@pronouns.page} e poderemos reavaliar
|
||||
o seu caso.
|
||||
appealEmail: >
|
||||
Fazer moderação é complexo e delicado; ela é feita por voluntáries que nem sempre concordam entre si ou estão
|
||||
cientes acerca de determinados problemas. Se você acha que sua conta não violou nossos Termos de Serviço,
|
||||
responda a este e-mail e poderemos reavaliar o seu caso.
|
||||
|
||||
report:
|
||||
action: 'Reportar abuso'
|
||||
comment: 'por favor, explique brevemente o que há de errado com esse perfil'
|
||||
confirm: 'Você tem certeza de que deseja reportar @%username%?'
|
||||
sent: 'Sua reportação foi enviada. Agradecemos pela colaboração!'
|
||||
terms: 'Lembre-se das restrições dos nossos {/termos=Termos de servico}'
|
||||
hoarding: 'Por favor, não reporte contas por "acumulação" de nomes de usuário. Contas sem cartão são removidas automaticamente após um período de inatividade. Reportar uma conta não fará com que ela seja removida antes desse período.'
|
||||
|
||||
terms: 'Lembre-se das restrições dos nossos {/termos=Termos de Serviço}'
|
||||
hoarding: >
|
||||
Por favor, não reporte contas por "acumulação" de nomes de usuárie. Contas sem cartão são removidas
|
||||
automaticamente após um período de inatividade. Reportar uma conta não fará com que ela seja removida antes desse
|
||||
período.
|
||||
flags:
|
||||
Abroromantic: 'Abrorromânti{inflection_c}'
|
||||
Abrosexual: 'Abrossexual'
|
||||
@ -1063,6 +1100,10 @@ flags_alt:
|
||||
Uma bandeira retangular com seis listras horizontais de mesma largura: vermelha, laranja, amarela, verde, azul e
|
||||
roxa; uma divisa (triangular) no lado esquerdo, composta pelas seguintes cores (à partir da esquerda): amarela
|
||||
com um círculo roxo, branca, rosa, azul clara, marrom, preta
|
||||
_black-ribbon: 'Uma fita preta'
|
||||
_red-ribbon: 'Uma fita vermelha'
|
||||
_sex-work: 'Um guarda-chuva vermelho aberto'
|
||||
_yellow-ribbon: 'Uma fita amarela'
|
||||
|
||||
calendar:
|
||||
header: 'Calendário'
|
||||
@ -1133,6 +1174,7 @@ calendar:
|
||||
trans_week: 'Semana da Consciência Trans'
|
||||
trans_parent_day: 'Dia de Nans Trans'
|
||||
nonbinary_week: 'Semana da Consciência Não-Binária'
|
||||
nonbinary_week___timeDescription: 'na semana (segunda-domingo) em torno de 14 de julho'
|
||||
polyamory_day: 'Dia do Poliamor'
|
||||
homophobia_sport: 'Dia Internacional Contra a Homomisia nos Esportes'
|
||||
gay_uncles_day: 'Dia dos Tios Gays'
|
||||
|
@ -167,21 +167,19 @@ const nuxtConfig: NuxtConfig = {
|
||||
],
|
||||
plugins: [
|
||||
{ src: '~/plugins/polyfill.ts', mode: 'client' },
|
||||
{ src: '~/plugins/axios.js' },
|
||||
{ src: '~/plugins/axios.ts' },
|
||||
{ src: '~/plugins/globals.ts' },
|
||||
{ src: '~/plugins/auth.ts' },
|
||||
{ src: '~/plugins/datepicker.js', mode: 'client' },
|
||||
{ src: '~/plugins/track.js', mode: 'client' },
|
||||
{ src: '~/plugins/browserDetect.js' },
|
||||
{ src: '~/plugins/datepicker.ts', mode: 'client' },
|
||||
{ src: '~/plugins/track.ts', mode: 'client' },
|
||||
{ src: '~/plugins/browserDetect.ts' },
|
||||
],
|
||||
components: true,
|
||||
buildModules: [
|
||||
'@nuxt/typescript-build',
|
||||
],
|
||||
loaders: {
|
||||
ts: {
|
||||
configFile: path.resolve(__dirname, 'tsconfig.json'),
|
||||
},
|
||||
typescript: {
|
||||
typeCheck: process.env.NODE_ENV !== 'production',
|
||||
},
|
||||
modules: [
|
||||
'@privyid/nuxt-csrf',
|
||||
@ -220,8 +218,12 @@ const nuxtConfig: NuxtConfig = {
|
||||
enableAutoPageviews: false,
|
||||
},
|
||||
sentry: {
|
||||
disabled: !process.env.SENTRY_DSN,
|
||||
tracing: {
|
||||
tracesSampleRate: 0.1,
|
||||
browserTracing: {
|
||||
enableInp: true,
|
||||
},
|
||||
},
|
||||
publishRelease: {
|
||||
telemetry: false,
|
||||
@ -260,7 +262,10 @@ const nuxtConfig: NuxtConfig = {
|
||||
// filter out exceptions originating from third party
|
||||
for (const exception of event.exception?.values || []) {
|
||||
for (const frame of exception.stacktrace?.frames || []) {
|
||||
if (denyUrls.some((denyUrl) => frame.abs_path?.startsWith(denyUrl))) {
|
||||
const originatingFromThirdParty = denyUrls.some((denyUrl) => {
|
||||
return frame.abs_path?.startsWith(denyUrl) || frame.filename?.startsWith(denyUrl);
|
||||
});
|
||||
if (originatingFromThirdParty) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -269,6 +274,7 @@ const nuxtConfig: NuxtConfig = {
|
||||
// do not send user information as Sentry somehow automatically detects username, email and user id
|
||||
// https://docs.sentry.io/platforms/javascript/data-management/sensitive-data/
|
||||
delete event.user;
|
||||
|
||||
return event;
|
||||
},
|
||||
beforeSendTransaction(event) {
|
||||
|
@ -65,6 +65,7 @@
|
||||
"sqlite": "^4.0.12",
|
||||
"sqlite3": "^5.1.6",
|
||||
"suml": "^0.2.2",
|
||||
"ts-node": "^10.9.2",
|
||||
"twitter": "^1.7.1",
|
||||
"ulid": "^2.3.0",
|
||||
"uuid": "^8.3.2",
|
||||
@ -130,7 +131,6 @@
|
||||
"suml-loader": "^0.1.1",
|
||||
"ts-jest": "^29.1.1",
|
||||
"ts-json-schema-generator": "^1.5.0",
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.3.3",
|
||||
"vue-tsc": "^1.8.27",
|
||||
"webpack": "^4.47.0",
|
||||
|
@ -1,10 +1,9 @@
|
||||
import Vue from 'vue';
|
||||
import type { JwtPayload } from 'jsonwebtoken';
|
||||
import type { Store } from 'vuex';
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
import { isGranted, parseUserJwt } from '../src/helpers.ts';
|
||||
import cookieSettings from '../src/cookieSettings.ts';
|
||||
import type { User } from '../src/user.ts';
|
||||
import type { RootState } from '../store/index.ts';
|
||||
|
||||
declare module 'vue/types/vue' {
|
||||
interface Vue {
|
||||
@ -16,7 +15,7 @@ declare module 'vue/types/vue' {
|
||||
}
|
||||
}
|
||||
|
||||
export default ({ app, store }: { app: Vue, store: Store<RootState> }): void => {
|
||||
const plugin: Plugin = ({ app, store }) => {
|
||||
const token = app.$cookies.get('token');
|
||||
if (token) {
|
||||
store.commit('setToken', token);
|
||||
@ -95,3 +94,5 @@ export default ({ app, store }: { app: Vue, store: Store<RootState> }): void =>
|
||||
saveAccounts(accounts);
|
||||
};
|
||||
};
|
||||
|
||||
export default plugin;
|
||||
|
@ -1,4 +1,6 @@
|
||||
export default function ({ $axios, app }) {
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
|
||||
const plugin: Plugin = ({ $axios, app }) => {
|
||||
$axios.onRequest((config) => {
|
||||
const token = app.$csrfToken();
|
||||
|
||||
@ -8,4 +10,6 @@ export default function ({ $axios, app }) {
|
||||
|
||||
return config;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default plugin;
|
@ -1,9 +1,11 @@
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
|
||||
const SAFARI_REGEX = /^((?!chrome|android).)*safari/i;
|
||||
|
||||
export default ({ req }, inject) => {
|
||||
const plugin: Plugin = ({ req }, inject) => {
|
||||
inject('isSafari', () => {
|
||||
if (process.server && req) {
|
||||
return SAFARI_REGEX.test(req.headers['user-agent']);
|
||||
return SAFARI_REGEX.test(req.headers['user-agent']!);
|
||||
}
|
||||
|
||||
if (process.client) {
|
||||
@ -13,3 +15,5 @@ export default ({ req }, inject) => {
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
export default plugin;
|
@ -1,6 +1,9 @@
|
||||
import Vue from 'vue';
|
||||
import VuejsDatePicker from 'vuejs-datepicker';
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
|
||||
export default () => {
|
||||
const plugin: Plugin = () => {
|
||||
Vue.component('Datepicker', VuejsDatePicker);
|
||||
};
|
||||
|
||||
export default plugin;
|
@ -1,12 +1,11 @@
|
||||
import Vue from 'vue';
|
||||
import type { Store } from 'vuex';
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
import { Translator } from '../src/translator.js';
|
||||
import { buildDict } from '../src/helpers.ts';
|
||||
import { DateTime, Settings } from 'luxon';
|
||||
import { decodeTime } from 'ulid';
|
||||
import type { Pronoun } from '../src/classes.ts';
|
||||
import type { LocaleDescription } from '../locale/locales.ts';
|
||||
import type { RootState } from '../store/index.ts';
|
||||
|
||||
import translations from '../data/translations.suml';
|
||||
import baseTranslations from '../locale/_base/translations.suml';
|
||||
@ -25,10 +24,6 @@ declare module '@nuxt/types/config/runtime' {
|
||||
|
||||
declare module 'vue/types/vue' {
|
||||
interface Vue {
|
||||
// properties from other dependencies
|
||||
router: any;
|
||||
$cookies: any;
|
||||
|
||||
$eventHub: Vue;
|
||||
$base: string;
|
||||
$translator: Translator;
|
||||
@ -40,7 +35,7 @@ declare module 'vue/types/vue' {
|
||||
}
|
||||
}
|
||||
|
||||
export default ({ app, store }: { app: Vue, store: Store<RootState> }): void => {
|
||||
const plugin: Plugin = ({ app, store }) => {
|
||||
Vue.prototype.$eventHub = new Vue();
|
||||
|
||||
Vue.prototype.$base = process.env.BASE_URL;
|
||||
@ -123,9 +118,11 @@ export default ({ app, store }: { app: Vue, store: Store<RootState> }): void =>
|
||||
return decodeTime(ulid) / 1000;
|
||||
};
|
||||
|
||||
app.router.afterEach(() => {
|
||||
app.router?.afterEach(() => {
|
||||
if (typeof window !== 'undefined' && window.fusetag && window.fusetag.pageInit) {
|
||||
window.fusetag.pageInit();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export default plugin;
|
||||
|
@ -1,4 +1,6 @@
|
||||
export default (): void => {
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
|
||||
const plugin: Plugin = () => {
|
||||
if (!Object.prototype.hasOwnProperty.call(Object, 'hasOwn')) {
|
||||
Object.defineProperty(Object, 'hasOwn', {
|
||||
value: (object: object, property: PropertyKey) => {
|
||||
@ -7,3 +9,5 @@ export default (): void => {
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default plugin;
|
||||
|
@ -1,77 +0,0 @@
|
||||
import * as Sentry from '@sentry/vue';
|
||||
|
||||
function defaultHandler({ plausible, to }) {
|
||||
console.debug('[analytics] Tracking default handler: %O', to);
|
||||
plausible.trackPageview({
|
||||
url: to.toString(),
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @param {(value: URL) => URL} redactor
|
||||
* @param {(ctx) => void} base
|
||||
* @return {(ctx) => void}
|
||||
*/
|
||||
function redact(redactor, base = defaultHandler) {
|
||||
return (ctx) => base({
|
||||
...ctx,
|
||||
to: redactor(ctx.to),
|
||||
});
|
||||
}
|
||||
|
||||
const USER_AT = /^\/@.+/;
|
||||
const USER_SUBPAGE = /^\/(u|card)\/.*/;
|
||||
|
||||
const TRACKER_OVERRIDES = [
|
||||
{
|
||||
test(v) {
|
||||
return USER_AT.test(v) || USER_SUBPAGE.test(v);
|
||||
},
|
||||
handling: redact((v) => {
|
||||
let pathname = v.pathname;
|
||||
if (USER_AT.test(pathname)) {
|
||||
pathname = pathname.replace(USER_AT, '/@--redacted--');
|
||||
}
|
||||
if (USER_SUBPAGE.test(pathname)) {
|
||||
pathname = pathname.replace(USER_SUBPAGE, '/$1/--redacted--');
|
||||
}
|
||||
v.pathname = pathname;
|
||||
return v;
|
||||
}),
|
||||
},
|
||||
];
|
||||
|
||||
export const plugin = function ({ app }) {
|
||||
const plausible = app.$plausible;
|
||||
|
||||
app.router.afterEach((to, from) => {
|
||||
let handler = defaultHandler;
|
||||
for (const trackerOverride of TRACKER_OVERRIDES) {
|
||||
if (!trackerOverride.test(to.fullPath)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trackerOverride.handling === false) {
|
||||
// console.debug("[analytics] Page is blocked from tracking");
|
||||
return;
|
||||
} else if (typeof trackerOverride.handling === 'function') {
|
||||
handler = trackerOverride.handling;
|
||||
} else {
|
||||
throw new Error('Tracking override handling is invalid');
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// console.log("[analytics] Tracking pageview")
|
||||
try {
|
||||
handler({
|
||||
plausible,
|
||||
to: new URL(to.fullPath, window.location.href),
|
||||
from: new URL(from.fullPath, window.location.href),
|
||||
});
|
||||
} catch (error) {
|
||||
Sentry.captureException(error);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export default plugin;
|
32
plugins/track.ts
Normal file
32
plugins/track.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import * as Sentry from '@sentry/vue';
|
||||
import type { Plugin } from '@nuxt/types';
|
||||
|
||||
const USER_AT = /^\/@.+/;
|
||||
const USER_SUBPAGE = /^\/(u|card)\/.*/;
|
||||
|
||||
export const normalizeUrl = (page: URL): URL => {
|
||||
if (USER_AT.test(page.pathname)) {
|
||||
page.pathname = page.pathname.replace(USER_AT, '/@--redacted--');
|
||||
}
|
||||
if (USER_SUBPAGE.test(page.pathname)) {
|
||||
page.pathname = page.pathname.replace(USER_SUBPAGE, '/$1/--redacted--');
|
||||
}
|
||||
page.hash = '';
|
||||
return page;
|
||||
};
|
||||
|
||||
const plugin: Plugin = ({ app }) => {
|
||||
app.router?.afterEach((to) => {
|
||||
try {
|
||||
const url = normalizeUrl(new URL(to.fullPath, window.location.href));
|
||||
console.debug('[analytics] tracking page view:', url.toString());
|
||||
app.$plausible.trackPageview({
|
||||
url: url.toString(),
|
||||
});
|
||||
} catch (error) {
|
||||
Sentry.captureException(error);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export default plugin;
|
3
plugins/vuejs-datepicker.d.ts
vendored
Normal file
3
plugins/vuejs-datepicker.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
declare module 'vuejs-datepicker' {
|
||||
export = unknown;
|
||||
}
|
@ -209,7 +209,7 @@
|
||||
]"
|
||||
/>
|
||||
<AdminDashboardCard
|
||||
v-if="$isGranted('translations', locale) && (stats[locale].translations.missing > 0 || stats[locale].translations.awaitingApproval > 0) || $isGranted('code') && stats[locale].translations.awaitingMerge > 0"
|
||||
v-if="$isGranted('translations', locale) && (stats[locale].translations.missing > 0 || stats[locale].translations.awaitingApproval > 0) || $isGranted('code', locale) && stats[locale].translations.awaitingMerge > 0"
|
||||
v-show="!filterAttention || stats[locale].translations.missing || stats[locale].translations.awaitingApproval || stats[locale].translations.awaitingMerge"
|
||||
:base-url="url"
|
||||
icon="language"
|
||||
@ -221,7 +221,7 @@
|
||||
count: stats[locale].translations.missing,
|
||||
warning: 1,
|
||||
danger: 16,
|
||||
enabled: $isGranted('translations'),
|
||||
enabled: $isGranted('translations', locale),
|
||||
},
|
||||
{
|
||||
name: 'proposed',
|
||||
@ -229,7 +229,7 @@
|
||||
count: stats[locale].translations.awaitingApproval,
|
||||
warning: 1,
|
||||
danger: 16,
|
||||
enabled: $isGranted('translations'),
|
||||
enabled: $isGranted('translations', locale),
|
||||
},
|
||||
{
|
||||
name: 'not merged',
|
||||
@ -237,7 +237,7 @@
|
||||
count: stats[locale].translations.awaitingMerge,
|
||||
warning: 1,
|
||||
danger: 16,
|
||||
enabled: $isGranted('code'),
|
||||
enabled: $isGranted('code', locale),
|
||||
},
|
||||
]"
|
||||
/>
|
||||
|
@ -324,14 +324,21 @@
|
||||
<p class="h5">
|
||||
<T>profile.calendar.customEvents.header</T><T>quotation.colon</T>
|
||||
</p>
|
||||
<PersonalEventListInput v-model="customEvents" :maxitems="36" />
|
||||
<PersonalEventListInput v-model="customEvents" :maxitems="100" />
|
||||
</section>
|
||||
|
||||
<section class="my-5">
|
||||
<p class="h5">
|
||||
<T>profile.calendar.publicEvents.header</T><T>quotation.colon</T>
|
||||
</p>
|
||||
<PersonalCalendar :year="year" :events="events" class="my-3" remove-button @delete="(d) => events = events.filter(e => e !== d)" />
|
||||
<PersonalCalendar
|
||||
:year="year"
|
||||
:events="events"
|
||||
class="my-3"
|
||||
remove-button
|
||||
:maxitems="100"
|
||||
@delete="(d) => events = events.filter(e => e !== d)"
|
||||
/>
|
||||
<PropagateCheckbox v-if="otherProfiles > 0" field="events" :before="beforeChanges.events" :after="events" @change="propagateChanged" />
|
||||
<CalendarEventsList :year="year" add-button @add="(e) => events.push(e)" />
|
||||
</section>
|
||||
|
@ -97,6 +97,9 @@ const lastPostId = {};
|
||||
} catch {}
|
||||
|
||||
for (const publisher of process.argv[3].split(',')) {
|
||||
if (!publisher) {
|
||||
continue;
|
||||
}
|
||||
console.log(`Publishing: ${publisher}`);
|
||||
const postId = await publishers[publisher](
|
||||
message,
|
||||
|
@ -654,8 +654,8 @@ router.post('/profile/save', handleErrorAsync(async (req, res) => {
|
||||
req.body.circle.length > 16 ||
|
||||
req.body.words.filter((c) => c.values.length > 64).length > 0 ||
|
||||
req.body.sensitive.length > 16 ||
|
||||
req.body.events.length > 64 ||
|
||||
req.body.customEvents.length > 64
|
||||
req.body.events.length > 100 ||
|
||||
req.body.customEvents.length > 100
|
||||
) {
|
||||
await auditLog(req, 'profile/form_validation_failed', { ...req.body });
|
||||
return res.status(400).json({ error: 'crud.validation.genericForm' });
|
||||
|
@ -33,7 +33,7 @@ const isSpam = (email) => {
|
||||
};
|
||||
|
||||
const replaceExtension = (username) => username
|
||||
.replace(/\.(txt|jpg|jpeg|png|pdf|gif|doc|docx|csv|js|css|html)$/i, '_$1') // nuxt tries to serve those requests as files, not pages
|
||||
.replace(/\.(txt|jpg|jpeg|png|pdf|gif|bmp|doc|docx|csv|js|css|html|mp3|mp4|wav)$/i, '_$1') // nuxt tries to serve those requests as files, not pages
|
||||
.replace(/\.$/, '_') // trailing dots get ignored by autolinkers on external pages
|
||||
;
|
||||
|
||||
|
@ -99,11 +99,20 @@ const generateToC = (content, translator) => (_) => {
|
||||
const generateGallery = (_, itemsString) => {
|
||||
const items = JSON.parse(`{${itemsString.replace(/"/g, '"').replace(/,\s*$/, '')}}`);
|
||||
|
||||
const label = (alt) => {
|
||||
if (!alt.startsWith('! ')) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return `<p class="small mt-2">${alt.substring(2)}</p>`;
|
||||
};
|
||||
|
||||
const cells = Object.entries(items).map(([src, alt]) => `
|
||||
<div class="col-6 col-lg-4 columnist-column mb-3">
|
||||
<a href="${src}" target="_blank" rel="noopener">
|
||||
<img src="${src}" alt="${alt}"/>
|
||||
<img src="${src}" alt="${alt.startsWith('! ') ? alt.substring(2) : alt}"/>
|
||||
</a>
|
||||
${label(alt)}
|
||||
</div>
|
||||
`);
|
||||
|
||||
|
24
test/plugins/track.test.ts
Normal file
24
test/plugins/track.test.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { describe, expect, test } from '@jest/globals';
|
||||
|
||||
import { normalizeUrl } from '../../plugins/track.ts';
|
||||
|
||||
describe('when tracking', () => {
|
||||
const base = 'https://pronouns.page';
|
||||
|
||||
test('normal pages are tracked verbatim', () => {
|
||||
expect(normalizeUrl(new URL('/pronouns', base))).toEqual(new URL('/pronouns', base));
|
||||
});
|
||||
test.each([
|
||||
{ given: '/@example', expected: '/@--redacted--' },
|
||||
{ given: '/u/example', expected: '/u/--redacted--' },
|
||||
{ given: '/card/example', expected: '/card/--redacted--' },
|
||||
])('pages containing user name are redacted', ({ given, expected }) => {
|
||||
expect(normalizeUrl(new URL(given, base))).toEqual(new URL(expected, base));
|
||||
});
|
||||
test.each([
|
||||
{ given: '/terminology#queer', expected: '/terminology' },
|
||||
{ given: '/@example#they/them', expected: '/@--redacted--' },
|
||||
])('hashes are stripped', ({ given, expected }) => {
|
||||
expect(normalizeUrl(new URL(given, base))).toEqual(new URL(expected, base));
|
||||
});
|
||||
});
|
@ -21,7 +21,9 @@
|
||||
"@nuxt/typescript-build",
|
||||
"@nuxtjs/axios",
|
||||
"@nuxtjs/sentry",
|
||||
"@types/node"
|
||||
"@types/node",
|
||||
"cookie-universal-nuxt",
|
||||
"vue-plausible"
|
||||
]
|
||||
},
|
||||
"exclude": [
|
||||
|
158
yarn.lock
158
yarn.lock
@ -2453,51 +2453,51 @@
|
||||
cookie-parser "^1.4.5"
|
||||
csurf "^1.11.0"
|
||||
|
||||
"@sentry-internal/feedback@7.105.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.105.0.tgz#f2a25b55e5368509cfd540c21e74503568492057"
|
||||
integrity sha512-17doUQFKYgLfG7EmZXjZQ7HR/aBzuLDd+GVaCNthUPyiz/tltV7EFECDWwHpXqzQgYRgroSbY8PruMVujFGUUw==
|
||||
"@sentry-internal/feedback@7.107.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.107.0.tgz#144cf01b1c1739d61db3990519f59b49a356fef1"
|
||||
integrity sha512-okF0B9AJHrpkwNMxNs/Lffw3N5ZNbGwz4uvCfyOfnMxc7E2VfDM18QzUvTBRvNr3bA9wl+InJ+EMG3aZhyPunA==
|
||||
dependencies:
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry-internal/replay-canvas@7.105.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.105.0.tgz#fed7d67d976837ef7c1b72a6db461179703fa6f5"
|
||||
integrity sha512-XMBdkjIDhap5Gwrub5wlUJhuUVJM4aL4lZV8KcxJZZSXgXsnyGYbEh9SPZOHO05jtbxTxVeL3Pik5qtYjdGnPA==
|
||||
"@sentry-internal/replay-canvas@7.107.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.107.0.tgz#ce2a8f6bf63ab962e696f26b509cfb87aa931302"
|
||||
integrity sha512-dmDL9g3QDfo7axBOsVnpiKdJ/DXrdeuRv1AqsLgwzJKvItsv0ZizX0u+rj5b1UoxcwbXRMxJ0hit5a1yt3t/ow==
|
||||
dependencies:
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/replay" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/replay" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry-internal/tracing@7.105.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.105.0.tgz#9cb06f8281454343215cfe4b119c8198f032ec72"
|
||||
integrity sha512-b+AFYB7Bc9vmyxl2jbmuT4esX5G0oPfpz35A0sxFzmJIhvMg1YMDNio2c81BtKN+VSPORCnKMLhfk3kyKKvWMQ==
|
||||
"@sentry-internal/tracing@7.107.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.107.0.tgz#a10b4abcbc9e0d8da948e3a95029574387ca7b16"
|
||||
integrity sha512-le9wM8+OHBbq7m/8P7JUJ1UhSPIty+Z/HmRXc5Z64ODZcOwFV6TmDpYx729IXDdz36XUKmeI+BeM7yQdTTZPfQ==
|
||||
dependencies:
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry/babel-plugin-component-annotate@2.14.2":
|
||||
version "2.14.2"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.14.2.tgz#d756bed93495e97a5a2aad56e2a6dc5020305adc"
|
||||
integrity sha512-mFBVnIZmdMrpxo61rG5yf0WFt5VrRpy8cpIpJtT3mYkX9vDmcUZaZaD1ctv73iZF3QwaieVdn05Na5mWzZ8h/A==
|
||||
|
||||
"@sentry/browser@7.105.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.105.0.tgz#3eb56785cfc1cf58528b29ea954b73093e6f9481"
|
||||
integrity sha512-OlYJzsZG109T1VpZ7O7KXf9IXCUUpp41lkkQM7ICBOBsfiHRUKmV5piTGCG5UgAvyb/gI/I1uQQtO4jthcHKEA==
|
||||
"@sentry/browser@7.107.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.107.0.tgz#a1caf4a3c39857862ba3314b9d4ed03f9259f338"
|
||||
integrity sha512-KnqaQDhxv6w9dJ+mYLsNwPeGZfgbpM3vaismBNyJCKLgWn2V75kxkSq+bDX8LQT/13AyK7iFp317L6P8EuNa3g==
|
||||
dependencies:
|
||||
"@sentry-internal/feedback" "7.105.0"
|
||||
"@sentry-internal/replay-canvas" "7.105.0"
|
||||
"@sentry-internal/tracing" "7.105.0"
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/replay" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry-internal/feedback" "7.107.0"
|
||||
"@sentry-internal/replay-canvas" "7.107.0"
|
||||
"@sentry-internal/tracing" "7.107.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/replay" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry/bundler-plugin-core@2.14.2":
|
||||
version "2.14.2"
|
||||
@ -2567,65 +2567,65 @@
|
||||
"@sentry/cli-win32-i686" "2.29.1"
|
||||
"@sentry/cli-win32-x64" "2.29.1"
|
||||
|
||||
"@sentry/core@7.105.0", "@sentry/core@^7.100.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.105.0.tgz#89db519dd9aa7326de63a7eaccf861de3769ab1c"
|
||||
integrity sha512-5xsaTG6jZincTeJUmZomlv20mVRZUEF1U/g89lmrSOybyk2+opEnB1JeBn4ODwnvmSik8r2QLr6/RiYlaxRJCg==
|
||||
"@sentry/core@7.107.0", "@sentry/core@^7.100.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.107.0.tgz#926838ba2c2861d6bd2bced0232e1f9d1ead6c75"
|
||||
integrity sha512-C7ogye6+KPyBi8NVL0P8Rxx3Ur7Td8ufnjxosVy678lqY+dcYPk/HONROrzUFYW5fMKWL4/KYnwP+x9uHnkDmw==
|
||||
dependencies:
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry/integrations@^7.100.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.105.0.tgz#8953bd310d8681f9a29f918269b98640ab302abe"
|
||||
integrity sha512-AgzecTkF0o+C4svbroMGA+cW5LRnfFSoJnzF5ltUB67hnX906amlwbOvdkKD3MugYO02nRSjF/eEi26E1HACMA==
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.107.0.tgz#a46a82be885ef1482197ed7073d7982bd266c09a"
|
||||
integrity sha512-0h2sZcjcdptS2pju1KSF4+sXaRaFTlmAN1ZokFfmfnVTs6cVtIFttUFxTYrwQUEE2knpAV05pz87zg1yfPAfYg==
|
||||
dependencies:
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
localforage "^1.8.1"
|
||||
|
||||
"@sentry/node@^7.100.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.105.0.tgz#cfe8e5602dff2cc754a95412f44c9ca8156422ff"
|
||||
integrity sha512-b0QwZ7vT4hcJi6LmNRh3dcaYpLtXnkYXkL0rfhMb8hN8sUx8zuOWFMI7j0cfAloVThUeJVwGyv9dERfzGS2r2w==
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.107.0.tgz#d60c2e28953f2ba14d12ada9190f1fc577b2b280"
|
||||
integrity sha512-UZXkG7uThT2YyPW8AOSKRXp1LbVcBHufa4r1XAwBukA2FKO6HHJPjMUgY6DYVQ6k+BmA56CNfVjYrdLbyjBYYA==
|
||||
dependencies:
|
||||
"@sentry-internal/tracing" "7.105.0"
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry-internal/tracing" "7.107.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry/replay@7.105.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.105.0.tgz#61784e3e88afa66a0d9b1b9d222153ab54ea4bd0"
|
||||
integrity sha512-hZD2m6fNL9gorUOaaEpqxeH7zNP4y2Ej0TdieM1HMQ2q9Zrm9yOzk9/7ALfbRLIZFRMFTqo9vvVztLs3E+Hx+g==
|
||||
"@sentry/replay@7.107.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.107.0.tgz#d714f864ef8602e6d009b2fa8ff8e4ef63c3e9e4"
|
||||
integrity sha512-BNJDEVaEwr/YnV22qnyVA1almx/3p615m3+KaF8lPo7YleYgJGSJv1auH64j1G8INkrJ0J0wFBujb1EFjMYkxA==
|
||||
dependencies:
|
||||
"@sentry-internal/tracing" "7.105.0"
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry-internal/tracing" "7.107.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry/types@7.105.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.105.0.tgz#51dadb7ad650e883459acf18df2ecbb5b4b6e5c2"
|
||||
integrity sha512-80o0KMVM+X2Ym9hoQxvJetkJJwkpCg7o6tHHFXI+Rp7fawc2iCMTa0IRQMUiSkFvntQLYIdDoNNuKdzz2PbQGA==
|
||||
"@sentry/types@7.107.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.107.0.tgz#5ba4b472be6ccad9aecd58dbc0141a09dafb68c1"
|
||||
integrity sha512-H7qcPjPSUWHE/Zf5bR1EE24G0pGVuJgrSx8Tvvl5nKEepswMYlbXHRVSDN0gTk/E5Z7cqf+hUBOpkQgZyps77w==
|
||||
|
||||
"@sentry/utils@7.105.0", "@sentry/utils@^7.100.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.105.0.tgz#727187d252b97cb9e6c78bcdd0e9a1d14e60f313"
|
||||
integrity sha512-YVAV0c2KLM8+VZCicQ/E/P2+J9Vs0hGhrXwV7w6ZEAtvxrg4oF270toL1WRhvcaf8JO4J1v4V+LuU6Txs4uEeQ==
|
||||
"@sentry/utils@7.107.0", "@sentry/utils@^7.100.0":
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.107.0.tgz#b8524539d052a40f9c5f34a8347501f0f81a0751"
|
||||
integrity sha512-C6PbN5gHh73MRHohnReeQ60N8rrLYa9LciHue3Ru2290eSThg4CzsPnx4SzkGpkSeVlhhptKtKZ+hp/ha3iVuw==
|
||||
dependencies:
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
|
||||
"@sentry/vue@^7.100.0":
|
||||
version "7.105.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/vue/-/vue-7.105.0.tgz#37655b96db8acb65309d8462d8c3d26cf000932d"
|
||||
integrity sha512-QWUWAwCFruw75aqsExHKZ9HWtFyFRo4+8UsCiXUWeMpcpQu+mZ4VzHbTxNBZKmSTA0jYa/tTpYXkfI5ozM+y4A==
|
||||
version "7.107.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/vue/-/vue-7.107.0.tgz#40cb1589f18338ce1effda89794d567d1f40ee48"
|
||||
integrity sha512-nUUaa5s2W7UmgjavoksoBlduc6mePZmo4k3y5lXPhSvZ92FcidLZItRUkwubaUBHgu8zvRxkTeXGhbqfWN4Ukg==
|
||||
dependencies:
|
||||
"@sentry/browser" "7.105.0"
|
||||
"@sentry/core" "7.105.0"
|
||||
"@sentry/types" "7.105.0"
|
||||
"@sentry/utils" "7.105.0"
|
||||
"@sentry/browser" "7.107.0"
|
||||
"@sentry/core" "7.107.0"
|
||||
"@sentry/types" "7.107.0"
|
||||
"@sentry/utils" "7.107.0"
|
||||
|
||||
"@sentry/webpack-plugin@^2.14.2":
|
||||
version "2.14.2"
|
||||
@ -14311,9 +14311,9 @@ ufo@^1.3.1:
|
||||
integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==
|
||||
|
||||
ufo@^1.3.2:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.4.0.tgz#39845b31be81b4f319ab1d99fd20c56cac528d32"
|
||||
integrity sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.1.tgz#ec42543a918def8d0ce185e498d080016f35daf6"
|
||||
integrity sha512-HGyF79+/qZ4soRvM+nHERR2pJ3VXDZ/8sL1uLahdgEDf580NkgiWOxLk33FetExqOWp352JZRsgXbG/4MaGOSg==
|
||||
|
||||
uglify-js@^3.5.1:
|
||||
version "3.17.4"
|
||||
|
Loading…
x
Reference in New Issue
Block a user