Files
sharper.ly/apps/web/app/routes/_page-kit/copy.ts
T
IllusionandClaude Opus 5 2e920a96e7 Land the third design drop, seed the CMS, and retire the figures band
Three pieces of one session's work. They are in one commit because home.tsx
and _page-kit/copy.ts carry hunks from all three and splitting them by hand
would have meant committing intermediate states of those two files that were
never built or served.

THE THIRD DESIGN DROP

Only Home.dc.html and SiteFooter.dc.html differ from the second drop; the
other nine page drafts are byte-identical to what already ships.

The home page stops opening on a launch announcement dated to one day in
June. New headline, lead and primary call to action ("See open calls"), and
the launch band becomes "A nationwide project, delivered locally" -
launchEyebrow/Heading/Lead renamed approach*, LaunchShots renamed
GalleryShots, since the band is no longer about an event. Its Arabic reuses
the About page's already-approved wording for the coverage line and the body
heading; the new lead and headline are ar-draft like the rest of the Arabic
home copy and still want client sign-off.

Five motion classes in _page-kit/motion.css, tokens only, each with its RTL
form where the property has no logical one: sh-wipe (the headline uncovered
from the inline start), sh-pan (the hero picture on a view timeline), sh-zoom
(a picture closing in inside its frame), sh-rule-top (an accent rule drawn
across a hovered tile) and sh-marquee (the logo wall). sh-wipe fills
`backwards`, not `both`, so the clip is gone at rest - inset(0) would shave a
descender or an Arabic mark off a tight heading line - and it is removed
outright under prefers-reduced-motion, because a clip does not fade a
headline, it hides it.

The marquee carries each logo twice and slides exactly half the track, so its
spacing is a margin on the tile rather than a gap on the row: with a row gap
the seam lands half a gap short. The second half is aria-hidden with no link,
so the wall is neither read out nor tabbed through twice; it pauses on hover
and focus (WCAG 2.2.2) and unwraps to a plain row under reduced motion. Below
eight partners the wall stays a grid, because a half-track narrower than its
frame drifts a short row across empty space instead of looping.

SEEDING THE CMS

`pnpm seed` writes content through the document service. It opens no port, so
it runs happily beside `pnpm dev:cms`, and every write is matched on a slug
and written over the same document, so a second run changes nothing but the
fields the seed owns.

src/seed/approved.ts is transcribed from docs/ in both languages and is safe
to publish: site settings, the three consortium members, the topic taxonomy,
the five activity streams with their implementing partners, the launch
article in full, and the four pages. What docs/ withholds is not written -
no statistics, no project email, no Facebook URL, no consortium addresses,
all of which the source writes as bracketed placeholders. Two fields are
judgement calls and say so at the line: activityStatus, which the schema
requires and the source never states, and the launch article's year, which is
derived - the source says "Tuesday, June 30" and within December 2025 to
December 2027 that is 2026 and no other year.

src/seed/demo.ts is invented and kept apart three ways: opt-in behind --demo,
refused outright when NODE_ENV=production, and tagged in the data itself with
a demo- slug prefix that shows in every URL and is how --demo --clean finds
them again, with nothing remembered between runs.

Two things the Strapi 5 document service does not do by itself, both of which
leave Arabic rows behind that the next run then collides with on the unique
slug: delete({ documentId }) with no locale removes the DEFAULT locale only,
not the document, and findMany({ locale }) answers for one locale, so a
document whose English half has gone is invisible to a search in English. The
first --clean left six Arabic orphans and failed the next run partway.
deleteMatching now pools documentIds across both locales and deletes with
locale: '*'.

Knex aborts its pending pool acquisitions on teardown, and each abort rejects
a promise nothing awaits, so it arrives as an unhandled rejection rather than
as an error a try/catch would see. scripts/seed.js absorbs exactly that, for
the length of the shutdown only: a seed that worked must not report itself as
a seed that failed.

THE FIGURES BAND, AND THE BAND THAT REPLACED IT

