doxa-maps/library/scripts/posters/packet-strings.json
doxa-maps-88655c70 7bba1c0771
Some checks are pending
build-gate / build (push) Waiting to run
feat(upg-100): the prayer card deck prints as CARDS, not as paper
Driver: "the print dialog that opens up needs to show all the cards not in a
paper format but a CARD format, the aspect ratio that is used in the card
generator."

The deck set @page{size:letter portrait} and gave each card height:100%, so 95
cards printed as 95 mostly-empty 8.5x11 sheets — and with NO photo, because
image_url was never in the fetch. Measured: 95 of 95 groups DO have a portrait,
so the omission cost every card the one thing that makes it a prayer card.

Now the PAGE IS THE CARD. @page takes the stock's own inches, so one card is
exactly one page: 95 cards -> 95 pages at 180x252pt (2.5x3.5in). Print on
cardstock and cut, or send the PDF to a card printer. The stock is a user
choice, per the Driver's ask to "choose the layout of the print dialog to choose
the aspect ratio": poker 2.5x3.5in (default), postcard 4x6in, A6.

⚠ @page SIZE MUST BE EXPLICIT INCHES. Chromium SILENTLY falls back to letter for
a named size it does not know: `size: A6 portrait` yields 612x792pt with no
error of any kind, while `size: 2.5in 3.5in` yields exactly 180x252pt. The gate
therefore asserts the MEASURED MediaBox — a check that grepped the stylesheet
would pass a deck that prints as paper.

Card content follows doxa-life/promotional-material-generation, the Python data
pipeline feeding the InDesign template: per language it emits Description,
Religion, Area, Country, a QR to that group's page, and the URL. Ported to
JavaScript here so the deck generates in the map app on click. Description and
Area are NOT available from this API — measured 0 of 2107 records carry either —
so the card is built from what genuinely exists: portrait, name, country,
population, language, religion. An empty block reserved for data that never
arrives is worse than a card designed around the data there is.

QR is hand-rolled (library/packet/qr.js, ~200 lines): byte mode, level M,
smallest fitting version, mask 0. A symbol is pure computation, so it costs one
small file instead of a package and runs identically under Node and in a tab —
the standing constraint is "without adding a lot of dependencies on the
internet". A QR that does not scan looks exactly like one that does, so it is
verified by DECODING: an independent reverse-path decoder re-derives the data
placement, unmasks, de-interleaves and parses the header. 5/5 round-trip,
including version selection (v2 for a short URL, v3 for real ones).

I18N: the QR encodes the LOCALISED profile URL, so a Spanish card scans through
to the Spanish page — verified, pray.doxa.life/es/aheu. Strings fall back per
key; checked with a partial Spanish block ("Ora por ellos" rendering while
Language/Religion stayed English).

★ ONE BUG THE NUMERIC GATE PASSED, worth recording. The first deck rendered
"LAO", "thm", "EAN" — raw codes on a card a person is meant to pray from —
because normalizeRecords() flattens each { value, label } dict to its VALUE and
parks the label under <field>_label. A gate counting "4 rows rendered" passed
it: the rows were there, just unreadable. The gate now asserts the values are
HUMAN-READABLE, not merely present.

Verified by check:card-deck across all three stocks: 95 cards / 95 pages, 0
broken portraits, 95 QR codes with real symbols, 0 raw codes, 0 overflow.
2026-09-24 02:56:20 +00:00

167 lines
No EOL
8.7 KiB
JSON
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.

