@jjlmoya/utils-civic 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +4 -0
  4. package/src/tests/locale_completeness.test.ts +1 -1
  5. package/src/tests/tool_validation.test.ts +1 -1
  6. package/src/tests/translation_copy.test.ts +1 -1
  7. package/src/tool/parliamentary-voting-analyzer/bibliography.astro +14 -0
  8. package/src/tool/parliamentary-voting-analyzer/bibliography.ts +6 -0
  9. package/src/tool/parliamentary-voting-analyzer/component.astro +63 -0
  10. package/src/tool/parliamentary-voting-analyzer/contract.test.ts +16 -0
  11. package/src/tool/parliamentary-voting-analyzer/controller.ts +65 -0
  12. package/src/tool/parliamentary-voting-analyzer/dom-views.ts +63 -0
  13. package/src/tool/parliamentary-voting-analyzer/entry.ts +27 -0
  14. package/src/tool/parliamentary-voting-analyzer/evaluator.ts +12 -0
  15. package/src/tool/parliamentary-voting-analyzer/i18n/de.ts +45 -0
  16. package/src/tool/parliamentary-voting-analyzer/i18n/en.ts +79 -0
  17. package/src/tool/parliamentary-voting-analyzer/i18n/es.ts +49 -0
  18. package/src/tool/parliamentary-voting-analyzer/i18n/fr.ts +43 -0
  19. package/src/tool/parliamentary-voting-analyzer/i18n/id.ts +45 -0
  20. package/src/tool/parliamentary-voting-analyzer/i18n/it.ts +45 -0
  21. package/src/tool/parliamentary-voting-analyzer/i18n/ja.ts +45 -0
  22. package/src/tool/parliamentary-voting-analyzer/i18n/ko.ts +45 -0
  23. package/src/tool/parliamentary-voting-analyzer/i18n/nl.ts +45 -0
  24. package/src/tool/parliamentary-voting-analyzer/i18n/pl.ts +45 -0
  25. package/src/tool/parliamentary-voting-analyzer/i18n/pt.ts +45 -0
  26. package/src/tool/parliamentary-voting-analyzer/i18n/ru.ts +45 -0
  27. package/src/tool/parliamentary-voting-analyzer/i18n/sv.ts +45 -0
  28. package/src/tool/parliamentary-voting-analyzer/i18n/tr.ts +45 -0
  29. package/src/tool/parliamentary-voting-analyzer/i18n/zh.ts +45 -0
  30. package/src/tool/parliamentary-voting-analyzer/index.ts +11 -0
  31. package/src/tool/parliamentary-voting-analyzer/logic.test.ts +52 -0
  32. package/src/tool/parliamentary-voting-analyzer/logic.ts +279 -0
  33. package/src/tool/parliamentary-voting-analyzer/parliamentary-voting-analyzer.css +491 -0
  34. package/src/tool/parliamentary-voting-analyzer/seo.astro +14 -0
  35. package/src/tool/parliamentary-voting-analyzer/storage.ts +25 -0
  36. package/src/tool/parliamentary-voting-analyzer/ui.ts +98 -0
  37. package/src/tool/public-budget-analyzer/bibliography.astro +15 -0
  38. package/src/tool/public-budget-analyzer/bibliography.ts +7 -0
  39. package/src/tool/public-budget-analyzer/component.astro +52 -0
  40. package/src/tool/public-budget-analyzer/controller.ts +84 -0
  41. package/src/tool/public-budget-analyzer/dom-views.ts +52 -0
  42. package/src/tool/public-budget-analyzer/entry.ts +27 -0
  43. package/src/tool/public-budget-analyzer/evaluator.ts +15 -0
  44. package/src/tool/public-budget-analyzer/i18n/de.ts +115 -0
  45. package/src/tool/public-budget-analyzer/i18n/en.ts +78 -0
  46. package/src/tool/public-budget-analyzer/i18n/es.ts +115 -0
  47. package/src/tool/public-budget-analyzer/i18n/fr.ts +115 -0
  48. package/src/tool/public-budget-analyzer/i18n/id.ts +115 -0
  49. package/src/tool/public-budget-analyzer/i18n/it.ts +115 -0
  50. package/src/tool/public-budget-analyzer/i18n/ja.ts +115 -0
  51. package/src/tool/public-budget-analyzer/i18n/ko.ts +115 -0
  52. package/src/tool/public-budget-analyzer/i18n/nl.ts +115 -0
  53. package/src/tool/public-budget-analyzer/i18n/pl.ts +115 -0
  54. package/src/tool/public-budget-analyzer/i18n/pt.ts +115 -0
  55. package/src/tool/public-budget-analyzer/i18n/ru.ts +115 -0
  56. package/src/tool/public-budget-analyzer/i18n/sv.ts +115 -0
  57. package/src/tool/public-budget-analyzer/i18n/tr.ts +115 -0
  58. package/src/tool/public-budget-analyzer/i18n/zh.ts +115 -0
  59. package/src/tool/public-budget-analyzer/index.ts +11 -0
  60. package/src/tool/public-budget-analyzer/logic.test.ts +81 -0
  61. package/src/tool/public-budget-analyzer/logic.ts +249 -0
  62. package/src/tool/public-budget-analyzer/public-budget-analyzer.css +461 -0
  63. package/src/tool/public-budget-analyzer/seo.astro +15 -0
  64. package/src/tool/public-budget-analyzer/storage.ts +28 -0
  65. package/src/tool/public-budget-analyzer/ui.ts +78 -0
  66. package/src/tools.ts +4 -0