The third draft deletes the figures band, so shared.stat and blocks.stats-grid
are deleted with it, home-page.stats is dropped, and blocks.stats-grid comes
out of all six dynamic zones. On the web side that takes CmsStat, StatsRow,
CountUpValue, StatStrip and Card.Stat - the last two were already dead, but
they existed only to draw figures. No approved document carries a number, so
there is now nowhere for one to be typed in, which is the point.

The "nationwide project, delivered locally" band was half editable and half
not: its pictures came from an image-gallery block down the Blocks dynamic
zone, and its words came from bundled fallback copy with no CMS field at all.
The new page.band-intro component (eyebrow, heading, lead, images) on
home-page.approach puts the whole band in one place in the admin. The page
still falls back to the bundled copy when the fields are empty, and still
reads an image-gallery block after the component's own images, so a gallery
built in Blocks keeps rendering.

VERIFIED

pnpm typecheck and both builds pass. Both rule greps are clean: no raw hex or
tier-1 token in components/ or routes/, no physical-direction utility in
apps/web/app.

Against a seeded CMS on the built server: / redirects 302 with
Vary: Accept-Language, and all ten sections plus the detail routes return 200
in both locales with lang/dir correct in the first bytes. The home page draws
the marquee from twelve partners, the hero pan, the three hovered card rules
and the status pill, and carries no figures band.

The seed is idempotent - two identical --demo runs give identical counts,
balanced across locales - and a clean/re-seed cycle leaves nothing behind.
The approach band was proved editable end to end: heading, eyebrow, lead and
images changed through the CMS all came through on /en while /ar stayed on
its own Arabic, then the seeded copy was restored.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 14:16:53 +02:00

