From bad51cef2bf4047f2c3d283a8c0459423317e286 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 00:47:51 +0000 Subject: [PATCH] Print the Chinese prayer packet in one script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The app's Chinese is Simplified, and so were 39 keys of the packet's zh block. The other 18 were Traditional - page 1's subtitle, the list header, the card labels, and the whole prayer wheel and all twelve prayer points - so a Chinese packet switched script partway through. The block had been extended by matching the neighbouring line, which was itself the drift; the missing-map sentence added in 74e5c4b0d followed that same neighbour and is corrected here too. Converted with a real converter (zhconv, MediaWiki's tables), not a hand-picked character list: it converts characters (為 to 为, 禱 to 祷) and mainland vocabulary (列印 to 打印), and a hand list had found only 17 of the 18 keys. A second pass changes nothing, so the block is Simplified by the converter's own definition. 祂 is kept. The block carries no licensed scripture - Mark 5 falls back to English there - so only prayer prose and labels changed. check-i18n-parity's zh arm walked the app catalogues and never the packet's, which is how 18 keys drifted unseen. It now walks the packet block as well; pointed at the block before this commit it fails with 41 values, and passes after. Its character set remains a floor, as it says. --- internal/check-i18n-parity.mjs | 6 ++ library/scripts/posters/packet-strings.json | 86 ++++++++++----------- 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/internal/check-i18n-parity.mjs b/internal/check-i18n-parity.mjs index 2a2ffa18f..5ad14d33e 100644 --- a/internal/check-i18n-parity.mjs +++ b/internal/check-i18n-parity.mjs @@ -130,6 +130,12 @@ const zhTrad = [] else if (o && typeof o === 'object') for (const [k, v] of Object.entries(o)) walk(v, p ? `${p}.${k}` : k, area) } if (existsSync(join(ROOT, 'zh'))) for (const a of areas) { const p = join(ROOT, 'zh', a); if (existsSync(p)) walk(JSON.parse(readFileSync(p, 'utf8')), '', a) } + // ★ AND THE PACKET'S OWN CATALOGUE. The printed prayer packet reads packet-strings.json, not these + // areas, so its zh block was outside this arm entirely — and drifted to 18 Traditional keys (the + // whole wheel and all 12 prayer points among them) while this arm stayed green. A Chinese packet + // then switched script partway through the document. + const PACKET = join(ROOT, '..', '..', 'scripts', 'posters', 'packet-strings.json') + if (existsSync(PACKET)) { const zhp = JSON.parse(readFileSync(PACKET, 'utf8')).zh; if (zhp) walk(zhp, '', 'packet-strings') } } if (zhTrad.length) { console.log(`\nI18N-PARITY: FAIL — ${zhTrad.length} zh value(s) contain Traditional-only characters; zh is Simplified:`) diff --git a/library/scripts/posters/packet-strings.json b/library/scripts/posters/packet-strings.json index 9ea97bc7b..41f3876e1 100644 --- a/library/scripts/posters/packet-strings.json +++ b/library/scripts/posters/packet-strings.json @@ -2261,46 +2261,46 @@ }, "zh": { "map_page_kicker": "未得之民", - "map_page_sub": "為 {count} 個未得之民的禱告名單", - "map_unavailable": "此禱告名單的地圖未包含在本次列印中。", + "map_page_sub": "为 {count} 个未得之民的祷告名单", + "map_unavailable": "此祷告名单的地图未包含在本次打印中。", "map_page_series": "UPG 100 的 {k} 份祷告名单之一", - "list_header": "{count} 之中的 {from}–{to} · 按名為他們禱告", + "list_header": "{count} 之中的 {from}–{to} · 按名为他们祷告", "people_suffix": "人", - "no_photo": "沒有照片", - "deck_title": "禱告卡", - "card_country": "國家", + "no_photo": "没有照片", + "deck_title": "祷告卡", + "card_country": "国家", "card_population": "人口", - "card_language": "語言", + "card_language": "语言", "card_religion": "宗教", - "card_cta": "為他們禱告", - "points_title": "12 個禱告要點", - "points_intro": "與神同在一小時,每個要點五分鐘。為這份禱告冊中的族群禱告這十二個要點。", - "points_attrib": "禱告節奏取材自 Metacamp · metacamp.org", - "wheel_title": "禱告輪", - "wheel_intro": "與神同在一小時?比你想的容易。把它分成五分鐘一段,每一段專注其中一個要點。", - "wheel_minutes": "分鐘", - "wheel_attrib": "禱告輪 · Metacamp 第一單元 · metacamp.org", - "privacy_note": "標記位置為概略位置 · 族群所在地已於資料來源處作概化處理以保護隱私", + "card_cta": "为他们祷告", + "points_title": "12 个祷告要点", + "points_intro": "与神同在一小时,每个要点五分钟。为这份祷告册中的族群祷告这十二个要点。", + "points_attrib": "祷告节奏取材自 Metacamp · metacamp.org", + "wheel_title": "祷告轮", + "wheel_intro": "与神同在一小时?比你想的容易。把它分成五分钟一段,每一段专注其中一个要点。", + "wheel_minutes": "分钟", + "wheel_attrib": "祷告轮 · Metacamp 第一单元 · metacamp.org", + "privacy_note": "标记位置为概略位置 · 族群所在地已于资料来源处作概化处理以保护隐私", "rhythms": { - "praise": "讚美", + "praise": "赞美", "wait": "等候", - "confess": "認罪", - "read": "讀神的話", + "confess": "认罪", + "read": "读神的话", "ask": "祈求", - "intercede": "代禱", - "pray_word": "以神的話禱告", - "thank": "感謝", + "intercede": "代祷", + "pray_word": "以神的话祷告", + "thank": "感谢", "sing": "歌唱", "meditate": "默想", - "listen": "聆聽", - "praise_end": "讚美" + "listen": "聆听", + "praise_end": "赞美" }, "points": [ { "n": 1, "rhythm": "praise", - "sub": "兩個十字架的福音", - "text": "願他們接受基督為王,藉著祂的十字架得赦免——也背起自己的十字架,甘願在逼迫之地受苦。願羔羊得著祂受苦的賞賜,從我開始。", + "sub": "两个十字架的福音", + "text": "愿他们接受基督为王,借着祂的十字架得赦免——也背起自己的十字架,甘愿在逼迫之地受苦。愿羔羊得着祂受苦的赏赐,从我开始。", "refs": [ "Matthew 27:27", "Matthew 16:24–25" @@ -2309,8 +2309,8 @@ { "n": 2, "rhythm": "wait", - "sub": "聖靈與釋放", - "text": "願他們被聖靈充滿,成為剛強的見證人;不至孤單;受水和聖靈的洗;一切邪惡的轄制都被打破。願鄰近族群中的信徒被興起作工人。", + "sub": "圣灵与释放", + "text": "愿他们被圣灵充满,成为刚强的见证人;不至孤单;受水和圣灵的洗;一切邪恶的辖制都被打破。愿邻近族群中的信徒被兴起作工人。", "refs": [ "Acts 1:8", "John 14:26" @@ -2320,7 +2320,7 @@ "n": 3, "rhythm": "confess", "sub": "", - "text": "我們承認自己的不信,以為這事對神太難。願祂重新點燃我們對普世未得之民的愛與信心。", + "text": "我们承认自己的不信,以为这事对神太难。愿祂重新点燃我们对普世未得之民的爱与信心。", "refs": [ "John 3:16", "1 John 1:9" @@ -2329,8 +2329,8 @@ { "n": 4, "rhythm": "read", - "sub": "天父的愛", - "text": "願他們得救,並知道天父愛他們——也願神藉著他們,把救恩帶給他們的家人、朋友、鄰舍、同事、同學,以及他們所認識的每一個人。", + "sub": "天父的爱", + "text": "愿他们得救,并知道天父爱他们——也愿神借着他们,把救恩带给他们的家人、朋友、邻舍、同事、同学,以及他们所认识的每一个人。", "refs": [ "Mark 5:1–20", "Acts 16:31" @@ -2340,8 +2340,8 @@ { "n": 5, "rhythm": "ask", - "sub": "洗禮", - "text": "願當地有新的受洗者,並且每一位受洗的人都被裝備去為別人施洗,不斷繁增。", + "sub": "洗礼", + "text": "愿当地有新的受洗者,并且每一位受洗的人都被装备去为别人施洗,不断繁增。", "refs": [ "Acts 16", "Acts 10" @@ -2350,8 +2350,8 @@ { "n": 6, "rhythm": "intercede", - "sub": "工人與牧人", - "text": "願工人被差派去深愛一群素未謀面的人;也願好牧人從他們中間被興起。", + "sub": "工人与牧人", + "text": "愿工人被差派去深爱一群素未谋面的人;也愿好牧人从他们中间被兴起。", "refs": [ "Luke 10:2", "John 10:11–15" @@ -2360,8 +2360,8 @@ { "n": 7, "rhythm": "pray_word", - "sub": "平安之子與平安之家", - "text": "願工人與當地帶領者尋得那樂意接待的人和平安之家,並好好門訓他們。", + "sub": "平安之子与平安之家", + "text": "愿工人与当地带领者寻得那乐意接待的人和平安之家,并好好门训他们。", "refs": [ "Luke 10:5–7", "Matthew 10:5–14" @@ -2371,7 +2371,7 @@ "n": 8, "rhythm": "thank", "sub": "安息", - "text": "感謝神所賜的安息;願他們在基督裡進入那安息,也願他們的屬靈家庭是安全的地方。", + "text": "感谢神所赐的安息;愿他们在基督里进入那安息,也愿他们的属灵家庭是安全的地方。", "refs": [ "Mark 4:26–29", "Hebrews 4:9–11" @@ -2381,7 +2381,7 @@ "n": 9, "rhythm": "sing", "sub": "", - "text": "願這族群充滿敬拜者——處處敬拜,在自由中,也在捆鎖中。", + "text": "愿这族群充满敬拜者——处处敬拜,在自由中,也在捆锁中。", "refs": [ "Acts 16:25–26", "Colossians 3:16" @@ -2390,8 +2390,8 @@ { "n": 10, "rhythm": "meditate", - "sub": "聖餐", - "text": "願他們一同領受聖餐,深深體會祂的死、埋葬與復活的份量。", + "sub": "圣餐", + "text": "愿他们一同领受圣餐,深深体会祂的死、埋葬与复活的分量。", "refs": [ "Matthew 26:26–30", "1 Corinthians 11:23–26" @@ -2401,7 +2401,7 @@ "n": 11, "rhythm": "listen", "sub": "彼此守望", - "text": "不只願他們聆聽,更願他們身邊有人幫助他們讀神的話、禱告、委身群體,並在苦難中正確回應——抵擋那在全世界追逼信徒的仇敵。", + "text": "不只愿他们聆听,更愿他们身边有人帮助他们读神的话、祷告、委身群体,并在苦难中正确回应——抵挡那在全世界追逼信徒的仇敌。", "refs": [ "1 Peter 5:6–11", "Hebrews 10:24–25" @@ -2411,7 +2411,7 @@ "n": 12, "rhythm": "praise_end", "sub": "大 · 更大 · 最大", - "text": "先行讚美——為著得救的人;更大的,為著不斷繁增的屬靈家庭;最大的,為著獻上的生命,以及被興起的本地植堂者,無論代價如何,都在整個族群中繁增健康的教會。", + "text": "先行赞美——为着得救的人;更大的,为着不断繁增的属灵家庭;最大的,为着献上的生命,以及被兴起的本地植堂者,无论代价如何,都在整个族群中繁增健康的教会。", "refs": [ "Acts 2:42–47", "Matthew 28:19–20"