{
"_meta": {
"purpose": "EVERY human-readable string in the UPG-100 prayer packet, in one file, so a new language is a new block here and NOT a code change. packet.mjs reads LANG (default 'en') and falls back to 'en' key-by-key, so a partial translation renders the translated keys and leaves the rest in English rather than blanking.",
"how_to_translate": "Copy the \"en\" block, change the key to the ISO code, translate the values. Keep {placeholders} exactly as they are — they are substituted at render time. Do not translate scripture REFERENCES (book names are resolved by the reader's own Bible); DO translate the prayer text.",
"note_on_scripture": "point4_passage is the ONLY full scripture text in the packet (Mark 5:1-20, printed in full at the Driver's instruction). A translation must supply its own rendering of that passage in a public-domain or properly-licensed version for that language."
},
"en": {
"map_page_kicker": "UNENGAGED PEOPLE GROUPS",
"map_page_sub": "A prayer list of {count} unreached people groups",
"list_header": "{from}–{to} of {count} · pray for them by name",
"people_suffix": "people",
"no_photo": "no photo available",
"deck_title": "Prayer Cards",
"card_country": "Country",
"card_population": "People",
"card_language": "Language",
"card_religion": "Religion",
"card_cta": "Pray for them",
"points_title": "12 Prayer Points",
"points_intro": "One hour with God, five minutes each. Pray these twelve for the people groups in this packet.",
"points_attrib": "Prayer rhythms inspired by Metacamp · metacamp.org",
"wheel_title": "Prayer Wheel",
"wheel_intro": "Spend an hour with God? It is easier than you think. Break it into 5-minute blocks and focus on one of these during each segment.",
"wheel_minutes": "minutes",
"wheel_attrib": "Prayer Wheel · Metacamp Module 1 · metacamp.org",
"privacy_note": "Marker positions are approximate · people-group locations are generalised at the source for privacy",
"rhythms": {
"praise": "PRAISE",
"wait": "WAIT",
"confess": "CONFESS",
"read": "READ THE WORD",
"ask": "ASK",
"intercede": "INTERCESSION",
"pray_word": "PRAY THE WORD",
"thank": "THANK",
"sing": "SING",
"meditate": "MEDITATE",
"listen": "LISTEN",
"praise_end": "PRAISE"
},
"points": [
{
"n": 1,
"rhythm": "praise",
"sub": "Two-Cross Gospel",
"text": "That they accept Christ as King, forgiven by His cross — and take up their own cross, willing to suffer in a persecution zone. May the Lamb receive the reward of His suffering, starting with me.",
"refs": [
"Matthew 27:27",
"Matthew 16:24–25"
]
},
{
"n": 2,
"rhythm": "wait",
"sub": "Holy Spirit & deliverance",
"text": "That they are filled with the Spirit and made bold witnesses; not isolated; baptized in water and Spirit; every evil grip broken. That believers in neighbouring peoples are mobilised as laborers.",
"refs": [
"Acts 1:8",
"John 14:26"
]
},
{
"n": 3,
"rhythm": "confess",
"sub": "",
"text": "We confess unbelief that this is too big for God. That He revives our love and faith for the global unreached.",
"refs": [
"John 3:16",
"1 John 1:9"
]
},
{
"n": 4,
"rhythm": "read",
"sub": "the Father's love",
"text": "That they would be SAVED and KNOW their heavenly Father loves them — and that through them He would bring salvation to their family, friends, neighbours, coworkers, classmates, everyone they know personally.",
"refs": [
"Mark 5:1–20",
"Acts 16:31"
],
"print_passage": true
},
{
"n": 5,
"rhythm": "ask",
"sub": "baptisms",
"text": "New baptisms among the locals, and every baptized one trained to baptize others, multiplying.",
"refs": [
"Acts 16",
"Acts 10"
]
},
{
"n": 6,
"rhythm": "intercede",
"sub": "laborers & shepherds",
"text": "Laborers sent to deeply love a people they have never met; good shepherds raised up from within.",
"refs": [
"Luke 10:2",
"John 10:11–15"
]
},
{
"n": 7,
"rhythm": "pray_word",
"sub": "Persons & Houses of Peace",
"text": "That laborers and local leaders find the receptive person and the house of peace, and disciple them well.",
"refs": [
"Luke 10:5–7",
"Matthew 10:5–14"
]
},
{
"n": 8,
"rhythm": "thank",
"sub": "rest",
"text": "Thank God for the rest He has given; that they enter that rest in Christ, and that their spiritual family is a safe place.",
"refs": [
"Mark 4:26–29",
"Hebrews 4:9–11"
]
},
{
"n": 9,
"rhythm": "sing",
"sub": "",
"text": "That the people group is flooded with worshippers — worship everywhere, in freedom and in chains.",
"refs": [
"Acts 16:25–26",
"Colossians 3:16"
]
},
{
"n": 10,
"rhythm": "meditate",
"sub": "communion",
"text": "That they take communion together and grasp the weight of His death, burial and resurrection.",
"refs": [
"Matthew 26:26–30",
"1 Corinthians 11:23–26"
]
},
{
"n": 11,
"rhythm": "listen",
"sub": "accountability",
"text": "Not only that they would listen, but that they would have people in their life who help them read the Word, pray, commit to community, and respond to suffering well — resisting the adversary who comes after believers across the whole world.",
"refs": [
"1 Peter 5:6–11",
"Hebrews 10:24–25"
]
},
{
"n": 12,
"rhythm": "praise_end",
"sub": "great · greater · greatest",
"text": "Praise in advance — for salvations; GREATER, for spiritual families multiplying; GREATEST, for lives yielded and local church planters raised up who multiply healthy churches across the whole people group, no matter the cost.",
"refs": [
"Acts 2:42–47",
"Matthew 28:19–20"
]
}
],
"point4_passage": "And they came to the other side of the sea, into the country of the Gadarenes. When he had come out of the boat, immediately a man with an unclean spirit met him out of the tombs. He lived in the tombs. Nobody could bind him any more, not even with chains, because he had been often bound with fetters and chains, and the chains had been torn apart by him, and the fetters broken in pieces. Nobody had the strength to tame him. Always, night and day, in the tombs and in the mountains, he was crying out, and cutting himself with stones. When he saw Jesus from afar, he ran and bowed down to him, and crying out with a loud voice, he said, “What have I to do with you, Jesus, you Son of the Most High God? I adjure you by God, don’t torment me.” For he said to him, “Come out of the man, you unclean spirit!” He asked him, “What is your name?” He said to him, “My name is Legion, for we are many.” He begged him much that he would not send them away out of the country. Now on the mountainside there was a great herd of pigs feeding. All the demons begged him, saying, “Send us into the pigs, that we may enter into them.” At once Jesus gave them permission. The unclean spirits came out and entered into the pigs. The herd of about two thousand rushed down the steep bank into the sea, and they were drowned in the sea. Those who fed them fled, and told it in the city and in the country. The people came to see what it was that had happened. They came to Jesus, and saw him who had been possessed by demons sitting, clothed, and in his right mind, even him who had the legion; and they were afraid. Those who saw it declared to them what happened to him who was possessed by demons, and about the pigs. They began to beg him to depart from their region. As he was entering into the boat, he who had been possessed by demons begged him that he might be with him. He didn’t allow him, but said to him, “Go to your house, to your friends, and tell them what great things the Lord has done for you and how he had mercy on you.” He went his way, and began to proclaim in Decapolis how Jesus had done great things for him, and everyone marveled.",
"point4_passage_credit": "Mark 5:1–20 · World English Bible (public domain)"
}
}