564 lines
27 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
PAGE COPY - EN / AR
----------------------------------------------------------------------------
SOURCE
Home page The Claude Design draft "Home page redesign with news
and FAQs" (third drop) is the source of truth. Its
headline, lead, primary call to action and the
"nationwide project, delivered locally" band are
transcribed from that draft, NOT from docs/SHARPER Home
Page .docx - the design condenses the draft, and the
draft itself is headed "Placeholder text for design
purposes - not final copy". Every claim in it is
nonetheless in docs/: the consortium, the partner
groups it works with, the EU funding and the December
2027 end date.
Everything else docs/SHARPER_Website_Draft_Section_EN_AR.docx
(sections 1, 2 and 9), which carries both columns, so
no string below is a machine translation of the other
except where a comment says so.
TRANSLATION STATUS
The Figma file has NO Arabic home frame - only the navigation and the
footer are drawn in Arabic - so the Arabic home strings marked (ar-draft)
are rebuilt from the approved Arabic column of the docx to carry the
English Figma meaning. They are NOT client-approved wording and should be
signed off before launch.
WHY IT LIVES IN THE CODE
This is page prose, not UI chrome, so it does not belong in the i18n
catalogue (which holds labels only). It is the FALLBACK: every field is
overridden by the matching Strapi field the moment an editor fills it in,
and the pages read `cms ?? draft`.
WHAT IS DELIBERATELY ABSENT
Figures. The draft marks every number "TBD" and says they must not be
published until confirmed, so there is no statistic anywhere in this file.
Figma hides the home page's figures band outright (frame 253:4835 is
hidden="true") and the third design drop deletes it, so the band is gone
from the page and the `stats` component is gone from the CMS. There is
nowhere left for a figure to be typed in, which is the point.
========================================================================= */
import type { Locale } from "~/i18n";
/** A title plus its description - a pillar, a workstream, a principle. */
export interface TitledCopy {
readonly title: string;
readonly description: string;
}
/**
* One consortium member, split the way the redesign draws it: a role chip, the
* member's name, then what it delivers. Both halves are the approved draft's
* own wording - section 1 writes each member as
* "<name> - <role> - <deliverable>".
*/
export interface ConsortiumCopy {
readonly name: string;
readonly role: string;
readonly description: string;
}
/**
* A run of prose that may carry emphasis. Figma sets four phrases of the launch
* lead in Bold on a lighter base run (349:8838), which a flat string cannot
* express - a plain string is the base weight, `{ em }` is the bold run.
*/
export type ProseRun = string | { readonly em: string };
export interface HomeCopy {
readonly heroHeadline: string;
readonly heroLead: string;
readonly heroCtaPrimary: string;
readonly heroCtaSecondary: string;
/**
* The band under the hero picture: what the project is and who delivers it.
* It replaces the launch-event band of the previous drop, which had dated
* the whole home page to a single day in June.
*/
readonly approachEyebrow: string;
readonly approachHeading: string;
readonly approachLead: string;
readonly workHeading: string;
readonly workLinkLabel: string;
readonly newsEyebrow: string;
readonly newsHeading: string;
readonly newsEmpty: string;
readonly faqEyebrow: string;
readonly faqHeading: string;
readonly faqLead: string;
readonly faqEmpty: string;
readonly faqCtaLabel: string;
readonly consortiumHeading: string;
/**
* The same three members the About page lists, split the way the redesign
* draws them: a role chip, the name, then what they deliver.
*/
readonly consortium: readonly {
readonly role: string;
readonly name: string;
readonly description: string;
}[];
readonly networkLabel: string;
readonly partnersEmpty: string;
}
export interface AboutCopy {
/** Draft eyebrow over the hero headline - "About the project". */
readonly heroEyebrow: string;
readonly heroHeadline: string;
readonly lead: string;
/**
* The four-cell band under the hero. These are project FACTS, not figures:
* the run, the coverage, the lead partner and the funder, each one written
* out in the approved draft's first section. Nothing here is counted or
* estimated - the draft marks every statistic "TBD", so none is published.
*/
readonly facts: readonly { readonly label: string; readonly value: string }[];
readonly bodyHeading: string;
/**
* The approved body prose, one entry per paragraph. The draft sets it as two
* paragraphs beside the focus-area column, which a single string cannot
* express.
*/
readonly body: readonly string[];
readonly consortiumHeading: string;
readonly consortium: readonly ConsortiumCopy[];
readonly pillarsHeading: string;
readonly pillars: readonly TitledCopy[];
readonly legacyEyebrow: string;
readonly legacyHeading: string;
readonly legacyBody: string;
readonly legacyLinkLabel: string;
}
export interface WhatWeDoCopy {
readonly heroHeadline: string;
readonly lead: string;
/**
* The draft's own heading over the areas grid. It restates the approved
* "SHARP-ER is organised around four connected areas of work" line, which is
* why the draft prints no separate intro paragraph under it and neither does
* the page.
*/
readonly workstreamsHeading: string;
readonly workstreams: readonly TitledCopy[];
readonly valuesLabel: string;
readonly values: readonly string[];
/** Not drawn - it names the principles block for the document outline. */
readonly principlesHeading: string;
/**
* The redesign draws the four principles as tiles. These are the four
* clauses of the approved "Our approach rests on four principles…" sentence
* and nothing else: the draft gives each tile an explanatory line, none of
* which is in any approved document, so the tiles carry the clause alone.
*/
readonly principleTitles: readonly string[];
readonly activitiesCtaHeading: string;
}
export interface ContactCopy {
readonly heroHeadline: string;
readonly lead: string;
/** Not drawn - it names the form for the document outline. */
readonly formHeading: string;
/** Not drawn - it names the channels column for the document outline. */
readonly detailsHeading: string;
readonly generalEnquiries: string;
readonly websiteLabel: string;
readonly websiteHref: string;
readonly websiteText: string;
readonly contactPending: string;
readonly consortiumHeading: string;
readonly consortiumEmpty: string;
readonly sendAnother: string;
readonly errorSummaryTitle: string;
readonly errorTooLong: string;
readonly honeypotLabel: string;
readonly organisationHint: string;
/** Link text for the project's Facebook page. */
readonly facebookLabel: string;
}
export interface PageCopy {
readonly home: HomeCopy;
readonly about: AboutCopy;
readonly whatWeDo: WhatWeDoCopy;
readonly contact: ContactCopy;
}
/* ---------------------------------------------------------------------------
ENGLISH
------------------------------------------------------------------------ */
const EN: PageCopy = {
home: {
heroHeadline: "Advancing Justice and Accountability, Led by Libyan Communities",
heroLead:
"SHARP-ER — Shared Action on Rule of Law Progress, Exit Route — works with civil society organisations, municipalities, and community leaders across Libya to strengthen access to justice, accountability, and local governance. Funded by the European Union, running to December 2027.",
heroCtaPrimary: "See open calls",
heroCtaSecondary: "About the project",
approachEyebrow: "Nationwide, Libya",
/* The same sentence the About page heads its body with - one project, one
description of it. */
approachHeading: "A nationwide project, delivered locally",
approachLead:
"Local organisations lead the design and delivery of the work. SHARP-ER partners with Libyan civil society, municipalities, and community leaders — through funded sub-projects, training, and open dialogue between communities and the institutions that serve them.",
workHeading: "Three areas of change",
workLinkLabel: "What we do",
newsEyebrow: "Newsroom",
newsHeading: "News and Updates",
newsEmpty: "News and updates will appear here as they are published.",
faqEyebrow: "Frequently asked",
faqHeading: "Questions about the project",
/* The draft also promises a reply "within five working days". That
commitment is in no approved document, so it is not published here. */
faqLead: "Eligibility, timelines and how to take part.",
faqEmpty: "Answers to common questions will be published here.",
faqCtaLabel: "More in the Knowledge Hub",
consortiumHeading: "The consortium",
consortium: [
{
role: "Lead implementing partner",
name: "Acted",
description:
"Overall project management and civil society sub-projects.",
},
{
role: "Consortium partner",
name: "United Efforts Consultancy (UEC)",
description: "Network strengthening, dialogue, and peer-learning.",
},
{
role: "Consortium partner",
name: "Stichting Bureau Ensemble (SBE)",
description: "Research, perception data, and knowledge publications.",
},
],
networkLabel: "Civil society network partners",
partnersEmpty:
"Partner organisations will be listed here as they join the SHARP-ER network.",
},
about: {
heroEyebrow: "About the project",
heroHeadline: "Strengthening the Rule of Law, Together",
lead: "SHARP-ER (Shared Action on Rule of Law Progress – Exit Route) is a nationwide initiative supporting Libya’s civil society, local institutions, and communities in advancing justice, accountability, and good governance.",
facts: [
{ label: "Duration", value: "December 2025 – December 2027" },
{ label: "Coverage", value: "Nationwide, Libya" },
{ label: "Lead partner", value: "Acted" },
{ label: "Funded by", value: "The European Union" },
],
bodyHeading: "A nationwide project, delivered locally",
body: [
"Running from December 2025 to December 2027, SHARP-ER is implemented by Acted, in consortium with United Efforts Consultancy (UEC) and Stichting Bureau Ensemble (SBE), and funded by the European Union.",
"The project works nationwide across Libya, partnering with civil society organisations, municipalities, and community leaders to strengthen access to justice, build the capacity of civil society to hold institutions accountable, and improve local governance and service delivery.",
],
consortiumHeading: "The consortium",
consortium: [
{
name: "Acted",
role: "Lead implementing partner",
description:
"Overall project management and civil society sub-projects.",
},
{
name: "United Efforts Consultancy (UEC)",
role: "Consortium partner",
description: "Network strengthening, dialogue, and peer-learning.",
},
{
name: "Stichting Bureau Ensemble (SBE)",
role: "Consortium partner",
description: "Research, perception data, and knowledge publications.",
},
],
pillarsHeading: "Where we focus",
pillars: [
{
title: "Strengthening Rule of Law",
description:
"Supporting local institutions to improve access to justice and transparency",
},
{
title: "Empowering Civil Society",
description:
"Building the capacity of CSOs to strengthen their role in oversight and accountability",
},
{
title: "Supporting Local Governance",
description:
"Enhancing collaboration between municipalities and local actors to improve service delivery",
},
],
legacyEyebrow: "Building on SHARP",
legacyHeading: "Carrying the SHARP I and II network into a new phase",
legacyBody:
"SHARP-ER builds on the foundation of SHARP I and II (2019–2024), carrying its network of civil society partners and its dialogue practice into a new phase focused on sustainability and exit.",
legacyLinkLabel: "Read about the SHARP legacy",
},
whatWeDo: {
heroHeadline: "A Participatory Approach to Justice and Governance",
lead: "We work directly with civil society, municipalities, and communities — not around them.",
workstreamsHeading: "Four connected areas of work",
workstreams: [
{
title: "Capacity Building",
description:
"Training civil society organisations and local actors on governance, justice, and management, and equipping the SHARP network with peer-to-peer learning.",
},
{
title: "Institutional Support",
description:
"Strengthening the systems, procedures, and dialogue channels that connect local institutions with the people they serve.",
},
{
title: "Community Initiatives",
description:
"Funding and supporting CSO-led sub-projects, Policy-to-Rights (P2R) projects, and human-security initiatives designed and driven by local actors.",
},
{
title: "Dialogue and Coordination",
description:
"Running SUQ (Search, Understand, Question) dialogues and Civil Society Law Sessions that bring civic and government actors to the same table.",
},
],
valuesLabel: "What guides us",
values: [
"Dialogue",
"Community Leadership",
"Learning",
"Inclusion",
"Responsibility & Accountability",
],
principlesHeading: "How we work",
principleTitles: [
"Working with local actors",
"Sustainable, not one-off, solutions",
"Connecting civil society with institutions",
"Gradual, realistic institutional reform",
],
activitiesCtaHeading:
"See how this work is taking shape across the network",
},
contact: {
facebookLabel: "Follow us on Facebook",
heroHeadline: "Get in Touch",
lead: "Questions about SHARP-ER, a partnership, or a specific activity? Reach out.",
formHeading: "Send us a message",
detailsHeading: "Contact details",
generalEnquiries: "General enquiries",
websiteLabel: "Website",
websiteHref: "https://sharper.ly",
websiteText: "sharper.ly",
contactPending:
"The project’s general enquiries address will be published here once it is confirmed. In the meantime, use the form and your message will reach the team.",
consortiumHeading: "Consortium contacts",
consortiumEmpty:
"Contact details for Acted Libya, United Efforts Consultancy and Stichting Bureau Ensemble will be published here once they are confirmed.",
sendAnother: "Send another message",
errorSummaryTitle: "Please check the form",
errorTooLong: "This answer is too long.",
honeypotLabel: "Leave this field empty",
organisationHint: "The organisation you are writing on behalf of, if any.",
},
};
/* ---------------------------------------------------------------------------
ARABIC (MSA)
The prose below is the Arabic column of the same two documents, verbatim.
The few strings the documents do not provide - section headings such as
"شركاؤنا", and the three launch captions, which exist only in the English
Figma frame - are translated from the approved English and stay inside the
vocabulary the Arabic draft already uses.
------------------------------------------------------------------------ */
const AR: PageCopy = {
home: {
heroHeadline: "تعزيز العدالة والمساءلة بقيادة المجتمعات الليبية",
heroLead:
"يعمل SHARP-ER — العمل المشترك لتعزيز سيادة القانون، مسار الخروج — مع منظمات المجتمع المدني والبلديات وقادة المجتمعات في مختلف أنحاء ليبيا على تعزيز الوصول إلى العدالة والمساءلة والحوكمة المحلية. بتمويل من الاتحاد الأوروبي، ويستمر حتى ديسمبر 2027.",
heroCtaPrimary: "اطّلع على الدعوات المفتوحة",
heroCtaSecondary: "عن المشروع",
/* The same two lines the About page uses for its coverage fact and its
body heading, so the Arabic reads identically on both pages. */
approachEyebrow: "على مستوى ليبيا بأكملها",
approachHeading: "مشروع وطني يُنفَّذ محليًا",
approachLead:
"تتولّى المنظمات المحلية تصميم العمل وتنفيذه. ويعمل SHARP-ER بالشراكة مع المجتمع المدني الليبي والبلديات وقادة المجتمعات، من خلال المشاريع الفرعية المموَّلة، والتدريب، والحوار المفتوح بين المجتمعات والمؤسسات التي تخدمها.",
workHeading: "ثلاثة مجالات للتغيير",
workLinkLabel: "ماذا نفعل",
newsEyebrow: "غرفة الأخبار",
newsHeading: "الأخبار والمستجدات",
newsEmpty: "ستظهر الأخبار والمستجدات هنا فور نشرها.",
faqEyebrow: "الأسئلة الشائعة",
faqHeading: "أسئلة حول المشروع",
faqLead: "شروط الأهلية والجداول الزمنية وكيفية المشاركة.",
faqEmpty: "ستُنشر إجابات الأسئلة الشائعة هنا قريبًا.",
faqCtaLabel: "المزيد في مركز المعرفة",
consortiumHeading: "الائتلاف المنفّذ",
consortium: [
{
role: "الشريك المنفّذ الرئيسي",
name: "Acted",
description: "الإدارة العامة للمشروع والمشاريع الفرعية لمنظمات المجتمع المدني.",
},
{
role: "شريك في الائتلاف",
name: "United Efforts Consultancy (UEC)",
description: "تعزيز الشبكة، والحوار، والتعلّم بين الأقران.",
},
{
role: "شريك في الائتلاف",
name: "Stichting Bureau Ensemble (SBE)",
description: "البحث، وبيانات الاستطلاع، والمنشورات المعرفية.",
},
],
networkLabel: "شركاء شبكة المجتمع المدني",
partnersEmpty:
"ستُدرج المنظمات الشريكة هنا فور انضمامها إلى شبكة SHARP-ER.",
},
about: {
heroEyebrow: "عن المشروع",
heroHeadline: "نحو تعزيز سيادة القانون، معًا",
lead: "SHARP-ER (العمل المشترك لتعزيز سيادة القانون – مسار الخروج) هو مبادرة وطنية تدعم المجتمع المدني والمؤسسات المحلية والمجتمعات الليبية في تعزيز العدالة والمساءلة والحوكمة الرشيدة.",
/* Western digits, as the Arabic column of the approved draft writes its
own dates ("ديسمبر 2025", "(2019–2024)"). */
facts: [
{ label: "مدة المشروع", value: "ديسمبر 2025 – ديسمبر 2027" },
{ label: "نطاق العمل", value: "على مستوى ليبيا بأكملها" },
{ label: "الشريك المنفّذ الرئيسي", value: "Acted" },
{ label: "بتمويل من", value: "الاتحاد الأوروبي" },
],
bodyHeading: "مشروع وطني يُنفَّذ محليًا",
body: [
"يمتد المشروع من ديسمبر 2025 إلى ديسمبر 2027، ويُنفَّذ من قِبل منظمة Acted بالشراكة مع United Efforts Consultancy (UEC) وStichting Bureau Ensemble (SBE)، وبتمويل من الاتحاد الأوروبي.",
"يعمل المشروع على مستوى ليبيا بأكملها، بالتعاون مع منظمات المجتمع المدني والبلديات والقيادات المجتمعية، من أجل تحسين الوصول إلى العدالة، وبناء قدرات المجتمع المدني على مساءلة المؤسسات، وتحسين الحوكمة المحلية وتقديم الخدمات.",
],
consortiumHeading: "الائتلاف المنفّذ",
consortium: [
{
name: "Acted",
role: "الشريك المنفّذ الرئيسي",
description:
"الإدارة العامة للمشروع والمشاريع الفرعية لمنظمات المجتمع المدني.",
},
{
name: "United Efforts Consultancy (UEC)",
role: "شريك في الائتلاف",
description: "تعزيز الشبكة، والحوار، والتعلّم بين الأقران.",
},
{
name: "Stichting Bureau Ensemble (SBE)",
role: "شريك في الائتلاف",
description: "البحث، وبيانات الاستطلاع، والمنشورات المعرفية.",
},
],
pillarsHeading: "محاور تركيزنا",
pillars: [
{
title: "تعزيز سيادة القانون",
description:
"دعم المؤسسات المحلية لتحسين الوصول إلى العدالة وتعزيز الشفافية",
},
{
title: "تمكين المجتمع المدني",
description:
"بناء قدرات منظمات المجتمع المدني لتعزيز دورها في الرقابة والمساءلة",
},
{
title: "دعم الحوكمة المحلية",
description:
"تعزيز التعاون بين البلديات والجهات الفاعلة المحلية لتحسين تقديم الخدمات",
},
],
legacyEyebrow: "استكمالًا لمشروع SHARP",
legacyHeading:
"حمل شبكة SHARP الأول والثاني إلى مرحلة جديدة",
legacyBody:
"يبني SHARP-ER على الأساس الذي أرساه مشروعا SHARP الأول والثاني (2019–2024)، حاملًا معه شبكة الشركاء من المجتمع المدني وممارسة الحوار إلى مرحلة جديدة تركّز على الاستدامة ومسار الخروج.",
legacyLinkLabel: "اطّلع على إرث مشروع SHARP",
},
whatWeDo: {
heroHeadline: "نهج تشاركي في العدالة والحوكمة",
lead: "نعمل مباشرة مع المجتمع المدني والبلديات والمجتمعات المحلية، لا من حولها.",
/* The approved Arabic column writes the same line as a sentence -
"يقوم عمل SHARP-ER على أربعة محاور مترابطة" - which the draft's frame
sets as the heading itself. */
workstreamsHeading: "أربعة محاور عمل مترابطة",
workstreams: [
{
title: "بناء القدرات",
description:
"تدريب منظمات المجتمع المدني والجهات المحلية على الحوكمة والعدالة والإدارة، وتزويد شبكة SHARP بالتعلّم بين الأقران.",
},
{
title: "الدعم المؤسسي",
description:
"تعزيز الأنظمة والإجراءات وقنوات الحوار التي تربط المؤسسات المحلية بالمجتمعات التي تخدمها.",
},
{
title: "المبادرات المجتمعية",
description:
"تمويل ودعم مشاريع فرعية تقودها منظمات المجتمع المدني، ومشاريع “من السياسة إلى الحقوق” (P2R)، ومبادرات الأمن البشري التي يصممها الفاعلون المحليون ويقودونها.",
},
{
title: "الحوار والتنسيق",
description:
"تنظيم حوارات SUQ (ابحث، افهم، اسأل) وجلسات قانون المجتمع المدني التي تجمع الفاعلين المدنيين والحكوميين حول طاولة واحدة.",
},
],
valuesLabel: "ما يوجّه عملنا",
values: [
"الحوار",
"القيادة المجتمعية",
"التعلّم",
"الشمول",
"المساءلة والمسؤولية",
],
principlesHeading: "كيف نعمل",
principleTitles: [
"العمل مع الفاعلين المحليين",
"حلول مستدامة لا آنية",
"الربط بين المجتمع المدني والمؤسسات",
"إصلاح مؤسسي تدريجي وواقعي",
],
activitiesCtaHeading: "اطّلع على كيفية تجسّد هذا العمل عبر الشبكة",
},
contact: {
facebookLabel: "تابعونا على فيسبوك",
heroHeadline: "تواصل معنا",
lead: "لديك استفسار حول SHARP-ER، أو شراكة محتملة، أو نشاط معيّن؟ راسلنا.",
formHeading: "أرسل لنا رسالة",
detailsHeading: "بيانات التواصل",
generalEnquiries: "للاستفسارات العامة",
websiteLabel: "الموقع الإلكتروني",
websiteHref: "https://sharper.ly",
websiteText: "sharper.ly",
contactPending:
"سيُنشر هنا البريد الإلكتروني العام للمشروع فور تأكيده. وفي غضون ذلك، استخدم النموذج وستصل رسالتك إلى الفريق.",
consortiumHeading: "جهات اتصال الائتلاف",
consortiumEmpty:
"ستُنشر هنا بيانات التواصل الخاصة بـ Acted ليبيا، وUnited Efforts Consultancy، وStichting Bureau Ensemble فور تأكيدها.",
sendAnother: "إرسال رسالة أخرى",
errorSummaryTitle: "يرجى مراجعة النموذج",
errorTooLong: "هذه الإجابة طويلة جدًا.",
honeypotLabel: "اترك هذا الحقل فارغًا",
organisationHint: "المنظمة التي تراسلنا نيابةً عنها، إن وُجدت.",
},
};
const COPY: Readonly<Record<Locale, PageCopy>> = { en: EN, ar: AR };
/** The draft copy for a locale. Always defined for both published locales. */
export function pageCopy(locale: Locale): PageCopy {
return COPY[locale] ?? EN;
}