@@ -0,0 +1,43 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+
6
+ const ui: ParliamentaryVotingUI = {
7
+ dataHeading: 'Donnez une forme visible à un vote nominal', dataHelp: 'Collez une ligne par membre et par vote. Utilisez les quatre colonnes membre, groupe, vote et choix.', csvLabel: 'CSV du vote nominal', csvHint: 'Colonnes obligatoires: membre, groupe, vote, choix. Choix acceptés: oui, non, abstention, absent, inconnu.', loadExample: "Charger l'exemple", analyzeAction: 'Analyser les votes', clearAction: 'Effacer les données', compareLabel: 'Vue des accords', groupsOption: 'Groupes', membersOption: 'Membres', resultHeading: 'Le relevé de vote en un coup d\'œil', emptyResult: "Collez un vote ou chargez l'exemple pour afficher le ruban des votes.", rowsLabel: 'enregistrements', groupsLabel: 'groupes', votesLabel: 'votes', warningsHeading: 'Vérifications avant interprétation', methodHeading: 'Méthode appliquée', methodText: "L'indice de Rice de chaque groupe et vote est la différence absolue entre oui et non, divisée par oui plus non. Les abstentions, absences et valeurs inconnues sont exclues de ce dénominateur binaire. Les moyennes de groupe sont des moyennes non pondérées des votes comportant au moins un oui ou un non. L'accord compare les choix binaires sur un même vote et affiche toujours le nombre de votes comparables.", limitsHeading: 'Ce que cet outil ne fait pas', limitsText: "Il n'infère ni idéologie, intention, discipline, entente, faute, position politique ni causalité. Il ne décide pas non plus si un vote était valide ou si un membre devait légalement être présent. Des votes similaires peuvent avoir plusieurs explications.", edgeHeading: 'Cas limites et avertissements', edgeText: "Un vote unanime obtient 1, mais cela ne prouve pas la discipline. Les égalités donnent une cohésion nulle et sont distinguées des abstentions. Les votes manquants réduisent l'échantillon comparable. Gardez visibles les changements de groupe, identifiants en double et choix inconnus dans les données sources.", cohesionHeading: 'Ruban de cohésion', cohesionHelp: 'Chaque ligne est un groupe. Une marque vive signifie oui, une sombre non, une tiretée égalité, une creuse abstention et une discrète absence ou donnée inconnue.', agreementHeading: 'Accord par paires', agreementHelp: "L'accord utilise uniquement les choix oui et non comparables partagés par les deux entités. Dans la vue des groupes, chaque groupe apporte son choix majoritaire non égalitaire. Les abstentions et non-participations restent hors du numérateur et du dénominateur.", groupLabel: 'Groupe', voteLabel: 'Vote', riceLabel: 'Indice de Rice', comparableLabel: 'Votes comparables', participationLabel: 'Choix enregistrés', abstentionsLabel: 'abstentions', absencesLabel: 'absences', unknownLabel: 'inconnus', noComparableData: 'Aucun choix oui ou non comparable', noDataWarning: "Aucun enregistrement utilisable. Ajoutez des valeurs pour le membre, le groupe, le vote et le choix.", malformedRowWarning: 'Certaines lignes ont été ignorées car un champ obligatoire était vide.', duplicateWarning: 'Les paires membre-vote en double n\'ont été conservées qu\'une fois.', unknownChoiceWarning: 'Certains choix sont restés inconnus car ils ne correspondaient pas à oui, non, abstention ou absence.', lowSampleWarning: 'Certains accords par paires ont moins de deux votes comparables et ne doivent pas être considérés comme stables.', tieWarning: 'Une égalité de groupe ou d\'entité a été exclue de la comparaison par groupes pour ce vote.', importedMessage: 'Exemple chargé. Vous pouvez modifier les lignes avant l\'analyse.', invalidCsvMessage: 'Les données ne peuvent pas être lues comme un CSV organisé par lignes.', copyAction: 'Copier le résumé', copiedMessage: 'Résumé copié dans le presse-papiers.', copyFailure: 'Échec de la copie. Sélectionnez manuellement le texte du résumé.',
8
+ };
9
+ const faq = [
10
+ { question: "Que mesure l'indice de Rice ?", answer: "Pour un groupe et un vote, c'est la différence absolue entre les votes oui et non divisée par leur somme. Il va de zéro pour une division égale à un pour un vote binaire unanime." },
11
+ { question: 'Les abstentions et absences sont-elles incluses ?', answer: "Non. Le dénominateur binaire de Rice utilise seulement oui et non. Les abstentions, absences et valeurs inconnues restent visibles comme signaux de participation, mais ne comptent pas dans le score binaire." },
12
+ { question: "L'accord prouve-t-il une idéologie commune ?", answer: "Non. Il décrit seulement les choix binaires enregistrés lors des votes comparables. Il n'identifie ni idéologie, intention, entente ni causalité." },
13
+ { question: 'Pourquoi afficher le nombre de votes comparables ?', answer: 'Un pourcentage sans dénominateur peut cacher des données manquantes. Ce nombre indique combien de votes partagés ont réellement contribué au taux d\'accord.' },
14
+ ];
15
+ const howTo = [
16
+ { name: 'Préparer une ligne par choix', text: 'Créez des lignes CSV avec les colonnes membre, groupe, vote et choix. Utilisez oui, non, abstention, absent ou inconnu.' },
17
+ { name: 'Charger la matrice', text: "Collez le CSV ou chargez l'exemple, puis vérifiez les nombres de groupes et de votes par rapport à la source." },
18
+ { name: 'Lire la cohésion', text: "Utilisez le ruban et le résumé de l'indice de Rice pour examiner la cohésion binaire de chaque groupe et vote." },
19
+ { name: 'Comparer les choix', text: 'Passez de la comparaison des groupes à celle des membres et lisez chaque taux avec son nombre de votes comparables.' },
20
+ { name: 'Examiner les alertes', text: 'Vérifiez les lignes ignorées, doublons, choix inconnus, égalités et petits échantillons avant de conclure.' },
21
+ ];
22
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
23
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Analyser des votes nominaux parlementaires', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
24
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Analyseur de votes parlementaires', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: 'Analyse la cohésion et l\'accord par paires de votes nominaux parlementaires dans une matrice transparente.', url: 'https://gamebob.dev/fr/analyse-votes-parlementaires', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
25
+
26
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'analyse-votes-parlementaires', title: 'Analyseur de votes parlementaires', description: 'Mesurez la cohésion des groupes et l\'accord par paires dans une matrice de votes nominaux, en gardant visibles abstentions, absences, dénominateurs et alertes.', ui, seo: [
27
+ { type: 'title', text: 'Examiner la cohésion d\'un vote nominal parlementaire', level: 2 },
28
+ { type: 'paragraph', html: 'Un vote nominal indique qui a voté, mais une longue liste de oui et de non ne montre pas immédiatement si un groupe a agi de façon unie. Cet analyseur transforme la matrice en lignes en ruban visuel, résumés de groupes et résultats d\'accord par paires. Il conserve les distinctions de la source pour éviter qu\'un pourcentage ne masque les absences ou choix non binaires.' },
29
+ { type: 'paragraph', html: 'L\'entrée attendue est un tableau contenant une ligne par membre et par vote. Chaque ligne donne le membre, le groupe parlementaire, l\'identifiant du vote et le choix enregistré. Les termes courants comme pour, contre, abstention et n\'a pas voté sont reconnus ; une valeur inconnue reste inconnue au lieu d\'être recodée en silence.' },
30
+ { type: 'title', text: 'Calculer l\'indice de Rice', level: 2 },
31
+ { type: 'paragraph', html: 'Pour un groupe et un vote, l\'indice de Rice est |oui moins non| divisé par oui plus non. Un vote binaire unanime vaut 1, un partage égal vaut 0 et un groupe sans oui ni non n\'a pas de valeur de Rice. Le résumé utilise la moyenne non pondérée des valeurs disponibles: les données manquantes ne deviennent pas des zéros inventés.' },
32
+ { type: 'table', headers: ['Signal', 'Calcul', 'Interprétation'], rows: [['Indice de Rice', '|oui moins non| / (oui plus non)', 'Cohésion binaire d\'un groupe et d\'un vote'], ['Rice moyen', 'Moyenne des valeurs disponibles', 'Cohésion habituelle des votes comparables'], ['Accord', 'Choix binaires identiques / votes partagés comparables', 'Coïncidence observée entre deux entités']] },
33
+ { type: 'title', text: 'Préparer une matrice vérifiable', level: 2 },
34
+ { type: 'paragraph', html: 'Employez un identifiant stable pour chaque vote et conservez les catégories originales jusqu\'à l\'import. Ne transformez pas une absence en non, ni une abstention en cellule vide: ces décisions modifient les comptes de participation et les observations comparables.' },
35
+ { type: 'list', items: ['Vérifiez que chaque ligne appartient à la chambre et à la période étudiées.', 'Gardez les noms des membres et groupes cohérents, accents et ponctuation compris.', 'Donnez des identifiants distincts aux motions répétées qui correspondent à des votes séparés.', 'Contrôlez les paires membre-vote en double avec la source avant de garder la première ligne.', 'Conservez le fichier source et le texte importé à côté de toute interprétation publiée.'] },
36
+ { type: 'tip', title: 'Un pourcentage a besoin de son dénominateur', html: 'Un accord de 100 % sur deux votes partagés n\'est pas la même preuve que 100 % sur quatre-vingts. Lisez le nombre comparable avec chaque taux et considérez un petit échantillon comme une raison de collecter davantage de données.' },
37
+ { type: 'title', text: 'Lire le ruban sans extrapoler', level: 2 },
38
+ { type: 'paragraph', html: 'Le ruban aide à lire les données, il ne rend pas de verdict politique. Les marques bleues représentent une majorité de oui, les marques rouille une majorité de non, les contours une abstention et les marques discrètes une absence ou une donnée inconnue. Le score résume les choix binaires ; les comptes de participation montrent ce qui est exclu du dénominateur.' },
39
+ { type: 'paragraph', html: 'Une forte cohésion peut venir de préférences communes, de la discipline de parti, d\'une négociation de coalition, d\'une motion étroite ou d\'un petit groupe. Un fort accord entre groupes peut refléter un ordre du jour peu conflictuel. Un score bas peut indiquer une division réelle ou une composition changeante. L\'outil décrit la matrice sans trancher entre ces explications.' },
40
+ { type: 'title', text: 'Limites de la méthode et alertes de données', level: 2 },
41
+ { type: 'paragraph', html: 'L\'outil applique le calcul binaire conventionnel de Rice et une règle transparente d\'accord par paires. Il n\'infère ni idéologie, intention, faute ni obligation légale. Consultez les définitions officielles du vote avant de comparer abstention, absence ou valeur inconnue entre parlements.' },
42
+ { type: 'tip', title: 'Les alertes font partie du résultat', html: 'Lignes ignorées, identifiants en double, choix inconnus, égalités et petits échantillons comparables ne sont pas décoratifs. Résolvez-les ou documentez-les avant de comparer périodes, groupes ou membres.' },
43
+ ], faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: 'Tampilkan pemungutan suara terbuka', dataHelp: 'Tempel satu baris untuk setiap anggota dan pemungutan suara. Gunakan empat kolom anggota, kelompok, suara, dan pilihan.', csvLabel: 'CSV pemungutan suara', csvHint: 'Kolom wajib: anggota, kelompok, suara, pilihan. Pilihan yang diterima: ya, tidak, abstain, tidak hadir, tidak diketahui.', loadExample: 'Muat contoh', analyzeAction: 'Analisis suara', clearAction: 'Hapus data', compareLabel: 'Tampilan kesepakatan', groupsOption: 'Kelompok', membersOption: 'Anggota', resultHeading: 'Catatan suara dalam sekejap', emptyResult: 'Tempel data suara atau muat contoh untuk menampilkan pita suara.', rowsLabel: 'catatan', groupsLabel: 'kelompok', votesLabel: 'pemungutan suara', warningsHeading: 'Pemeriksaan sebelum menafsirkan', methodHeading: 'Metode yang diterapkan', methodText: 'Indeks Rice untuk setiap kelompok dan pemungutan suara adalah selisih absolut antara ya dan tidak dibagi jumlah ya dan tidak. Abstain, tidak hadir, dan nilai yang tidak diketahui dikeluarkan dari penyebut biner. Rata-rata kelompok adalah rata-rata tanpa bobot dari suara yang memiliki sedikitnya satu ya atau tidak. Kesepakatan membandingkan pilihan biner pada suara yang sama dan selalu menampilkan jumlah suara yang dapat dibandingkan.', limitsHeading: 'Yang tidak dilakukan alat ini', limitsText: 'Alat ini tidak menyimpulkan ideologi, niat, disiplin, kolusi, pelanggaran, posisi kebijakan, atau sebab-akibat. Alat ini juga tidak menentukan apakah suara sah atau apakah anggota wajib hadir secara hukum. Pola suara yang sama dapat memiliki banyak penjelasan.', edgeHeading: 'Kasus tepi dan peringatan data', edgeText: 'Suara bulat menghasilkan nilai 1, bukan bukti disiplin. Hasil seri menghasilkan kohesi nol dan ditandai terpisah dari abstain. Suara yang hilang mengurangi sampel yang dapat dibandingkan. Biarkan perubahan keanggotaan, pengenal ganda, dan pilihan tidak dikenal tetap terlihat di data sumber.', cohesionHeading: 'Pita kohesi', cohesionHelp: 'Setiap baris adalah kelompok. Tanda terang berarti ya, tanda gelap berarti tidak, tanda putus-putus berarti seri, tanda kosong berarti abstain, dan tanda redup berarti tidak hadir atau data tidak dikenal.', agreementHeading: 'Kesepakatan berpasangan', agreementHelp: 'Kesepakatan hanya memakai pilihan ya dan tidak yang dapat dibandingkan dan dimiliki kedua entitas. Dalam tampilan kelompok, setiap kelompok menyumbangkan pilihan mayoritasnya yang tidak seri. Abstain dan tidak memilih tidak masuk pembilang maupun penyebut.', groupLabel: 'Kelompok', voteLabel: 'Suara', riceLabel: 'Indeks Rice', comparableLabel: 'Suara yang dapat dibandingkan', participationLabel: 'Pilihan tercatat', abstentionsLabel: 'abstain', absencesLabel: 'tidak hadir', unknownLabel: 'tidak diketahui', noComparableData: 'Tidak ada pilihan ya atau tidak yang dapat dibandingkan', noDataWarning: 'Tidak ada catatan yang dapat digunakan. Tambahkan anggota, kelompok, suara, dan pilihan.', malformedRowWarning: 'Beberapa baris dilewati karena kolom wajib kosong.', duplicateWarning: 'Pasangan anggota dan suara yang duplikat hanya disimpan sekali.', unknownChoiceWarning: 'Beberapa pilihan dipertahankan sebagai tidak diketahui karena tidak dikenali sebagai ya, tidak, abstain, atau tidak hadir.', lowSampleWarning: 'Beberapa hasil berpasangan memiliki kurang dari dua suara pembanding dan tidak boleh dianggap pola yang stabil.', tieWarning: 'Hasil seri kelompok atau entitas dikeluarkan dari perbandingan tingkat kelompok untuk suara tersebut.', importedMessage: 'Contoh dimuat. Anda dapat mengedit baris sebelum menganalisis.', invalidCsvMessage: 'Data tidak dapat dibaca sebagai CSV berbasis baris.', copyAction: 'Salin ringkasan', copiedMessage: 'Ringkasan disalin ke papan klip.', copyFailure: 'Penyalinan gagal. Pilih teks ringkasan secara manual.',
9
+ };
10
+ const faq = [
11
+ { question: 'Apa yang diukur Indeks Rice?', answer: 'Untuk satu kelompok dan satu suara, indeks ini adalah selisih absolut suara ya dan tidak dibagi jumlahnya. Nilainya dari nol untuk pembagian seimbang sampai satu untuk suara biner bulat.' },
12
+ { question: 'Apakah abstain dan tidak hadir dihitung?', answer: 'Tidak. Penyebut biner Rice hanya memakai ya dan tidak. Abstain, tidak hadir, dan nilai tidak dikenal tetap terlihat sebagai sinyal partisipasi, tetapi dikeluarkan dari skor biner.' },
13
+ { question: 'Apakah kesepakatan membuktikan ideologi yang sama?', answer: 'Tidak. Kesepakatan hanya menggambarkan pilihan biner tercatat pada suara yang dapat dibandingkan. Kesepakatan tidak mengidentifikasi ideologi, niat, kolusi, atau sebab-akibat.' },
14
+ { question: 'Mengapa jumlah suara pembanding ditampilkan?', answer: 'Persentase tanpa penyebut dapat menyembunyikan catatan yang hilang. Jumlah pembanding menunjukkan berapa suara bersama yang benar-benar menyumbang pada tingkat kesepakatan.' },
15
+ ];
16
+ const howTo = [
17
+ { name: 'Siapkan satu baris per pilihan', text: 'Buat baris CSV dengan kolom anggota, kelompok, suara, dan pilihan. Gunakan ya, tidak, abstain, tidak hadir, atau tidak diketahui.' },
18
+ { name: 'Muat matriks', text: 'Tempel CSV atau muat contoh, lalu periksa apakah jumlah kelompok dan suara sesuai sumber.' },
19
+ { name: 'Baca kohesi kelompok', text: 'Gunakan pita dan ringkasan Indeks Rice untuk melihat kohesi biner setiap kelompok dan suara.' },
20
+ { name: 'Bandingkan pilihan', text: 'Beralih antara kesepakatan kelompok dan anggota, lalu baca tingkatnya bersama jumlah suara pembanding.' },
21
+ { name: 'Periksa peringatan', text: 'Teliti baris yang dilewati, duplikat, pilihan tidak dikenal, seri, dan sampel kecil sebelum menyimpulkan.' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Menganalisis pemungutan suara terbuka parlemen', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Penganalisis pemungutan suara parlemen', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: 'Menganalisis kohesi kelompok dan kesepakatan berpasangan dari matriks suara parlemen yang transparan.', url: 'https://gamebob.dev/id/analisis-pemungutan-suara-parlemen', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: 'Periksa kohesi dalam pemungutan suara terbuka parlemen', level: 2 },
28
+ { type: 'paragraph', html: 'Pemungutan suara terbuka mencatat siapa yang memilih, tetapi daftar panjang pilihan ya dan tidak tidak langsung menunjukkan apakah sebuah kelompok bergerak bersama. Alat ini mengubah matriks berbasis baris menjadi pita suara visual, ringkasan kelompok, dan hasil kesepakatan berpasangan. Perbedaan pada sumber tetap terlihat sehingga persentase tidak menghapus ketidakhadiran atau pilihan nonbiner.' },
29
+ { type: 'paragraph', html: 'Masukan yang diharapkan adalah tabel dengan satu baris untuk setiap anggota dan suara. Setiap baris berisi anggota, kelompok parlemen, pengenal suara, dan pilihan yang tercatat. Label umum seperti mendukung, menolak, abstain, dan tidak memilih diterima; nilai yang tidak dikenal tetap tidak dikenal, bukan diam-diam diubah.' },
30
+ { type: 'title', text: 'Cara menghitung Indeks Rice', level: 2 },
31
+ { type: 'paragraph', html: 'Untuk satu kelompok dan suara, Indeks Rice adalah |ya dikurangi tidak| dibagi ya ditambah tidak. Suara biner bulat bernilai 1, pembagian sama bernilai 0, dan kelompok tanpa ya maupun tidak tidak memiliki nilai Rice. Ringkasan kelompok adalah rata-rata tanpa bobot dari skor yang tersedia, sehingga data biner yang hilang tidak diubah menjadi nol buatan.' },
32
+ { type: 'table', headers: ['Sinyal', 'Perhitungan', 'Interpretasi'], rows: [['Indeks Rice', '|ya dikurangi tidak| / (ya ditambah tidak)', 'Kohesi biner kelompok dan suara'], ['Rice rata-rata', 'Rata-rata skor yang tersedia', 'Kohesi umum pada suara pembanding'], ['Kesepakatan', 'Pilihan biner sama / suara bersama yang dapat dibandingkan', 'Kebetulan pilihan yang diamati antara dua entitas']] },
33
+ { type: 'title', text: 'Siapkan matriks yang dapat diperiksa', level: 2 },
34
+ { type: 'paragraph', html: 'Gunakan satu pengenal suara yang stabil untuk setiap pemungutan dan pertahankan kategori pilihan asli sampai setelah impor. Jangan ubah tidak hadir menjadi tidak, atau abstain menjadi sel kosong. Keputusan itu mengubah jumlah partisipasi dan kumpulan pengamatan yang dapat dibandingkan.' },
35
+ { type: 'list', items: ['Pastikan setiap baris berasal dari kamar dan periode yang ingin dipelajari.', 'Samakan nama anggota dan kelompok di semua suara, termasuk aksen dan tanda baca.', 'Berikan pengenal berbeda untuk mosi berulang jika itu suara yang terpisah.', 'Periksa pasangan anggota dan suara ganda terhadap catatan asli sebelum menerima baris pertama.', 'Simpan berkas sumber dan teks impor persis di samping interpretasi yang dipublikasikan.'] },
36
+ { type: 'tip', title: 'Persentase membutuhkan penyebut', html: 'Kesepakatan 100% atas dua suara bersama adalah bukti yang berbeda dari 100% atas delapan puluh. Baca jumlah pembanding di samping setiap tingkat dan anggap sampel kecil sebagai alasan mengumpulkan data lebih banyak.' },
37
+ { type: 'title', text: 'Tafsirkan pita tanpa klaim berlebihan', level: 2 },
38
+ { type: 'paragraph', html: 'Pita adalah alat bantu membaca, bukan putusan politik. Tanda biru menunjukkan mayoritas ya, tanda warna karat mayoritas tidak, tanda berbingkai abstain, dan tanda redup tidak hadir atau data tidak dikenal. Skor di samping baris hanya merangkum pilihan biner; jumlah partisipasi menunjukkan apa yang dikeluarkan dari penyebut.' },
39
+ { type: 'paragraph', html: 'Kohesi tinggi dapat muncul dari pilihan bersama, disiplin partai, tawar-menawar koalisi, mosi yang sempit, atau kelompok kecil. Kesepakatan tinggi antar kelompok dapat mencerminkan agenda yang jarang diperdebatkan. Skor rendah dapat berarti perpecahan nyata atau perubahan catatan anggota. Alat ini menjelaskan matriks, bukan memilih penjelasannya.' },
40
+ { type: 'title', text: 'Batas metode dan peringatan data', level: 2 },
41
+ { type: 'paragraph', html: 'Alat ini mengikuti perhitungan biner Rice yang lazim dan aturan transparan untuk kesepakatan berpasangan. Alat ini tidak menyimpulkan ideologi, niat, pelanggaran, atau kewajiban hukum. Periksa definisi resmi pemungutan suara sebelum memperlakukan abstain, tidak hadir, atau nilai tidak dikenal sebagai hal yang sebanding antarparlemen.' },
42
+ { type: 'tip', title: 'Peringatan adalah bagian dari hasil', html: 'Baris yang dilewati, pengenal ganda, pilihan tidak dikenal, suara seri, dan sampel pembanding kecil bukan sekadar pesan kosmetik. Selesaikan atau dokumentasikan sebelum membandingkan periode, kelompok, atau anggota.' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'analisis-pemungutan-suara-parlemen', title: 'Penganalisis pemungutan suara parlemen', description: 'Ukur kohesi kelompok dan kesepakatan berpasangan dari matriks pemungutan suara terbuka, sambil menjaga abstain, ketidakhadiran, penyebut, dan peringatan tetap terlihat.', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: 'Porta alla luce una votazione nominale', dataHelp: 'Incolla una riga per ogni membro e voto. Usa le quattro colonne membro, gruppo, voto e scelta.', csvLabel: 'CSV della votazione nominale', csvHint: 'Colonne obbligatorie: membro, gruppo, voto, scelta. Scelte accettate: sì, no, astensione, assente, sconosciuto.', loadExample: 'Carica esempio', analyzeAction: 'Analizza i voti', clearAction: 'Cancella dati', compareLabel: 'Vista dell\'accordo', groupsOption: 'Gruppi', membersOption: 'Membri', resultHeading: 'Il registro delle votazioni a colpo d\'occhio', emptyResult: 'Incolla una votazione o carica l\'esempio per mostrare il nastro dei voti.', rowsLabel: 'record', groupsLabel: 'gruppi', votesLabel: 'voti', warningsHeading: 'Controlli prima dell\'interpretazione', methodHeading: 'Metodo applicato', methodText: 'L\'indice di Rice per ogni gruppo e voto è la differenza assoluta tra sì e no divisa per sì più no. Astensioni, assenze e valori sconosciuti sono esclusi dal denominatore binario. Le medie dei gruppi sono medie non ponderate dei voti con almeno un sì o un no. L\'accordo confronta le scelte binarie sullo stesso voto e mostra sempre il numero di voti comparabili.', limitsHeading: 'Cosa non fa questo strumento', limitsText: 'Non deduce ideologia, intenzione, disciplina, accordi, condotte scorrette, posizioni politiche o causalità. Non decide se un voto era valido né se un membro fosse legalmente tenuto a partecipare. Voti simili possono avere molte spiegazioni.', edgeHeading: 'Casi limite e avvisi sui dati', edgeText: 'Un voto unanime ottiene 1, ma non dimostra disciplina. I pareggi producono coesione zero e sono indicati separatamente dalle astensioni. I voti mancanti riducono il campione comparabile. Mantieni visibili nei dati originali i cambi di gruppo, gli identificativi duplicati e le scelte sconosciute.', cohesionHeading: 'Nastro della coesione', cohesionHelp: 'Ogni riga è un gruppo. Un segno luminoso è sì, uno scuro è no, uno tratteggiato è un pareggio, uno vuoto è astensione e uno tenue è assenza o dato sconosciuto.', agreementHeading: 'Accordo a coppie', agreementHelp: 'L\'accordo usa solo scelte sì e no comparabili condivise da entrambe le entità. Nella vista dei gruppi, ogni gruppo contribuisce con la propria maggioranza non in parità. Astensioni e non partecipazioni restano fuori da numeratore e denominatore.', groupLabel: 'Gruppo', voteLabel: 'Voto', riceLabel: 'Indice di Rice', comparableLabel: 'Voti comparabili', participationLabel: 'Scelte registrate', abstentionsLabel: 'astensioni', absencesLabel: 'assenze', unknownLabel: 'sconosciuti', noComparableData: 'Nessuna scelta sì o no comparabile', noDataWarning: 'Non sono stati trovati record utilizzabili. Aggiungi membro, gruppo, voto e scelta.', malformedRowWarning: 'Alcune righe sono state saltate perché mancava un campo obbligatorio.', duplicateWarning: 'Le coppie membro-voto duplicate sono state conservate una sola volta.', unknownChoiceWarning: 'Alcune scelte sono rimaste sconosciute perché non riconosciute come sì, no, astensione o assenza.', lowSampleWarning: 'Alcuni accordi a coppie hanno meno di due voti comparabili e non vanno trattati come schemi stabili.', tieWarning: 'La parità di un gruppo o di un\'entità è stata esclusa dal confronto tra gruppi per quel voto.', importedMessage: 'Esempio caricato. Puoi modificare le righe prima di analizzare.', invalidCsvMessage: 'I dati non possono essere letti come CSV organizzato per righe.', copyAction: 'Copia riepilogo', copiedMessage: 'Riepilogo copiato negli appunti.', copyFailure: 'Copia non riuscita. Seleziona manualmente il testo del riepilogo.',
9
+ };
10
+ const faq = [
11
+ { question: 'Cosa misura l\'indice di Rice?', answer: 'Per un gruppo e un voto è la differenza assoluta tra voti sì e no divisa per la loro somma. Va da zero per una divisione equa a uno per un voto binario unanime.' },
12
+ { question: 'Astensioni e assenze sono incluse?', answer: 'No. Il denominatore binario di Rice usa solo sì e no. Astensioni, assenze e valori sconosciuti restano visibili come segnali di partecipazione, ma sono esclusi dal punteggio binario.' },
13
+ { question: 'L\'accordo dimostra un\'ideologia condivisa?', answer: 'No. Descrive solo le scelte binarie registrate nei voti comparabili. Non identifica ideologia, intenzione, accordi o causalità.' },
14
+ { question: 'Perché vengono mostrati i voti comparabili?', answer: 'Una percentuale senza denominatore può nascondere dati mancanti. Il conteggio indica quanti voti condivisi hanno contribuito davvero al tasso di accordo.' },
15
+ ];
16
+ const howTo = [
17
+ { name: 'Prepara una riga per scelta', text: 'Crea righe CSV con le colonne membro, gruppo, voto e scelta. Usa sì, no, astensione, assente o sconosciuto.' },
18
+ { name: 'Carica la matrice', text: 'Incolla il CSV o carica l\'esempio, poi controlla che i conteggi di gruppi e voti corrispondano alla fonte.' },
19
+ { name: 'Leggi la coesione', text: 'Usa il nastro e il riepilogo dell\'indice di Rice per esaminare la coesione binaria di ogni gruppo e voto.' },
20
+ { name: 'Confronta le scelte', text: 'Passa dall\'accordo tra gruppi a quello tra membri e leggi ogni tasso insieme al numero di voti comparabili.' },
21
+ { name: 'Controlla gli avvisi', text: 'Esamina righe saltate, duplicati, scelte sconosciute, pareggi e piccoli campioni prima di trarre conclusioni.' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Analizzare votazioni nominali parlamentari', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Analizzatore di votazioni parlamentari', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: 'Analizza coesione e accordo a coppie delle votazioni nominali parlamentari da una matrice trasparente.', url: 'https://gamebob.dev/it/analizzatore-votazioni-parlamentari', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: 'Esamina la coesione di una votazione nominale parlamentare', level: 2 },
28
+ { type: 'paragraph', html: 'Una votazione nominale registra chi ha votato, ma una lunga lista di sì e no non mostra subito se un gruppo ha agito insieme. Questo analizzatore trasforma una matrice a righe in un nastro visivo, riepiloghi per gruppo e accordi a coppie. Mantiene le differenze della fonte affinché una percentuale ordinata non nasconda assenze o scelte non binarie.' },
29
+ { type: 'paragraph', html: 'L\'input previsto è una tabella con una riga per ogni membro e voto. Ogni riga contiene membro, gruppo parlamentare, identificativo del voto e scelta registrata. Sono accettate etichette comuni come favorevole, contrario, astensione e non ha votato; un valore non riconosciuto resta sconosciuto invece di essere ricodificato in silenzio.' },
30
+ { type: 'title', text: 'Come si calcola l\'indice di Rice', level: 2 },
31
+ { type: 'paragraph', html: 'Per un gruppo e un voto, l\'indice di Rice è |sì meno no| diviso per sì più no. Un voto binario unanime vale 1, una divisione esatta vale 0 e un gruppo senza sì né no non ha un valore di Rice. Il riepilogo è la media non ponderata dei valori disponibili: i dati binari mancanti non diventano zeri inventati.' },
32
+ { type: 'table', headers: ['Segnale', 'Calcolo', 'Interpretazione'], rows: [['Indice di Rice', '|sì meno no| / (sì più no)', 'Coesione binaria di gruppo e voto'], ['Rice medio', 'Media dei valori disponibili', 'Coesione tipica dei voti comparabili'], ['Accordo', 'Scelte binarie uguali / voti condivisi comparabili', 'Coincidenza osservata tra due entità']] },
33
+ { type: 'title', text: 'Prepara una matrice verificabile', level: 2 },
34
+ { type: 'paragraph', html: 'Usa un identificativo stabile per ogni voto e conserva le categorie originali fino all\'importazione. Non trasformare un\'assenza in no né un\'astensione in una cella vuota: queste scelte cambiano i conteggi di partecipazione e l\'insieme delle osservazioni confrontabili.' },
35
+ { type: 'list', items: ['Controlla che ogni riga appartenga alla camera e al periodo che vuoi studiare.', 'Mantieni coerenti i nomi di membri e gruppi, inclusi accenti e punteggiatura.', 'Assegna identificativi diversi a mozioni ripetute quando sono votazioni separate.', 'Verifica le coppie membro-voto duplicate con il documento originale prima di tenere la prima riga.', 'Conserva il file sorgente e il testo importato accanto a ogni interpretazione pubblicata.'] },
36
+ { type: 'tip', title: 'Una percentuale ha bisogno del denominatore', html: 'Un accordo a coppie del 100% su due voti condivisi è un\'evidenza diversa dal 100% su ottanta. Leggi il conteggio comparabile accanto a ogni tasso e tratta un campione piccolo come motivo per raccogliere altri dati.' },
37
+ { type: 'title', text: 'Leggi il nastro senza sovrainterpretare', level: 2 },
38
+ { type: 'paragraph', html: 'Il nastro è un aiuto alla lettura, non un verdetto politico. I segni blu rappresentano la maggioranza di sì del gruppo, quelli ruggine la maggioranza di no, i contorni un\'astensione e i segni tenui un\'assenza o un dato sconosciuto. Il punteggio riassume solo le scelte binarie; i conteggi di partecipazione mostrano cosa è rimasto fuori dal denominatore.' },
39
+ { type: 'paragraph', html: 'Una coesione alta può derivare da preferenze condivise, disciplina di partito, trattativa di coalizione, una mozione circoscritta o un gruppo piccolo. Un accordo alto tra gruppi può riflettere un\'agenda con poco dissenso. Un punteggio basso può indicare una divisione reale o dati di appartenenza variabili. L\'analizzatore descrive la matrice e non sceglie tra queste spiegazioni.' },
40
+ { type: 'title', text: 'Limiti del metodo e avvisi sui dati', level: 2 },
41
+ { type: 'paragraph', html: 'Lo strumento applica il calcolo binario convenzionale di Rice e una regola trasparente per l\'accordo a coppie. Non deduce ideologia, intenzione, condotte scorrette o obblighi legali. Consulta le definizioni ufficiali delle votazioni prima di confrontare astensione, assenza o valore sconosciuto tra parlamenti.' },
42
+ { type: 'tip', title: 'Gli avvisi fanno parte del risultato', html: 'Righe saltate, identificativi duplicati, scelte sconosciute, pareggi e piccoli campioni comparabili non sono avvisi cosmetici. Risolvili o documentali prima di confrontare periodi, gruppi o membri.' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'analizzatore-votazioni-parlamentari', title: 'Analizzatore di votazioni parlamentari', description: 'Misura la coesione dei gruppi e l\'accordo a coppie da una matrice di votazioni nominali, mantenendo visibili astensioni, assenze, denominatori e avvisi.', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: '記名投票を見える化する', dataHelp: '議員と投票ごと"1行を貼り"けます。member、group、vote、choiceの4列を使ってください。', csvLabel: '記名投票CSV', csvHint: '必須列: member、group、vote、choice。利用できる選択肢: yes、no、abstain、absent、unknown。', loadExample: '例を読み込む', analyzeAction: '投票を分析', clearAction: 'データを消"', compareLabel: '一致度の表示', groupsOption: '会派', membersOption: '議員', resultHeading: '投票記録の全体像', emptyResult: '投票データを貼り"けるか例を読み込むと、投票リボンが表示されます。', rowsLabel: '"', groupsLabel: '会派', votesLabel: '投票', warningsHeading: '解釈前の確認', methodHeading: '適用した方法', methodText: '各会派"各投票のRice指数は、yesとnoの差の絶対値をyesとnoの合計で割ったものです。abstain、absent、unknownは二値の分母から除外します。会派平均は、yesまたはnoが1つ"上ある投票の単純平均です。一致度は同じ投票の二値選択を比較し、比較可能な投票数を常"表示します。', limitsHeading: 'このツー"で分からないこと', limitsText: 'イデオロギー、意図、党議拘束、共謀、不正、政策上の"場、因果関係は推定しません。投票の有効性や議員の法的な出席義務も判定しません。同じ投票行動"は複数の理由があり得ます。', edgeHeading: '境界事例とデータ警告', edgeText: '全会一致は1"なりますが、規律の証明ではありません。割れた投票は結束度0となり、棄権とは別"表示されます。欠測は比較可能な標本を減らします。会派変更、重複ID、未知の選択肢は元データ"残してください。', cohesionHeading: '結束リボン', cohesionHelp: '各行は会派です。明るい印はyes、暗い印はno、破線は同数、空洞はabstain、淡い印はabsentまたはunknownを表します。', agreementHeading: '議員"会派間の一致度', agreementHelp: '一致度は双方で比較できるyesとnoだけを使います。会派表示では、各会派の同数でない多数決を用います。abstainと無投票は分子"分母"入りません。', groupLabel: '会派', voteLabel: '投票', riceLabel: 'Rice指数', comparableLabel: '比較可能な投票', participationLabel: '記録された選択', abstentionsLabel: '棄権', absencesLabel: '欠席', unknownLabel: '不明', noComparableData: '比較できるyes/noがありません', noDataWarning: '利用できる記録がありません。member、group、vote、choiceを追加してください。', malformedRowWarning: '必須項目が空のため、一部の行をスキップしました。', duplicateWarning: '同じ議員と投票の組み合わせは1"だけ残しました。', unknownChoiceWarning: 'yes、no、abstain、absentとして認識できない選択肢はunknownとして保持しました。', lowSampleWarning: '比較可能な投票が2"未満の一致度があり、安定した傾向とはみなせません。', tieWarning: 'この投票では会派または対象の同数結果を会派比較から除外しました。', importedMessage: '例を読み込みました。分析前"行を編集できます。', invalidCsvMessage: '行形式のCSVとしてデータを読み取れませんでした。', copyAction: '概要をコピー', copiedMessage: '概要をクリップボード"コピーしました。', copyFailure: 'コピーできませんでした。概要の文字列を手動で選択してください。',
9
+ };
10
+ const faq = [
11
+ { question: 'Rice指数は何を測りますか?', answer: '1つの会派と1つの投票"ついて、yesとnoの差の絶対値を合計で割った値です。均等な分割では0、二値投票の全会一致では1"なります。' },
12
+ { question: '棄権と欠席は"まれますか?', answer: '"まれません。二値のRice分母はyesとnoだけを使います。棄権、欠席、不明値は参加状況として表示されますが、二値スコアから除外されます。' },
13
+ { question: '一致度は共通のイデオロギーを証明しますか?', answer: '証明しません。一致度が示すのは比較できる投票で記録された二値選択だけです。イデオロギー、意図、共謀、因果関係は特定しません。' },
14
+ { question: 'なぜ比較可能な投票数を表示しますか?', answer: '分母のない割合は欠測を隠すことがあります。この数は一致度"実際"寄与した共有投票の数を示します。' },
15
+ ];
16
+ const howTo = [
17
+ { name: '選択肢ごと"1行を用意する', text: 'member、group、vote、choice列のCSVを作り、yes、no、abstain、absent、unknownを使います。' },
18
+ { name: 'マトリクスを読み込む', text: 'CSVを貼り"けるか例を読み込み、会派数と投票数が元資料と一致するか確認します。' },
19
+ { name: '会派の結束を読む', text: 'リボンとRice指数の概要で、各会派"各投票の二値結束を確認します。' },
20
+ { name: '選択を比較する', text: '会派と議員の表示を切り替え、割合を比較可能な投票数と一緒"読みます。' },
21
+ { name: '警告を確認する', text: 'スキップ行、重複、未知の選択肢、同数、少ない標本を調べてから結"を出します。' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: '国会の記名投票を分析する', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: '国会投票分析ツー"', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: '透明な投票マトリクスから国会の会派結束度とペア一致度を分析します。', url: 'https://gamebob.dev/ja/parliamentary-voting-analyzer', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: '国会の記名投票"おける会派の結束を調べる', level: 2 },
28
+ { type: 'paragraph', html: '記名投票は誰が投票したかを記録しますが、yesとnoの長い一覧だけでは会派がまとまって行動したか分かりません。この分析ツー"は行形式のマトリクスを投票リボン、会派別の概要、ペア一致度"変換します。欠席や二値でない選択肢を消さず、割合の意味を確認できます。' },
29
+ { type: 'paragraph', html: '入力は議員と投票ごと"1行ある表です。議員名、会派、投票ID、記録された選択肢を各行"入れます。一般的な表記は認識されますが、未知の値は勝手"再分類せずunknownとして残ります。' },
30
+ { type: 'title', text: 'Rice指数の計算方法', level: 2 },
31
+ { type: 'paragraph', html: '1つの会派と投票のRice指数は、|yes−no|をyes+noで割った値です。全会一致の二値投票は1、均等な分割は0、yesもnoもなければ値なしです。会派概要は利用可能な投票値の単純平均であり、欠測をゼロ"はしません。' },
32
+ { type: 'table', headers: ['指標', '計算', '意味'], rows: [['Rice指数', '|yes−no| / (yes+no)', '会派と投票の二値結束'], ['平均Rice', '利用可能な投票値の平均', '比較できる投票での典型的な結束'], ['一致度', '一致した二値選択 / 共有比較投票', '2つの対象で観察された一致']] },
33
+ { type: 'title', text: '検証できるマトリクスを準備する', level: 2 },
34
+ { type: 'paragraph', html: '各投票"は安定したIDを使い、インポート後まで元の選択肢を保ちます。欠席をno"、棄権を空欄"変えないでください。参加数と比較対象の集合が変わってしまいます。' },
35
+ { type: 'list', items: ['調べたい議院と期間の行だけであることを確認する。', '議員名と会派名を投票間で統一する。', '別の記名投票"は別のIDを"ける。', '議員"投票の重複を元資料と照合する。', '元ファイ"とインポート文字列を解釈と一緒"保存する。'] },
36
+ { type: 'tip', title: '割合"は分母が必要', html: '2票での一致度100%と80票での100%は同じ証拠ではありません。各割合の隣"ある比較可能数を読み、少標本なら追加データを集めてください。' },
37
+ { type: 'title', text: 'リボンを過大解釈しない', level: 2 },
38
+ { type: 'paragraph', html: 'リボンは読み取りを助けるもので、政"的な判定ではありません。青はyes多数、錆色はno多数、枠線は棄権、淡い印は欠席または不明を示します。スコアは二値選択だけを要約し、参加数は分母から外れたものを示します。' },
39
+ { type: 'paragraph', html: '"い結束は共有する選好、党議拘束、連"交渉、狭い議案、少人数などから生じます。低いスコアは本当の分裂や会派構成の変化を示すかもしれません。ツー"はマトリクスを記述しますが、理由を決めません。' },
40
+ { type: 'title', text: '方法の限界とデータ警告', level: 2 },
41
+ { type: 'paragraph', html: 'このツー"は一般的な二値Rice計算と透明なペア一致"ー"を使います。イデオロギー、意図、不正、法的義務は推定しません。議会間で比較する前"、公式の投票定義を確認してください。' },
42
+ { type: 'tip', title: '警告も結果の一部', html: 'スキップ行、重複ID、未知の選択肢、同数、少ない比較標本は飾りではありません。期間や会派を比べる前"解決または記録してください。' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'parliamentary-voting-analyzer', title: '国会投票分析ツー"', description: '記名投票マトリクスから会派の結束と議員"会派間の一致度を測定し、棄権、欠席、分母、警告を見える形で保持します。', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: '기명 투표를 한눈에 보기', dataHelp: '의원과 투표마다 한 줄씩 붙여 넣으세요. member, group, vote, choice 네 열을 사용합니다.', csvLabel: '기명 투표 CSV', csvHint: '필수 열: member, group, vote, choice. 허용 값: yes, no, abstain, absent, unknown.', loadExample: '예시 불러오기', analyzeAction: '투표 분석', clearAction: '데이터 지우기', compareLabel: '일치도 보기', groupsOption: '교섭단체', membersOption: '의원', resultHeading: '투표 기록 요약', emptyResult: '투표를 붙여 넣거나 예시를 불러오면 투표 리본이 표시됩니다.', rowsLabel: '기록', groupsLabel: '그룹', votesLabel: '투표', warningsHeading: '해석 전 확인', methodHeading: '적용한 방법', methodText: '각 그룹과 투표의 Rice 지수는 yes와 no의 차이 절댓값을 yes와 no의 합으로 나눈 값입니다. abstain, absent, unknown은 이 이진 분모에서 제외합니다. 그룹 평균은 yes 또는 no가 하나 이상 있는 투표의 비가중 평균입니다. 일치도는 같은 투표의 이진 선택을 비교하며 비교 가능한 투표 수를 항상 표시합니다.', limitsHeading: '이 도구가 하지 않는 일', limitsText: '이념, 의도, 당론, 공모, 위법 행위, 정책 입장 또는 인과관계를 추론하지 않습니다. 투표의 유효성이나 의원의 법적 출석 의무도 판정하지 않습니다. 같은 투표 결과에는 여러 설명이 있을 수 있습니다.', edgeHeading: '경계 사례와 데이터 경고', edgeText: '만장일치 투표는 1이지만 당론의 증거는 아닙니다. 동률은 응집도 0으로 계산되며 기권과 따로 표시됩니다. 누락된 투표는 비교 표본을 줄입니다. 그룹 변경, 중복 식별자, 알 수 없는 선택을 원자료에 남겨 두세요.', cohesionHeading: '응집도 리본', cohesionHelp: '각 행은 그룹입니다. 밝은 표시는 yes, 어두운 표시는 no, 점선은 동률, 빈 표시는 abstain, 옅은 표시는 absent 또는 unknown을 "합니다.', agreementHeading: '쌍별 일치도', agreementHelp: '일치도는 양쪽에서 비교할 수 있는 yes와 no만 사용합니다. 그룹 보기에서는 동률이 아닌 다수 선택을 사용합니다. abstain과 불참은 분자와 분모에서 제외됩니다.', groupLabel: '그룹', voteLabel: '투표', riceLabel: 'Rice 지수', comparableLabel: '비교 가능한 투표', participationLabel: '기록된 선택', abstentionsLabel: '기권', absencesLabel: '불참', unknownLabel: '알 수 없음', noComparableData: '비교 가능한 yes/no 선택이 없습니다', noDataWarning: '사용할 수 있는 기록이 없습니다. member, group, vote, choice 값을 추가하세요.', malformedRowWarning: '필수 항목이 비어 있어 일부 행을 건너뛰었습니다.', duplicateWarning: '동일한 의원과 투표 조합은 한 번만 유지했습니다.', unknownChoiceWarning: 'yes, no, abstain, absent로 인식되지 않은 선택은 unknown으로 유지했습니다.', lowSampleWarning: '두 개 미만의 비교 가능한 투표만 가진 쌍별 결과가 있어 안정적인 패턴으로 볼 수 없습니다.', tieWarning: '해당 투표의 그룹 또는 대상 동률은 그룹 수준 비교에서 제외했습니다.', importedMessage: '예시를 불러왔습니다. 분석 전에 행을 수정할 수 있습니다.', invalidCsvMessage: '행 기반 CSV로 데이터를 읽을 수 없습니다.', copyAction: '요약 복사', copiedMessage: '요약을 클립보드에 복사했습니다.', copyFailure: '복사하지 "했습니다. 요약 텍스트를 직접 선택하세요.',
9
+ };
10
+ const faq = [
11
+ { question: 'Rice 지수는 무엇을 측정하나요?', answer: '한 그룹과 한 투표에서 yes와 no의 차이 절댓값을 합으로 나눈 값입니다. 균등 분할은 0, 이진 투표의 만장일치는 1입니다.' },
12
+ { question: '기권과 불참도 포함되나요?', answer: '아니요. 이진 Rice 분모에는 yes와 no만 들어갑니다. 기권, 불참, 알 수 없는 값은 참여 신호로 보이지만 이진 점수에서는 제외됩니다.' },
13
+ { question: '일치도가 같은 이념을 증명하나요?', answer: '아니요. 비교 가능한 투표에서 기록된 이진 선택만 설명합니다. 이념, 의도, 공모 또는 인과관계를 판별하지 않습니다.' },
14
+ { question: '비교 가능한 투표 수를 왜 표시하나요?', answer: '분모 없는 백분율은 누락된 기록을 숨길 수 있습니다. 이 수는 일치도에 실제로 기여한 공동 투표의 개수입니다.' },
15
+ ];
16
+ const howTo = [
17
+ { name: '선택마다 한 행 준비', text: 'member, group, vote, choice 열을 가진 CSV를 만들고 yes, no, abstain, absent, unknown을 사용합니다.' },
18
+ { name: '행렬 불러오기', text: 'CSV를 붙여 넣거나 예시를 불러온 다음 그룹 수와 투표 수가 원자료와 맞는지 확인합니다.' },
19
+ { name: '그룹 응집도 읽기', text: '리본과 Rice 지수 요약으로 각 그룹과 투표의 이진 응집도를 확인합니다.' },
20
+ { name: '선택 비교', text: '그룹과 의원 일치도 사이를 전환하고 각 비율을 비교 가능한 투표 수와 함" 읽습니다.' },
21
+ { name: '경고 검토', text: '건너뛴 행, 중복, 알 수 없는 선택, 동률, 작은 표본을 살핀 뒤 결론을 내립니다.' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: '국회 기명 투표 분석하기', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: '국회 투표 분석기', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: '투명한 투표 행렬로 국회 그룹의 응집도와 쌍별 일치도를 분석합니다.', url: 'https://gamebob.dev/ko/parliamentary-voting-analyzer', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: '국회 기명 투표에서 그룹 응집도 살펴보기', level: 2 },
28
+ { type: 'paragraph', html: '기명 투표는 누가 투표했는지 기록하지만, yes와 no의 긴 목록만으로는 그룹이 함" 움직였는지 바로 알기 어렵습니다. 이 분석기는 행 기반 행렬을 시각적 투표 리본, 그룹 요약, 쌍별 일치도 결과로 바꿉니다. 결석과 비이진 선택을 그대로 남겨 백분율의 의미를 확인하게 합니다.' },
29
+ { type: 'paragraph', html: '입력은 의원과 투표마다 한 행이 있는 표입니다. 각 행에 의원, 의회 그룹, 투표 식별자, 기록된 선택을 넣습니다. 익숙한 표현은 인식되며 알 수 없는 값은 조용히 재분류하지 않고 unknown으로 보존됩니다.' },
30
+ { type: 'title', text: 'Rice 지수 계산 방법', level: 2 },
31
+ { type: 'paragraph', html: '한 그룹과 한 투표의 Rice 지수는 |yes−no|를 yes+no로 나눈 값입니다. 만장일치 이진 투표는 1, 균등 분할은 0, yes와 no가 모두 없으면 값이 없습니다. 그룹 요약은 가능한 투표 점수의 단순 평균이며 누락을 0으로 만들지 않습니다.' },
32
+ { type: 'table', headers: ['신호', '계산', '해석'], rows: [['Rice 지수', '|yes−no| / (yes+no)', '그룹과 투표의 이진 응집도'], ['평균 Rice', '가능한 투표 점수의 평균', '비교 가능한 투표에서의 전형적 응집도'], ['일치도', '같은 이진 선택 / 비교 가능한 공동 투표', '두 대상 사이에서 관찰된 일치']] },
33
+ { type: 'title', text: '검증할 수 있는 행렬 준비', level: 2 },
34
+ { type: 'paragraph', html: '각 투표에 안정적인 식별자를 사용하고 원래 선택 범주를 가져온 뒤까지 유지합니다. 불참을 no로, 기권을 빈칸으로 바꾸지 마세요. 참여 수와 비교할 관측 집합이 달라집니다.' },
35
+ { type: 'list', items: ['모든 행이 조사하려는 의회와 기간에 속하는지 확인합니다.', '악센트와 문장 부호를 포함해 의원 및 그룹 이름을 일관되게 씁니다.', '반복된 안건이 별도 투표라면 서로 다른 식별자를 부여합니다.', '중복된 의원-투표 쌍을 원자료와 대조합니다.', '원본 파일과 가져온 텍스트를 해석 결과와 함" 보관합니다.'] },
36
+ { type: 'tip', title: '백분율에는 분모가 필요합니다', html: '공동 투표 2건에서 일치도 100%인 것과 80건에서 100%인 것은 다른 증거입니다. 각 비율 옆의 비교 수를 읽고 표본이 작으면 자료를 더 모으세요.' },
37
+ { type: 'title', text: '리본을 과도하게 해석하지 않기', level: 2 },
38
+ { type: 'paragraph', html: '리본은 읽기 도구이지 정치적 판정이 아닙니다. 파란 표시는 yes 다수, 녹슨 색은 no 다수, 윤곽은 기권, 옅은 표시는 불참 또는 알 수 없는 자료를 "합니다. 점수는 이진 선택만 요약하고 참여 수는 분모에서 빠진 항목을 보여 줍니다.' },
39
+ { type: 'paragraph', html: '높은 응집도는 공동 선호, 당론, 연정 협상, 좁게 정의된 안건, 소규모 그룹에서 비롯될 수 있습니다. 낮은 점수는 실제 분열이나 구성원 기록의 변화를 "할 수 있습니다. 분석기는 행렬을 설명할 뿐 이유를 선택하지 않습니다.' },
40
+ { type: 'title', text: '방법의 한계와 데이터 경고', level: 2 },
41
+ { type: 'paragraph', html: '이 도구는 일반적인 이진 Rice 계산과 투명한 쌍별 일치 규칙을 사용합니다. 이념, 의도, 위법 행위 또는 법적 의무를 추론하지 않습니다. 의회 간 비교 전에는 공식 투표 정의를 확인하세요.' },
42
+ { type: 'tip', title: '경고도 결과의 일부입니다', html: '건너뛴 행, 중복 식별자, 알 수 없는 선택, 동률, 작은 비교 표본은 장식이 아닙니다. 기간, 그룹, 의원을 비교하기 전에 해결하거나 기록하세요.' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'parliamentary-voting-analyzer', title: '국회 투표 분석기', description: '기명 투표 행렬에서 그룹 응집도와 쌍별 투표 일치도를 측정하고 기권, 불참, 분모, 경고를 투명하게 표시합니다.', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: 'Breng een hoofdelijke stemming in beeld', dataHelp: 'Plak één regel per lid en stemming. Gebruik de vier kolommen lid, groep, stemming en keuze.', csvLabel: 'CSV van hoofdelijke stemming', csvHint: 'Verplichte kolommen: lid, groep, stemming, keuze. Toegestaan: ja, nee, onthouding, afwezig, onbekend.', loadExample: 'Voorbeeld laden', analyzeAction: 'Stemmen analyseren', clearAction: 'Gegevens wissen', compareLabel: 'Overeenstemmingsweergave', groupsOption: 'Groepen', membersOption: 'Leden', resultHeading: 'Het stemregister in één oogopslag', emptyResult: 'Plak een stemming of laad het voorbeeld om de stemmingsband te tonen.', rowsLabel: 'records', groupsLabel: 'groepen', votesLabel: 'stemmingen', warningsHeading: 'Controles vóór interpretatie', methodHeading: 'Toegepaste methode', methodText: 'De Rice-index voor elke groep en stemming is het absolute verschil tussen ja en nee, gedeeld door ja plus nee. Onthoudingen, afwezigheid en onbekende waarden worden uitgesloten van die binaire noemer. Groepsgemiddelden zijn ongewogen gemiddelden van stemmingen met minstens één ja of nee. Overeenstemming vergelijkt binaire keuzes bij dezelfde stemming en toont altijd het aantal vergelijkbare stemmingen.', limitsHeading: 'Wat deze tool niet doet', limitsText: 'De tool leidt geen ideologie, intentie, discipline, samenspanning, wangedrag, politieke standpunten of causaliteit af. Hij bepaalt ook niet of een stemming geldig was of een lid wettelijk aanwezig moest zijn. Gelijk stemgedrag kan veel verklaringen hebben.', edgeHeading: 'Randgevallen en datameldingen', edgeText: 'Unanieme stemmingen krijgen score 1, maar dat bewijst geen discipline. Gelijkstanden geven nul cohesie en worden apart van onthoudingen gemarkeerd. Ontbrekende stemmen verkleinen de vergelijkbare steekproef. Houd veranderende groepslidmaatschappen, dubbele identificaties en onbekende keuzes zichtbaar in de brondata.', cohesionHeading: 'Cohesieband', cohesionHelp: 'Elke rij is een groep. Een heldere markering is ja, een donkere nee, een gestreepte een gelijkstand, een open een onthouding en een stille een afwezigheid of onbekende data.', agreementHeading: 'Overeenstemming per paar', agreementHelp: 'Overeenstemming gebruikt alleen vergelijkbare ja- en nee-keuzes die beide entiteiten delen. In de groepsweergave levert elke groep zijn niet-gelijkstaande meerderheidskeuze aan. Onthoudingen en niet-stemmen blijven buiten teller en noemer.', groupLabel: 'Groep', voteLabel: 'Stemming', riceLabel: 'Rice-index', comparableLabel: 'Vergelijkbare stemmingen', participationLabel: 'Geregistreerde keuzes', abstentionsLabel: 'onthoudingen', absencesLabel: 'afwezig', unknownLabel: 'onbekend', noComparableData: 'Geen vergelijkbare ja- of nee-keuzes', noDataWarning: 'Geen bruikbare records gevonden. Voeg lid, groep, stemming en keuze toe.', malformedRowWarning: 'Sommige rijen zijn overgeslagen omdat een verplicht veld leeg was.', duplicateWarning: 'Dubbele combinaties van lid en stemming zijn slechts één keer behouden.', unknownChoiceWarning: 'Sommige keuzes bleven onbekend omdat ze niet als ja, nee, onthouding of afwezigheid werden herkend.', lowSampleWarning: 'Sommige paarvergelijkingen hebben minder dan twee vergelijkbare stemmingen en zijn geen stabiele patronen.', tieWarning: 'Een gelijkstand van groep of entiteit is voor deze stemming uitgesloten van de groepsvergelijking.', importedMessage: 'Voorbeeld geladen. Je kunt de rijen vóór de analyse bewerken.', invalidCsvMessage: 'De gegevens konden niet als rijgebaseerde CSV worden gelezen.', copyAction: 'Samenvatting kopi"ren', copiedMessage: 'Samenvatting naar het klembord gekopieerd.', copyFailure: 'Kopi"ren mislukt. Selecteer de samenvatting handmatig.',
9
+ };
10
+ const faq = [
11
+ { question: 'Wat meet de Rice-index?', answer: 'Voor één groep en stemming is dit het absolute verschil tussen ja- en nee-stemmen, gedeeld door hun som. De waarde loopt van nul bij een gelijke verdeling tot één bij een unanieme binaire stemming.' },
12
+ { question: 'Tellen onthoudingen en afwezigheid mee?', answer: 'Nee. De binaire Rice-noemer gebruikt alleen ja en nee. Onthoudingen, afwezigheid en onbekende waarden blijven zichtbaar als deelnamesignalen, maar worden uitgesloten van de binaire score.' },
13
+ { question: 'Bewijst overeenstemming een gedeelde ideologie?', answer: 'Nee. Het beschrijft alleen geregistreerde binaire keuzes bij vergelijkbare stemmingen. Het identificeert geen ideologie, intentie, samenspanning of oorzaak.' },
14
+ { question: 'Waarom toont de tool vergelijkbare aantallen?', answer: 'Een percentage zonder noemer kan ontbrekende records verbergen. Het vergelijkbare aantal toont hoeveel gedeelde stemmingen werkelijk aan het overeenstemmingspercentage bijdroegen.' },
15
+ ];
16
+ const howTo = [
17
+ { name: 'Bereid één regel per keuze voor', text: 'Maak CSV-regels met de kolommen lid, groep, stemming en keuze. Gebruik ja, nee, onthouding, afwezig of onbekend.' },
18
+ { name: 'Laad de matrix', text: 'Plak de CSV of laad het voorbeeld en controleer of de aantallen groepen en stemmingen met de bron kloppen.' },
19
+ { name: 'Lees groepscohesie', text: 'Gebruik de band en de Rice-samenvatting om binaire cohesie per groep en stemming te bekijken.' },
20
+ { name: 'Vergelijk keuzes', text: 'Wissel tussen groep- en ledenovereenstemming en lees elk percentage naast het vergelijkbare aantal stemmingen.' },
21
+ { name: 'Controleer waarschuwingen', text: 'Onderzoek overgeslagen regels, duplicaten, onbekende keuzes, gelijkstanden en kleine steekproeven.' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Parlementaire hoofdelijke stemmingen analyseren', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Analyse van parlementaire stemmingen', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: 'Analyseer groepscohesie en overeenstemming per paar in parlementaire hoofdelijke stemmingen met een transparante matrix.', url: 'https://gamebob.dev/nl/analyse-parlementaire-stemmingen', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: 'Onderzoek cohesie in een parlementaire hoofdelijke stemming', level: 2 },
28
+ { type: 'paragraph', html: 'Een hoofdelijke stemming legt vast wie stemde, maar een lange lijst ja- en nee-keuzes laat niet meteen zien of een groep eensgezind handelde. Deze analyse maakt van een matrix per rij een visuele stemmingsband, groepssamenvattingen en overeenstemming per paar. De verschillen in de bron blijven zichtbaar, zodat een net percentage ontbrekende of niet-binaire keuzes niet verbergt.' },
29
+ { type: 'paragraph', html: 'De invoer is een tabel met één regel per lid en stemming. Elke regel bevat lid, parlementaire groep, stemmingscode en geregistreerde keuze. Veelgebruikte labels zoals voor, tegen, onthouding en niet gestemd worden herkend; onbekende waarden blijven onbekend in plaats van stilzwijgend te worden omgezet.' },
30
+ { type: 'title', text: 'Zo wordt de Rice-index berekend', level: 2 },
31
+ { type: 'paragraph', html: 'Voor één groep en stemming is de Rice-index |ja min nee| gedeeld door ja plus nee. Een unanieme binaire stemming is 1, een gelijke verdeling 0 en een groep zonder ja of nee heeft geen Rice-waarde. Het groepsresultaat is het ongewogen gemiddelde van beschikbare scores; ontbrekende binaire keuzes worden geen verzonnen nullen.' },
32
+ { type: 'table', headers: ['Signaal', 'Berekening', 'Interpretatie'], rows: [['Rice-index', '|ja min nee| / (ja plus nee)', 'Binaire cohesie van groep en stemming'], ['Gemiddelde Rice', 'Gemiddelde van beschikbare scores', 'Typische cohesie bij vergelijkbare stemmingen'], ['Overeenstemming', 'Gelijke binaire keuzes / vergelijkbare gedeelde stemmingen', 'Waargenomen overeenkomst tussen twee entiteiten']] },
33
+ { type: 'title', text: 'Bereid een controleerbare matrix voor', level: 2 },
34
+ { type: 'paragraph', html: 'Gebruik voor elke stemming één stabiele code en behoud de oorspronkelijke keuze-categorie"n tot na het importeren. Maak van afwezigheid geen nee en van onthouding geen lege cel. Zulke beslissingen veranderen deelnametellingen en de vergelijkbare waarnemingen.' },
35
+ { type: 'list', items: ['Controleer dat elke regel bij dezelfde kamer en periode hoort.', 'Houd namen van leden en groepen gelijk, inclusief accenten en leestekens.', 'Geef afzonderlijke moties afzonderlijke codes als het aparte stemmingen zijn.', 'Controleer dubbele combinaties van lid en stemming tegen het origineel.', 'Bewaar bronbestand en exacte import naast elke gepubliceerde interpretatie.'] },
36
+ { type: 'tip', title: 'Een percentage heeft een noemer nodig', html: '100% overeenstemming over twee gedeelde stemmingen is andere informatie dan 100% over tachtig. Lees het vergelijkbare aantal naast elk percentage en zie een kleine steekproef als reden om meer gegevens te verzamelen.' },
37
+ { type: 'title', text: 'Lees de band zonder te veel te claimen', level: 2 },
38
+ { type: 'paragraph', html: 'De band helpt bij het lezen, maar is geen politiek oordeel. Blauwe markeringen tonen een ja-meerderheid, roestkleurige een nee-meerderheid, omtrekken onthouding en stille markeringen afwezigheid of onbekende data. De score vat alleen binaire keuzes samen; deelnametellingen tonen wat buiten de noemer viel.' },
39
+ { type: 'paragraph', html: 'Hoge cohesie kan ontstaan door gedeelde voorkeuren, partijdiscipline, coalitieonderhandelingen, een smal geformuleerde motie of een kleine groep. Hoge overeenstemming tussen groepen kan een agenda met weinig conflict weerspiegelen. Een lage score kan echte verdeeldheid of veranderende ledengegevens betekenen. De tool beschrijft de matrix en kiest niet tussen verklaringen.' },
40
+ { type: 'title', text: 'Methodische grenzen en datameldingen', level: 2 },
41
+ { type: 'paragraph', html: 'De tool gebruikt de gebruikelijke binaire Rice-berekening en een transparante regel voor overeenstemming per paar. Hij leidt geen ideologie, intentie, wangedrag of wettelijke verplichtingen af. Controleer offici"le definities van stemmingen voordat je onthouding, afwezigheid of onbekend tussen parlementen vergelijkt.' },
42
+ { type: 'tip', title: 'Waarschuwingen horen bij het resultaat', html: 'Overgeslagen regels, dubbele codes, onbekende keuzes, gelijkstanden en kleine vergelijkbare steekproeven zijn geen versiering. Los ze op of documenteer ze voordat je periodes, groepen of leden vergelijkt.' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'analyse-parlementaire-stemmingen', title: 'Analyse van parlementaire stemmingen', description: 'Meet groepscohesie en overeenstemming per paar in een matrix van hoofdelijke stemmingen en houd onthoudingen, afwezigheid, noemers en waarschuwingen zichtbaar.', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: 'Pokaż głosowanie imienne', dataHelp: 'Wklej jeden wiersz na członka i głosowanie. Użyj kolumn member, group, vote i choice.', csvLabel: 'CSV głosowania imiennego', csvHint: 'Wymagane kolumny: member, group, vote, choice. Dozwolone wartości: yes, no, abstain, absent, unknown.', loadExample: 'Wczytaj przykład', analyzeAction: 'Analizuj głosy', clearAction: 'Wyczyść dane', compareLabel: 'Widok zgodności', groupsOption: 'Grupy', membersOption: 'Członkowie', resultHeading: 'Rejestr głosowania w skrócie', emptyResult: 'Wklej głosowanie lub wczytaj przykład, aby zobaczyć wstęgę głosów.', rowsLabel: 'rekordów', groupsLabel: 'grup', votesLabel: 'głosowań', warningsHeading: 'Kontrole przed interpretacją', methodHeading: 'Zastosowana metoda', methodText: 'Indeks Rice\'a dla każdej grupy i głosowania to bezwzględna różnica między yes i no podzielona przez yes plus no. Abstencje, nieobecności i wartości nieznane są wyłączone z tego binarnego mianownika. Średnie grup są nieważonymi średnimi głosowań z co najmniej jednym yes lub no. Zgodność porównuje binarne wybory w tym samym głosowaniu i zawsze pokazuje liczbę porównywalnych głosowań.', limitsHeading: 'Czego to narzędzie nie robi', limitsText: 'Nie wnioskuje ideologii, intencji, dyscypliny, zmowy, wykroczeń, stanowisk politycznych ani związku przyczynowego. Nie rozstrzyga też, czy głosowanie było ważne lub czy członek miał prawny obowiązek obecności. Podobne głosowania mogą mieć wiele wyjaśnień.', edgeHeading: 'Przypadki brzegowe i ostrzeżenia', edgeText: 'Jednomyślne głosowania otrzymują wynik 1, ale nie jest to dowód dyscypliny. Remisy dają zerową spójność i są oznaczone osobno od abstencji. Brakujące głosy zmniejszają próbę porównawczą. Zachowaj w danych źródłowych zmiany grup, zduplikowane identyfikatory i nieznane wybory.', cohesionHeading: 'Wstęga spójności', cohesionHelp: 'Każdy wiersz to grupa. Jasny znak oznacza yes, ciemny no, przerywany remis, pusty abstencję, a delikatny nieobecność lub nieznane dane.', agreementHeading: 'Zgodność parami', agreementHelp: 'Zgodność używa tylko porównywalnych wyborów yes i no wspólnych dla obu jednostek. W widoku grup każda grupa wnosi swoją nieremisową większość. Abstencje i brak głosu nie trafiają do licznika ani mianownika.', groupLabel: 'Grupa', voteLabel: 'Głosowanie', riceLabel: 'Indeks Rice\'a', comparableLabel: 'Porównywalne głosowania', participationLabel: 'Zarejestrowane wybory', abstentionsLabel: 'abstencje', absencesLabel: 'nieobecności', unknownLabel: 'nieznane', noComparableData: 'Brak porównywalnych wyborów yes lub no', noDataWarning: 'Nie znaleziono użytecznych rekordów. Dodaj wartości członka, grupy, głosowania i wyboru.', malformedRowWarning: 'Pominięto część wierszy, ponieważ wymagane pole było puste.', duplicateWarning: 'Zduplikowane pary członek-głosowanie zachowano tylko raz.', unknownChoiceWarning: 'Niektóre wybory zachowano jako nieznane, ponieważ nie rozpoznano ich jako yes, no, abstain ani absent.', lowSampleWarning: 'Niektóre wyniki parami mają mniej niż dwa porównywalne głosowania i nie powinny być uznawane za stabilny wzorzec.', tieWarning: 'Remis grupy lub jednostki wyłączono z porównania na poziomie grup dla tego głosowania.', importedMessage: 'Wczytano przykład. Możesz edytować wiersze przed analizą.', invalidCsvMessage: 'Nie udało się odczytać danych jako CSV o układzie wierszowym.', copyAction: 'Kopiuj podsumowanie', copiedMessage: 'Podsumowanie skopiowano do schowka.', copyFailure: 'Kopiowanie nie powiodło się. Zaznacz tekst podsumowania ręcznie.',
9
+ };
10
+ const faq = [
11
+ { question: 'Co mierzy indeks Rice\'a?', answer: 'Dla jednej grupy i jednego głosowania jest to bezwzględna różnica między głosami yes i no podzielona przez ich sumę. Wynosi od zera przy równym podziale do jednego przy jednomyślnym głosowaniu binarnym.' },
12
+ { question: 'Czy abstencje i nieobecności są uwzględniane?', answer: 'Nie. Binarne liczenie Rice\'a używa tylko yes i no. Abstencje, nieobecności i wartości nieznane pozostają widoczne jako sygnały uczestnictwa, ale są wyłączone z wyniku binarnego.' },
13
+ { question: 'Czy zgodność dowodzi wspólnej ideologii?', answer: 'Nie. Opisuje jedynie zarejestrowane wybory binarne w porównywalnych głosowaniach. Nie wskazuje ideologii, intencji, zmowy ani przyczynowości.' },
14
+ { question: 'Dlaczego pokazujecie liczbę porównywalnych głosowań?', answer: 'Procent bez mianownika może ukryć brakujące rekordy. Liczba pokazuje, ile wspólnych głosowań rzeczywiście wpłynęło na wskaźnik zgodności.' },
15
+ ];
16
+ const howTo = [
17
+ { name: 'Przygotuj jeden wiersz na wybór', text: 'Utwórz wiersze CSV z kolumnami member, group, vote i choice. Używaj yes, no, abstain, absent lub unknown.' },
18
+ { name: 'Wczytaj macierz', text: 'Wklej CSV albo wczytaj przykład i sprawdź, czy liczba grup i głosowań zgadza się ze źródłem.' },
19
+ { name: 'Odczytaj spójność grup', text: 'Użyj wstęgi i podsumowania indeksu Rice\'a, aby sprawdzić binarną spójność każdej grupy i głosowania.' },
20
+ { name: 'Porównaj wybory', text: 'Przełącz widok grup i członków, a każdy wskaźnik czytaj razem z liczbą porównywalnych głosowań.' },
21
+ { name: 'Przejrzyj ostrzeżenia', text: 'Zbadaj pominięte wiersze, duplikaty, nieznane wybory, remisy i małe próby przed wnioskowaniem.' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Analizowanie głosowań imiennych parlamentu', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Analizator głosowań parlamentarnych', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: 'Analizuje spójność grup i zgodność parami w parlamentarnych głosowaniach imiennych na podstawie przejrzystej macierzy.', url: 'https://gamebob.dev/pl/analizator-glosowan-parlamentarnych', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: 'Sprawdź spójność parlamentarnego głosowania imiennego', level: 2 },
28
+ { type: 'paragraph', html: 'Głosowanie imienne pokazuje, kto głosował, ale długa lista yes i no nie ujawnia od razu, czy grupa działała wspólnie. Ten analizator zamienia macierz wierszową we wstęgę głosowania, podsumowania grup i wyniki zgodności parami. Zachowuje rozróżnienia źródłowe, aby procent nie ukrył nieobecności ani wyborów niebinarnych.' },
29
+ { type: 'paragraph', html: 'Oczekiwane dane to tabela z jednym wierszem na członka i głosowanie. Wiersz zawiera członka, grupę parlamentarną, identyfikator głosowania i zarejestrowany wybór. Rozpoznawane są typowe etykiety, lecz nierozpoznana wartość pozostaje nieznana zamiast cichego przekodowania.' },
30
+ { type: 'title', text: 'Jak obliczany jest indeks Rice\'a', level: 2 },
31
+ { type: 'paragraph', html: 'Dla grupy i głosowania indeks Rice\'a to |yes minus no| podzielone przez yes plus no. Jednomyślne głosowanie binarne ma wartość 1, równy podział 0, a grupa bez yes i no nie ma wartości. Podsumowanie grupy jest nieważoną średnią dostępnych wyników, więc brakujące dane nie stają się sztucznymi zerami.' },
32
+ { type: 'table', headers: ['Sygnał', 'Obliczenie', 'Interpretacja'], rows: [['Indeks Rice\'a', '|yes minus no| / (yes plus no)', 'Binarna spójność grupy i głosowania'], ['Średni Rice', 'Średnia dostępnych wyników', 'Typowa spójność porównywalnych głosowań'], ['Zgodność', 'Zgodne wybory binarne / porównywalne głosowania wspólne', 'Zaobserwowana zgodność dwóch jednostek']] },
33
+ { type: 'title', text: 'Przygotuj macierz do sprawdzenia', level: 2 },
34
+ { type: 'paragraph', html: 'Używaj stabilnego identyfikatora każdego głosowania i zachowaj oryginalne kategorie do czasu importu. Nie zamieniaj nieobecności na no ani abstencji na pustą komórkę, ponieważ zmienia to liczbę uczestnictwa i zbiór obserwacji porównywalnych.' },
35
+ { type: 'list', items: ['Potwierdź, że każdy wiersz dotyczy badanej izby i okresu.', 'Ujednolić nazwy członków i grup, także akcenty i znaki przestankowe.', 'Nadaj różne identyfikatory powtórzonym wnioskom, jeśli są osobnymi głosowaniami.', 'Sprawdź duplikaty par członek-głosowanie z oryginalnym rejestrem.', 'Zachowaj plik źródłowy i dokładny tekst importu obok publikowanej interpretacji.'] },
36
+ { type: 'tip', title: 'Procent potrzebuje mianownika', html: 'Zgodność 100% w dwóch wspólnych głosowaniach jest innym dowodem niż 100% w osiemdziesięciu. Czytaj liczbę porównywalną obok każdego wskaźnika i przy małej próbie zbierz więcej danych.' },
37
+ { type: 'title', text: 'Czytaj wstęgę bez nadmiernych wniosków', level: 2 },
38
+ { type: 'paragraph', html: 'Wstęga jest pomocą w lekturze, a nie oceną polityczną. Niebieskie znaki oznaczają większość yes, rdzawe większość no, obrysy abstencję, a ciche znaki nieobecność lub nieznane dane. Wynik streszcza tylko wybory binarne; liczniki uczestnictwa pokazują, co wyłączono z mianownika.' },
39
+ { type: 'paragraph', html: 'Wysoka spójność może wynikać ze wspólnych preferencji, dyscypliny partyjnej, negocjacji koalicyjnych, wąskiego wniosku lub małej grupy. Niska wartość może oznaczać prawdziwy podział albo zmienny skład. Analizator opisuje macierz i nie wybiera wyjaśnienia.' },
40
+ { type: 'title', text: 'Ograniczenia metody i ostrzeżenia danych', level: 2 },
41
+ { type: 'paragraph', html: 'Narzędzie stosuje konwencjonalne binarne obliczenie Rice\'a i przejrzystą regułę zgodności parami. Nie wnioskuje ideologii, intencji, wykroczeń ani obowiązków prawnych. Przed porównaniem parlamentów sprawdź oficjalne definicje głosowania.' },
42
+ { type: 'tip', title: 'Ostrzeżenia są częścią wyniku', html: 'Pominięte wiersze, duplikaty, nieznane wybory, remisy i małe próby porównywalne nie są ozdobą. Rozwiąż je lub opisz przed porównaniem okresów, grup albo członków.' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'analizator-glosowan-parlamentarnych', title: 'Analizator głosowań parlamentarnych', description: 'Mierz spójność grup i zgodność parami z macierzy głosowań imiennych, zachowując widoczne abstencje, nieobecności, mianowniki i ostrzeżenia.', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };
@@ -0,0 +1,45 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ParliamentaryVotingLocaleContent } from '../entry';
4
+ import type { ParliamentaryVotingUI } from '../ui';
5
+ import type { ToolLocaleContent } from '../../../types';
6
+
7
+ const ui: ParliamentaryVotingUI = {
8
+ dataHeading: 'Dê visibilidade a uma votação nominal', dataHelp: 'Cole uma linha por membro e votação. Use as quatro colunas membro, grupo, votação e escolha.', csvLabel: 'CSV da votação nominal', csvHint: 'Colunas obrigatórias: membro, grupo, votação, escolha. Escolhas aceitas: sim, não, abstenção, ausente, desconhecido.', loadExample: 'Carregar exemplo', analyzeAction: 'Analisar votos', clearAction: 'Limpar dados', compareLabel: 'Vista de concordância', groupsOption: 'Grupos', membersOption: 'Membros', resultHeading: 'O registo de votação num relance', emptyResult: 'Cole uma votação ou carregue o exemplo para revelar a faixa de votos.', rowsLabel: 'registos', groupsLabel: 'grupos', votesLabel: 'votações', warningsHeading: 'Verificações antes da interpretação', methodHeading: 'Método aplicado', methodText: 'O índice de Rice de cada grupo e votação é a diferença absoluta entre sim e não dividida por sim mais não. Abstenções, ausências e valores desconhecidos são excluídos desse denominador binário. As médias dos grupos são médias não ponderadas das votações com pelo menos um sim ou não. A concordância compara escolhas binárias na mesma votação e mostra sempre o número de votações comparáveis.', limitsHeading: 'O que esta ferramenta não faz', limitsText: 'Não infere ideologia, intenção, disciplina, conluio, má conduta, posições políticas ou causalidade. Também não decide se uma votação foi válida ou se um membro tinha obrigação legal de comparecer. Votos semelhantes podem ter muitas explicações.', edgeHeading: 'Casos-limite e avisos de dados', edgeText: 'Votações unânimes recebem 1, mas isso não prova disciplina. Empates produzem coesão zero e são marcados separadamente das abstenções. Votos em falta reduzem a amostra comparável. Mantenha visíveis nos dados de origem as mudanças de grupo, identificadores duplicados e escolhas desconhecidas.', cohesionHeading: 'Faixa de coesão', cohesionHelp: 'Cada linha é um grupo. Uma marca brilhante é sim, uma escura é não, uma tracejada é empate, uma vazia é abstenção e uma discreta é ausência ou dado desconhecido.', agreementHeading: 'Concordância entre pares', agreementHelp: 'A concordância usa apenas escolhas sim e não comparáveis partilhadas pelas duas entidades. Na vista de grupos, cada grupo contribui com a sua maioria não empatada. Abstenções e não participação ficam fora do numerador e denominador.', groupLabel: 'Grupo', voteLabel: 'Votação', riceLabel: 'Índice de Rice', comparableLabel: 'Votações comparáveis', participationLabel: 'Escolhas registadas', abstentionsLabel: 'abstenções', absencesLabel: 'ausências', unknownLabel: 'desconhecidas', noComparableData: 'Não há escolhas sim ou não comparáveis', noDataWarning: 'Não foram encontrados registos utilizáveis. Adicione membro, grupo, votação e escolha.', malformedRowWarning: 'Algumas linhas foram ignoradas porque faltava um campo obrigatório.', duplicateWarning: 'Os pares duplicados de membro e votação foram mantidos apenas uma vez.', unknownChoiceWarning: 'Algumas escolhas foram mantidas como desconhecidas porque não foram reconhecidas como sim, não, abstenção ou ausência.', lowSampleWarning: 'Alguns resultados entre pares têm menos de duas votações comparáveis e não devem ser tratados como padrões estáveis.', tieWarning: 'Um empate de grupo ou entidade foi excluído da comparação entre grupos para essa votação.', importedMessage: 'Exemplo carregado. Pode editar as linhas antes de analisar.', invalidCsvMessage: 'Os dados não puderam ser lidos como um CSV organizado por linhas.', copyAction: 'Copiar resumo', copiedMessage: 'Resumo copiado para a área de transferência.', copyFailure: 'A cópia falhou. Selecione manualmente o texto do resumo.',
9
+ };
10
+ const faq = [
11
+ { question: 'O que mede o índice de Rice?', answer: 'Para um grupo e uma votação, é a diferença absoluta entre votos sim e não dividida pela soma. Vai de zero numa divisão equilibrada a um numa votação binária unânime.' },
12
+ { question: 'As abstenções e ausências são incluídas?', answer: 'Não. O denominador binário de Rice usa apenas sim e não. Abstenções, ausências e valores desconhecidos continuam visíveis como sinais de participação, mas são excluídos da pontuação binária.' },
13
+ { question: 'A concordância prova uma ideologia partilhada?', answer: 'Não. Descreve apenas as escolhas binárias registadas nas votações comparáveis. Não identifica ideologia, intenção, conluio ou causalidade.' },
14
+ { question: 'Por que são mostradas as contagens comparáveis?', answer: 'Uma percentagem sem denominador pode esconder registos em falta. A contagem mostra quantas votações partilhadas contribuíram realmente para cada taxa de concordância.' },
15
+ ];
16
+ const howTo = [
17
+ { name: 'Prepare uma linha por escolha', text: 'Crie linhas CSV com as colunas membro, grupo, votação e escolha. Use sim, não, abstenção, ausente ou desconhecido.' },
18
+ { name: 'Carregue a matriz', text: 'Cole o CSV ou carregue o exemplo e confirme que as contagens de grupos e votações coincidem com a fonte.' },
19
+ { name: 'Leia a coesão', text: 'Use a faixa e o resumo do índice de Rice para examinar a coesão binária de cada grupo e votação.' },
20
+ { name: 'Compare escolhas', text: 'Alterne entre concordância de grupos e de membros e leia cada taxa com o seu número de votações comparáveis.' },
21
+ { name: 'Reveja os avisos', text: 'Investigue linhas ignoradas, duplicados, escolhas desconhecidas, empates e amostras pequenas antes de concluir.' },
22
+ ];
23
+ const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
24
+ const howToSchema: HowTo = { '@type': 'HowTo', name: 'Analisar votações nominais parlamentares', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
25
+ const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Analisador de votações parlamentares', applicationCategory: 'EducationalApplication', operatingSystem: 'Any', description: 'Analisa a coesão e a concordância entre pares em votações nominais parlamentares a partir de uma matriz transparente.', url: 'https://gamebob.dev/pt/analisador-votacoes-parlamentares', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
26
+ const seo: ToolLocaleContent<ParliamentaryVotingUI>['seo'] = [
27
+ { type: 'title', text: 'Examine a coesão de uma votação nominal parlamentar', level: 2 },
28
+ { type: 'paragraph', html: 'Uma votação nominal regista quem votou, mas uma longa lista de sim e não não mostra logo se um grupo agiu em conjunto. Este analisador transforma uma matriz por linhas numa faixa visual, resumos de grupos e resultados de concordância entre pares. Mantém as distinções da fonte para que uma percentagem não apague ausências ou escolhas não binárias.' },
29
+ { type: 'paragraph', html: 'A entrada esperada é uma tabela com uma linha por membro e votação. Cada linha identifica o membro, o grupo parlamentar, o identificador da votação e a escolha registada. O analisador aceita rótulos comuns como a favor, contra, abstenção e não votou; um valor não reconhecido permanece desconhecido em vez de ser recodificado silenciosamente.' },
30
+ { type: 'title', text: 'Como é calculado o índice de Rice', level: 2 },
31
+ { type: 'paragraph', html: 'Para um grupo numa votação, o índice de Rice é |sim menos não| dividido por sim mais não. Uma votação binária unânime vale 1, uma divisão equilibrada vale 0 e um grupo sem sim nem não não tem valor de Rice. O resumo do grupo é a média não ponderada dos valores disponíveis, por isso escolhas binárias em falta não recebem zeros inventados.' },
32
+ { type: 'table', headers: ['Sinal', 'Cálculo', 'Interpretação'], rows: [['Índice de Rice', '|sim menos não| / (sim mais não)', 'Coesão binária de um grupo e votação'], ['Rice médio', 'Média dos valores disponíveis', 'Coesão habitual em votações comparáveis'], ['Concordância', 'Escolhas binárias iguais / votações partilhadas comparáveis', 'Coincidência observada entre duas entidades']] },
33
+ { type: 'title', text: 'Prepare uma matriz verificável', level: 2 },
34
+ { type: 'paragraph', html: 'Use um identificador estável para cada votação e conserve as categorias originais até depois da importação. Não transforme ausência em não nem abstenção numa célula vazia. Essas decisões alteram as contagens de participação e o conjunto de observações comparáveis.' },
35
+ { type: 'list', items: ['Confirme que cada linha pertence à câmara e ao período que pretende estudar.', 'Mantenha consistentes os nomes de membros e grupos, incluindo acentos e pontuação.', 'Dê identificadores diferentes a moções repetidas quando forem votações nominais separadas.', 'Verifique pares duplicados de membro e votação com o registo original antes de aceitar a primeira linha.', 'Guarde o ficheiro de origem e o texto importado junto de qualquer interpretação publicada.'] },
36
+ { type: 'tip', title: 'Uma percentagem precisa do denominador', html: 'Uma concordância de 100% em duas votações partilhadas é uma evidência diferente de 100% em oitenta. Leia a contagem comparável junto de cada taxa e trate uma amostra pequena como motivo para recolher mais dados.' },
37
+ { type: 'title', text: 'Interprete a faixa sem extrapolar', level: 2 },
38
+ { type: 'paragraph', html: 'A faixa é uma ajuda de leitura, não um veredicto político. Marcas azuis representam a maioria de sim do grupo, marcas cor de ferrugem a maioria de não, contornos uma abstenção e marcas discretas uma ausência ou dado desconhecido. A pontuação resume apenas escolhas binárias; as contagens de participação mostram o que ficou fora do denominador.' },
39
+ { type: 'paragraph', html: 'Uma coesão elevada pode resultar de preferências comuns, disciplina partidária, negociação de coligação, uma moção estreita ou um grupo pequeno. Uma concordância elevada entre grupos pode refletir uma agenda com pouco desacordo. Uma pontuação baixa pode refletir divisão real ou alterações na composição. O analisador descreve a matriz e não escolhe entre essas explicações.' },
40
+ { type: 'title', text: 'Limites do método e avisos de dados', level: 2 },
41
+ { type: 'paragraph', html: 'A ferramenta segue o cálculo binário convencional de Rice e uma regra transparente de concordância entre pares. Não infere ideologia, intenção, má conduta ou obrigações legais. Consulte as definições oficiais das votações antes de comparar abstenções, ausências ou valores desconhecidos entre parlamentos.' },
42
+ { type: 'tip', title: 'Os avisos fazem parte do resultado', html: 'Linhas ignoradas, identificadores duplicados, escolhas desconhecidas, empates e pequenas amostras comparáveis não são avisos decorativos. Resolva-os ou documente-os antes de comparar períodos, grupos ou membros.' },
43
+ ];
44
+
45
+ export const content: ParliamentaryVotingLocaleContent = { slug: 'analisador-votacoes-parlamentares', title: 'Analisador de votações parlamentares', description: 'Meça a coesão dos grupos e a concordância entre pares numa matriz de votações nominais, mantendo visíveis abstenções, ausências, denominadores e avisos.', ui, seo, faq, bibliography, howTo, schemas: [softwareApplication, faqPage, howToSchema] as unknown as Record<string, unknown>[] };