Compare commits

...

2 Commits

Author SHA1 Message Date
Niels Kaspers 66b5185e33 fix: add terms_of_service translation key to all locales 2026-04-04 10:31:46 +03:00
Niels Kaspers 319523131f fix: add TERMS_URL support to survey link footers
The TERMS_URL environment variable was documented in docker-compose.yml
and defined in constants but never threaded through the survey link
footer components. This adds TERMS_URL prop passing through
survey-renderer, pin-screen, survey-client-wrapper, link-survey-wrapper,
and legal-footer, matching the existing pattern used by PRIVACY_URL and
IMPRINT_URL.
2026-04-04 10:26:46 +03:00
19 changed files with 36 additions and 2 deletions
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Teamname",
"team_role": "Team-Rolle",
"teams": "Teams",
"terms_of_service": "Nutzungsbedingungen",
"text": "Text",
"time": "Zeit",
"time_to_finish": "Zeit zum Fertigstellen",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Team name",
"team_role": "Team role",
"teams": "Teams",
"terms_of_service": "Terms of Service",
"text": "Text",
"time": "Time",
"time_to_finish": "Time to finish",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Nombre del equipo",
"team_role": "Rol del equipo",
"teams": "Equipos",
"terms_of_service": "Términos de servicio",
"text": "Texto",
"time": "Hora",
"time_to_finish": "Tiempo para finalizar",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Nom de l'équipe",
"team_role": "Rôle dans l'équipe",
"teams": "Équipes",
"terms_of_service": "Conditions d'utilisation",
"text": "Texte",
"time": "Temps",
"time_to_finish": "Temps de finir",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Csapat neve",
"team_role": "Csapatszerep",
"teams": "Csapatok",
"terms_of_service": "Felhasználási feltételek",
"text": "Szöveg",
"time": "Idő",
"time_to_finish": "Idő a befejezésig",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "チーム名",
"team_role": "チームの役割",
"teams": "チーム",
"terms_of_service": "利用規約",
"text": "テキスト",
"time": "時間",
"time_to_finish": "所要時間",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Teamnaam",
"team_role": "Teamrol",
"teams": "Teams",
"terms_of_service": "Gebruiksvoorwaarden",
"text": "Tekst",
"time": "Tijd",
"time_to_finish": "Tijd om af te ronden",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Nome da equipe",
"team_role": "Função na equipe",
"teams": "Equipes",
"terms_of_service": "Termos de Serviço",
"text": "Texto",
"time": "tempo",
"time_to_finish": "Hora de terminar",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Nome da equipa",
"team_role": "Função na equipa",
"teams": "Equipas",
"terms_of_service": "Termos de Serviço",
"text": "Texto",
"time": "Tempo",
"time_to_finish": "Tempo para concluir",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Nume echipă",
"team_role": "Rol în echipă",
"teams": "Echipe",
"terms_of_service": "Termeni și condiții",
"text": "Text",
"time": "Timp",
"time_to_finish": "Timp până la finalizare",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Название команды",
"team_role": "Роль в команде",
"teams": "Команды",
"terms_of_service": "Условия использования",
"text": "Текст",
"time": "Время",
"time_to_finish": "Время до завершения",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "Teamnamn",
"team_role": "Teamroll",
"teams": "Åtkomstkontroll",
"terms_of_service": "Användarvillkor",
"text": "Text",
"time": "Tid",
"time_to_finish": "Tid att slutföra",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "团队 名称",
"team_role": "团队角色",
"teams": "团队",
"terms_of_service": "服务条款",
"text": "文本",
"time": "时间",
"time_to_finish": "完成 时间",
+1
View File
@@ -433,6 +433,7 @@
"team_name": "團隊名稱",
"team_role": "團隊角色",
"teams": "團隊",
"terms_of_service": "服務條款",
"text": "文字",
"time": "時間",
"time_to_finish": "完成時間",
@@ -6,6 +6,7 @@ import { useTranslation } from "react-i18next";
interface LegalFooterProps {
IMPRINT_URL?: string;
PRIVACY_URL?: string;
TERMS_URL?: string;
IS_FORMBRICKS_CLOUD: boolean;
surveyUrl: string;
}
@@ -13,11 +14,12 @@ interface LegalFooterProps {
export const LegalFooter = ({
IMPRINT_URL,
PRIVACY_URL,
TERMS_URL,
IS_FORMBRICKS_CLOUD,
surveyUrl,
}: LegalFooterProps) => {
const { t } = useTranslation();
if (!IMPRINT_URL && !PRIVACY_URL && !IS_FORMBRICKS_CLOUD) return null;
if (!IMPRINT_URL && !PRIVACY_URL && !TERMS_URL && !IS_FORMBRICKS_CLOUD) return null;
return (
<div className="absolute bottom-0 z-[1500] h-10 w-full" role="contentinfo">
@@ -33,7 +35,13 @@ export const LegalFooter = ({
{t("common.privacy")}
</Link>
)}
{PRIVACY_URL && IS_FORMBRICKS_CLOUD && <span className="px-2">|</span>}
{(IMPRINT_URL || PRIVACY_URL) && TERMS_URL && <span className="px-2">|</span>}
{TERMS_URL && (
<Link href={TERMS_URL} target="_blank" className="hover:underline" tabIndex={-1}>
{t("common.terms_of_service")}
</Link>
)}
{(IMPRINT_URL || PRIVACY_URL || TERMS_URL) && IS_FORMBRICKS_CLOUD && <span className="px-2">|</span>}
{IS_FORMBRICKS_CLOUD && (
<Link
href={`https://app.formbricks.com/s/clxbivtla014iye2vfrn436xd?surveyUrl=${surveyUrl}`}
@@ -22,6 +22,7 @@ interface LinkSurveyWrapperProps {
handleResetSurvey: () => void;
IMPRINT_URL?: string;
PRIVACY_URL?: string;
TERMS_URL?: string;
IS_FORMBRICKS_CLOUD: boolean;
publicDomain: string;
isBrandingEnabled: boolean;
@@ -40,6 +41,7 @@ export const LinkSurveyWrapper = ({
handleResetSurvey,
IMPRINT_URL,
PRIVACY_URL,
TERMS_URL,
IS_FORMBRICKS_CLOUD,
publicDomain,
isBrandingEnabled,
@@ -101,6 +103,7 @@ export const LinkSurveyWrapper = ({
<LegalFooter
IMPRINT_URL={IMPRINT_URL}
PRIVACY_URL={PRIVACY_URL}
TERMS_URL={TERMS_URL}
IS_FORMBRICKS_CLOUD={IS_FORMBRICKS_CLOUD}
surveyUrl={publicDomain + "/s/" + surveyId}
/>
@@ -19,6 +19,7 @@ interface PinScreenProps {
publicDomain: string;
IMPRINT_URL?: string;
PRIVACY_URL?: string;
TERMS_URL?: string;
IS_FORMBRICKS_CLOUD: boolean;
verifiedEmail?: string;
languageCode: string;
@@ -40,6 +41,7 @@ export const PinScreen = (props: PinScreenProps) => {
singleUseResponse,
IMPRINT_URL,
PRIVACY_URL,
TERMS_URL,
IS_FORMBRICKS_CLOUD,
verifiedEmail,
languageCode,
@@ -134,6 +136,7 @@ export const PinScreen = (props: PinScreenProps) => {
verifiedEmail={verifiedEmail}
IMPRINT_URL={IMPRINT_URL}
PRIVACY_URL={PRIVACY_URL}
TERMS_URL={TERMS_URL}
IS_FORMBRICKS_CLOUD={IS_FORMBRICKS_CLOUD}
/>
);
@@ -30,6 +30,7 @@ interface SurveyClientWrapperProps {
verifiedEmail?: string;
IMPRINT_URL?: string;
PRIVACY_URL?: string;
TERMS_URL?: string;
IS_FORMBRICKS_CLOUD: boolean;
}
@@ -53,6 +54,7 @@ export const SurveyClientWrapper = ({
verifiedEmail,
IMPRINT_URL,
PRIVACY_URL,
TERMS_URL,
IS_FORMBRICKS_CLOUD,
}: SurveyClientWrapperProps) => {
const searchParams = useSearchParams();
@@ -146,6 +148,7 @@ export const SurveyClientWrapper = ({
IS_FORMBRICKS_CLOUD={IS_FORMBRICKS_CLOUD}
IMPRINT_URL={IMPRINT_URL}
PRIVACY_URL={PRIVACY_URL}
TERMS_URL={TERMS_URL}
isBrandingEnabled={project.linkSurveyBranding}
dir={logoDir}>
<SurveyInline
@@ -9,6 +9,7 @@ import {
IS_RECAPTCHA_CONFIGURED,
PRIVACY_URL,
RECAPTCHA_SITE_KEY,
TERMS_URL,
} from "@/lib/constants";
import { getPublicDomain } from "@/lib/getPublicUrl";
import { PinScreen } from "@/modules/survey/link/components/pin-screen";
@@ -141,6 +142,7 @@ export const renderSurvey = async ({
singleUseResponse={singleUseResponse}
IMPRINT_URL={IMPRINT_URL}
PRIVACY_URL={PRIVACY_URL}
TERMS_URL={TERMS_URL}
IS_FORMBRICKS_CLOUD={IS_FORMBRICKS_CLOUD}
verifiedEmail={verifiedEmail}
languageCode={languageCode}
@@ -173,6 +175,7 @@ export const renderSurvey = async ({
verifiedEmail={verifiedEmail}
IMPRINT_URL={IMPRINT_URL}
PRIVACY_URL={PRIVACY_URL}
TERMS_URL={TERMS_URL}
IS_FORMBRICKS_CLOUD={IS_FORMBRICKS_CLOUD}
/>
);