@jjlmoya/utils-forensic-science 1.1.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.
- package/package.json +69 -0
- package/scripts/crystal-lattice-catalog-translations.mjs +459 -0
- package/scripts/postinstall.mjs +27 -0
- package/scripts/sync-crystal-lattice-i18n.mjs +50 -0
- package/src/category/i18n/de.ts +55 -0
- package/src/category/i18n/en.ts +55 -0
- package/src/category/i18n/es.ts +55 -0
- package/src/category/i18n/fr.ts +55 -0
- package/src/category/i18n/id.ts +55 -0
- package/src/category/i18n/it.ts +55 -0
- package/src/category/i18n/ja.ts +56 -0
- package/src/category/i18n/ko.ts +56 -0
- package/src/category/i18n/nl.ts +55 -0
- package/src/category/i18n/pl.ts +55 -0
- package/src/category/i18n/pt.ts +55 -0
- package/src/category/i18n/ru.ts +55 -0
- package/src/category/i18n/sv.ts +55 -0
- package/src/category/i18n/tr.ts +55 -0
- package/src/category/i18n/zh.ts +56 -0
- package/src/category/index.ts +48 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +10 -0
- package/src/entries.ts +48 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +29 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +162 -0
- package/src/pages/[locale].astro +261 -0
- package/src/pages/index.astro +3 -0
- package/src/tests/diacritics_density.test.ts +140 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/inverted_punctuation.test.ts +84 -0
- package/src/tests/locale_completeness.test.ts +24 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_en_dash.test.ts +70 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/script_density.test.ts +94 -0
- package/src/tests/seo_length.test.ts +46 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/slug_language_code_format.test.ts +23 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +16 -0
- package/src/tests/widmark.test.ts +28 -0
- package/src/tool/forensic-age-estimator/bibliography.astro +14 -0
- package/src/tool/forensic-age-estimator/bibliography.ts +16 -0
- package/src/tool/forensic-age-estimator/component.astro +321 -0
- package/src/tool/forensic-age-estimator/dental-skeletal-third-molar-age-estimator.css +634 -0
- package/src/tool/forensic-age-estimator/entry.ts +32 -0
- package/src/tool/forensic-age-estimator/i18n/de.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/en.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/es.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/fr.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/id.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/it.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/ja.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/ko.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/nl.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/pl.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/pt.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/ru.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/sv.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/tr.ts +245 -0
- package/src/tool/forensic-age-estimator/i18n/zh.ts +246 -0
- package/src/tool/forensic-age-estimator/index.ts +11 -0
- package/src/tool/forensic-age-estimator/logic.ts +81 -0
- package/src/tool/forensic-age-estimator/seo.astro +15 -0
- package/src/tool/forensic-blood-test-simulator/bibliography.astro +6 -0
- package/src/tool/forensic-blood-test-simulator/bibliography.ts +12 -0
- package/src/tool/forensic-blood-test-simulator/component.astro +168 -0
- package/src/tool/forensic-blood-test-simulator/dom-utils.ts +40 -0
- package/src/tool/forensic-blood-test-simulator/entry.ts +32 -0
- package/src/tool/forensic-blood-test-simulator/forensic-presumptive-blood-testing-luminol-kastle-meyer-simulator.css +532 -0
- package/src/tool/forensic-blood-test-simulator/helpers.ts +16 -0
- package/src/tool/forensic-blood-test-simulator/i18n/de.ts +185 -0
- package/src/tool/forensic-blood-test-simulator/i18n/en.ts +185 -0
- package/src/tool/forensic-blood-test-simulator/i18n/es.ts +185 -0
- package/src/tool/forensic-blood-test-simulator/i18n/fr.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/id.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/it.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/ja.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/ko.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/nl.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/pl.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/pt.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/ru.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/sv.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/tr.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/i18n/zh.ts +220 -0
- package/src/tool/forensic-blood-test-simulator/index.ts +11 -0
- package/src/tool/forensic-blood-test-simulator/logic.ts +174 -0
- package/src/tool/forensic-blood-test-simulator/script.ts +192 -0
- package/src/tool/forensic-blood-test-simulator/seo.astro +15 -0
- package/src/tool/forensic-fiber-comparison-microscope/bibliography.astro +6 -0
- package/src/tool/forensic-fiber-comparison-microscope/bibliography.ts +16 -0
- package/src/tool/forensic-fiber-comparison-microscope/component.astro +146 -0
- package/src/tool/forensic-fiber-comparison-microscope/entry.ts +32 -0
- package/src/tool/forensic-fiber-comparison-microscope/forensic-fiber-comparison-microscope.css +629 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/de.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/en.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/es.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/fr.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/id.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/it.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/ja.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/ko.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/nl.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/pl.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/pt.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/ru.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/sv.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/tr.ts +246 -0
- package/src/tool/forensic-fiber-comparison-microscope/i18n/zh.ts +250 -0
- package/src/tool/forensic-fiber-comparison-microscope/index.ts +11 -0
- package/src/tool/forensic-fiber-comparison-microscope/logic.ts +244 -0
- package/src/tool/forensic-fiber-comparison-microscope/render.ts +265 -0
- package/src/tool/forensic-fiber-comparison-microscope/seo.astro +15 -0
- package/src/tool/forensic-fiber-comparison-microscope/view.ts +267 -0
- package/src/tool/forensic-glass-becke-line-simulator/bibliography.astro +6 -0
- package/src/tool/forensic-glass-becke-line-simulator/bibliography.ts +16 -0
- package/src/tool/forensic-glass-becke-line-simulator/component.astro +81 -0
- package/src/tool/forensic-glass-becke-line-simulator/entry.ts +32 -0
- package/src/tool/forensic-glass-becke-line-simulator/forensic-glass-becke-line-simulator.css +392 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/de.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/en.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/es.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/fr.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/id.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/it.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/ja.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/ko.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/nl.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/pl.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/pt.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/ru.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/sv.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/tr.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/i18n/zh.ts +231 -0
- package/src/tool/forensic-glass-becke-line-simulator/index.ts +11 -0
- package/src/tool/forensic-glass-becke-line-simulator/logic.ts +100 -0
- package/src/tool/forensic-glass-becke-line-simulator/seo.astro +15 -0
- package/src/tool/forensic-glass-becke-line-simulator/view.ts +281 -0
- package/src/tool/forensic-image-authenticity-analyzer/bibliography.astro +9 -0
- package/src/tool/forensic-image-authenticity-analyzer/bibliography.ts +7 -0
- package/src/tool/forensic-image-authenticity-analyzer/component.astro +250 -0
- package/src/tool/forensic-image-authenticity-analyzer/entry.ts +29 -0
- package/src/tool/forensic-image-authenticity-analyzer/forensic-image-metadata-authenticity-analyzer.css +679 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/de.ts +105 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/en.ts +105 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/es.ts +105 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/fr.ts +105 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/id.ts +76 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/it.ts +105 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/ja.ts +72 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/ko.ts +72 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/nl.ts +75 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/pl.ts +75 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/pt.ts +105 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/ru.ts +75 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/sv.ts +76 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/tr.ts +76 -0
- package/src/tool/forensic-image-authenticity-analyzer/i18n/zh.ts +71 -0
- package/src/tool/forensic-image-authenticity-analyzer/index.ts +11 -0
- package/src/tool/forensic-image-authenticity-analyzer/logic.ts +283 -0
- package/src/tool/forensic-image-authenticity-analyzer/seo.astro +10 -0
- package/src/tool/forensic-microcrystal-drug-simulator/bibliography.astro +6 -0
- package/src/tool/forensic-microcrystal-drug-simulator/bibliography.ts +12 -0
- package/src/tool/forensic-microcrystal-drug-simulator/component.astro +240 -0
- package/src/tool/forensic-microcrystal-drug-simulator/entry.ts +32 -0
- package/src/tool/forensic-microcrystal-drug-simulator/forensic-microcrystal-drug-simulator.css +430 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/de.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/en.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/es.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/fr.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/id.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/it.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/ja.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/ko.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/nl.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/pl.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/pt.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/ru.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/sv.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/tr.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/i18n/zh.ts +244 -0
- package/src/tool/forensic-microcrystal-drug-simulator/index.ts +11 -0
- package/src/tool/forensic-microcrystal-drug-simulator/logic.ts +189 -0
- package/src/tool/forensic-microcrystal-drug-simulator/seo.astro +15 -0
- package/src/tool/forensic-sex-determinator/bibliography.astro +14 -0
- package/src/tool/forensic-sex-determinator/bibliography.ts +12 -0
- package/src/tool/forensic-sex-determinator/component.astro +463 -0
- package/src/tool/forensic-sex-determinator/entry.ts +32 -0
- package/src/tool/forensic-sex-determinator/forensic-sex-determinator.css +413 -0
- package/src/tool/forensic-sex-determinator/i18n/de.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/en.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/es.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/fr.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/id.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/it.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/ja.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/ko.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/nl.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/pl.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/pt.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/ru.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/sv.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/tr.ts +211 -0
- package/src/tool/forensic-sex-determinator/i18n/zh.ts +211 -0
- package/src/tool/forensic-sex-determinator/index.ts +11 -0
- package/src/tool/forensic-sex-determinator/logic.ts +89 -0
- package/src/tool/forensic-sex-determinator/seo.astro +15 -0
- package/src/tool/forensic-stature-estimator/bibliography.astro +14 -0
- package/src/tool/forensic-stature-estimator/bibliography.ts +12 -0
- package/src/tool/forensic-stature-estimator/component.astro +49 -0
- package/src/tool/forensic-stature-estimator/components/EstimationPanel.astro +65 -0
- package/src/tool/forensic-stature-estimator/components/OsteometricBoard.astro +39 -0
- package/src/tool/forensic-stature-estimator/components/OsteometricSelector.astro +109 -0
- package/src/tool/forensic-stature-estimator/dom-utils.ts +71 -0
- package/src/tool/forensic-stature-estimator/entry.ts +32 -0
- package/src/tool/forensic-stature-estimator/forensic-stature-estimator.css +689 -0
- package/src/tool/forensic-stature-estimator/helpers.ts +51 -0
- package/src/tool/forensic-stature-estimator/i18n/de.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/en.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/es.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/fr.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/id.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/it.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/ja.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/ko.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/nl.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/pl.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/pt.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/ru.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/sv.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/tr.ts +196 -0
- package/src/tool/forensic-stature-estimator/i18n/zh.ts +196 -0
- package/src/tool/forensic-stature-estimator/index.ts +11 -0
- package/src/tool/forensic-stature-estimator/logic.ts +119 -0
- package/src/tool/forensic-stature-estimator/script.ts +288 -0
- package/src/tool/forensic-stature-estimator/seo.astro +15 -0
- package/src/tool/forensic-tlc-ink-simulator/bibliography.astro +6 -0
- package/src/tool/forensic-tlc-ink-simulator/bibliography.ts +16 -0
- package/src/tool/forensic-tlc-ink-simulator/component.astro +245 -0
- package/src/tool/forensic-tlc-ink-simulator/entry.ts +32 -0
- package/src/tool/forensic-tlc-ink-simulator/forensic-tlc-ink-simulator.css +462 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/de.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/en.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/es.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/fr.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/id.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/it.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/ja.ts +235 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/ko.ts +235 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/nl.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/pl.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/pt.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/ru.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/sv.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/tr.ts +243 -0
- package/src/tool/forensic-tlc-ink-simulator/i18n/zh.ts +235 -0
- package/src/tool/forensic-tlc-ink-simulator/index.ts +11 -0
- package/src/tool/forensic-tlc-ink-simulator/logic.ts +152 -0
- package/src/tool/forensic-tlc-ink-simulator/seo.astro +15 -0
- package/src/tool/gsr-dispersion-calculator/bibliography.astro +6 -0
- package/src/tool/gsr-dispersion-calculator/bibliography.ts +16 -0
- package/src/tool/gsr-dispersion-calculator/component.astro +294 -0
- package/src/tool/gsr-dispersion-calculator/entry.ts +32 -0
- package/src/tool/gsr-dispersion-calculator/gsr-dispersion-calculator.css +305 -0
- package/src/tool/gsr-dispersion-calculator/i18n/de.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/en.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/es.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/fr.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/id.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/it.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/ja.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/ko.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/nl.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/pl.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/pt.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/ru.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/sv.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/tr.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/i18n/zh.ts +272 -0
- package/src/tool/gsr-dispersion-calculator/index.ts +11 -0
- package/src/tool/gsr-dispersion-calculator/logic.ts +148 -0
- package/src/tool/gsr-dispersion-calculator/seo.astro +15 -0
- package/src/tool/widmark-alcohol-simulator/bibliography.astro +14 -0
- package/src/tool/widmark-alcohol-simulator/bibliography.ts +12 -0
- package/src/tool/widmark-alcohol-simulator/component.astro +453 -0
- package/src/tool/widmark-alcohol-simulator/entry.ts +32 -0
- package/src/tool/widmark-alcohol-simulator/i18n/de.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/en.ts +206 -0
- package/src/tool/widmark-alcohol-simulator/i18n/es.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/fr.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/id.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/it.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/ja.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/ko.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/nl.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/pl.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/pt.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/ru.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/sv.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/tr.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/i18n/zh.ts +193 -0
- package/src/tool/widmark-alcohol-simulator/index.ts +11 -0
- package/src/tool/widmark-alcohol-simulator/logic.ts +97 -0
- package/src/tool/widmark-alcohol-simulator/seo.astro +15 -0
- package/src/tool/widmark-alcohol-simulator/widmark-alcohol-simulator.css +386 -0
- package/src/tools.ts +27 -0
- package/src/types.ts +70 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
|
|
4
|
+
const slug = 'widmark-kan-alkolu-hesaplayici';
|
|
5
|
+
const title = 'Widmark Kan Alkolü Simülatörü';
|
|
6
|
+
const description = 'Widmark formülünü kullanarak insan vücudundaki alkol emilimini, dağılımını ve eliminasyonunu simüle edin.';
|
|
7
|
+
|
|
8
|
+
const howTo = [
|
|
9
|
+
{
|
|
10
|
+
name: 'Kişi profilini ayarlayın',
|
|
11
|
+
text: 'Widmark faktörünü (r) belirlemek için kilo, biyolojik cinsiyet ve dehidrasyon durumunu girin. Bu değişkenler etanolün vücuttaki dağılım hacmini belirler.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'Mide durumunu seçin',
|
|
15
|
+
text: 'Emilim oranını değiştirmek için boş mide, hafif yemek veya ağır yemek seçeneğini seçin. Bu, gıdaların emilim hız sabiti (ka) üzerindeki yavaşlatıcı etkisini gösterir.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'İçecek ekleyin',
|
|
19
|
+
text: 'Tüketilen içecek hacmini (ml), alkol oranını (ABV) ve tüketim saatini simülasyon başlangıcına göre girin.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'Grafiği inceleyin',
|
|
23
|
+
text: '12 saatlik kan alkol seviyesi (BAC) grafiğini inceleyin. Zirve seviyesini, zirveye ulaşma süresini ve yasal sınırlara göre tahmini ayılma sürelerini kontrol edin.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const faq = [
|
|
28
|
+
{
|
|
29
|
+
key: 'faq-1',
|
|
30
|
+
question: 'Widmark formülü nedir ve adli tıpta nasıl kullanılır?',
|
|
31
|
+
answer: 'Widmark formülü, 1932 yılında Erik M. P. Widmark tarafından geliştirilen matematiksel bir modeldir. Tüketilen alkol miktarı, vücut ağırlığı, cinsiyete bağlı dağılım faktörü (r) ve doğrusal eliminasyon hızına dayanarak kandaki alkol konsantrasyonunu tahmin eder. Adli toksikologlar bu formülü kaza anındaki alkol seviyesini geriye dönük hesaplamak için kullanırlar.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: 'faq-2',
|
|
35
|
+
question: 'Midede besin bulunması kan alkol eğrisini nasıl etkiler?',
|
|
36
|
+
answer: 'Midedeki yiyecekler mide boşalmasını geciktirerek alkolün emilim bölgesi olan ince bağırsağa geçişini yavaşlatır. Simülasyonda bu durum emilim hız sabitinin (ka) düşürülmesiyle modellenir; bu da alkolün zirveye ulaşma süresini öteler ve zirvedeki alkol konsantrasyonunu önemli ölçüde azaltır.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'faq-3',
|
|
40
|
+
question: 'Alkolün vücuttan atılımı neden birinci derece yerine sıfırıncı derece kinetiğe uyar?',
|
|
41
|
+
answer: 'Birçok ilaç vücuttan birinci derece kinetikle (konsantrasyonla orantılı olarak) atılır. Alkol ise sıfırıncı derece kinetikle atılır çünkü karaciğerde alkolü yıkan birincil enzim olan alkol dehidrogenaz (ADH), çok düşük alkol seviyelerinde bile (yaklaşık 0.02 g/L) tamamen doygunluğa ulaşır. Bu nedenle karaciğer, kandaki alkol miktarından bağımsız olarak sabit bir hızda alkolü elime eder.',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: 'faq-4',
|
|
45
|
+
question: 'Hangi biyolojik faktörler Widmark r faktöründe bireysel farklılıklara yol açar?',
|
|
46
|
+
answer: 'Widmark r faktörü, vücuttaki toplam su miktarının toplam ağırlığa oranını temsil eder. Etanol hidrofilik (suda çözünen) ve lipofobik (yağda çözünmeyen) olduğundan sadece vücut suyunda dağılır. Kas dokusu yüksek oranda su içerirken, yağ dokusunda su miktarı çok azdır. Vücut yağı yüksek veya susuz kalmış bireylerde r faktörü daha küçüktür ve bu da daha yüksek alkol seviyesine yol açar.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: 'faq-5',
|
|
50
|
+
question: 'Bu simülatörün sonuçlarını yasal olarak araç kullanabileceğimin kanıtı olarak sunabilir miyim?',
|
|
51
|
+
answer: 'Kesinlikle hayır. Bu simülatör yalnızca eğitim amaçlı bir araçtır. Gerçek hayatta karaciğer sağlığı, enzim genetiği, ilaç etkileşimleri, yorgunluk ve mide içeriği gibi değişkenler büyük bireysel farklılıklar yaratır. Araç kullanma kararınızı asla matematiksel bir simülasyona dayandırmamalısınız.',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
export const content: ToolLocaleContent = {
|
|
56
|
+
slug,
|
|
57
|
+
title,
|
|
58
|
+
description,
|
|
59
|
+
ui: {
|
|
60
|
+
subjectProfile: 'Profil',
|
|
61
|
+
weight: 'Kilo (kg)',
|
|
62
|
+
sex: 'Biyolojik Cinsiyet',
|
|
63
|
+
male: 'Erkek',
|
|
64
|
+
female: 'Kadın',
|
|
65
|
+
hydration: 'Hidrasyon Seviyesi',
|
|
66
|
+
hydrationLow: 'Düşük',
|
|
67
|
+
hydrationNormal: 'Normal',
|
|
68
|
+
hydrationHigh: 'Yüksek',
|
|
69
|
+
stomachState: 'Mide İçeriği',
|
|
70
|
+
stomachEmpty: 'Boş (Hızlı)',
|
|
71
|
+
stomachLight: 'Hafif Yemek (Orta)',
|
|
72
|
+
stomachFull: 'Ağır Yemek (Yavaş)',
|
|
73
|
+
drinksTimeline: 'Tüketim Zaman Çizelgesi',
|
|
74
|
+
addDrink: 'İçecek Ekle',
|
|
75
|
+
drinkVolume: 'Hacim (ml)',
|
|
76
|
+
drinkAbv: 'Alkol Oranı (% vol)',
|
|
77
|
+
drinkTime: 'Zaman (Saat)',
|
|
78
|
+
drinksList: 'Tüketilen İçecekler',
|
|
79
|
+
remove: 'Kaldır',
|
|
80
|
+
beer: 'Bira (330ml, 5%)',
|
|
81
|
+
wine: 'Şarap (150ml, 12%)',
|
|
82
|
+
spirits: 'Yüksek Alkollü (%40)',
|
|
83
|
+
peakBac: 'Zirve BAC',
|
|
84
|
+
timeToSober: 'Ayılma Süresi',
|
|
85
|
+
sober: 'Ayık',
|
|
86
|
+
currentBac: 'Güncel BAC',
|
|
87
|
+
drivingLimitAlert: 'Sürüş Durumu',
|
|
88
|
+
safeLimit: 'Limit Altında',
|
|
89
|
+
warningLimit: 'Uyarı Limiti Aşıldı',
|
|
90
|
+
dangerLimit: 'Tehlike Limiti Aşıldı',
|
|
91
|
+
graphTitle: '12 Saatlik Kan Alkol Konsantrasyonu',
|
|
92
|
+
timeAxisLabel: 'Zaman (Saat)',
|
|
93
|
+
bacAxisLabel: 'Promil (g/L)',
|
|
94
|
+
legalLimitText: 'Standart Yasal Limit',
|
|
95
|
+
noDrinksText: 'Simülasyon için içecek ekleyin.',
|
|
96
|
+
hours: 'saat',
|
|
97
|
+
soberStatus: '{time} saat içinde ayık',
|
|
98
|
+
neverSober: '12 saati aşıyor',
|
|
99
|
+
noteDisclaimer: 'Yalnızca eğitim amaçlıdır. Alkollüyken araç kullanmayın.',
|
|
100
|
+
noteWidmark: 'Widmark formülü ve doğrusal karaciğer metabolizmasına dayanır.',
|
|
101
|
+
},
|
|
102
|
+
seo: [
|
|
103
|
+
{
|
|
104
|
+
type: 'title',
|
|
105
|
+
text: 'Adli Toksikoloji ve Etanolün Farmakokinetiği',
|
|
106
|
+
level: 2,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: 'Etanolün insan vücudundaki <strong>emilimi, dağılımı ve eliminasyonu</strong> adli tıp ve trafik kazası analizlerinin en temel konularından biridir. Tüketilen alkolün küçük bir kısmı mideden emilirken, büyük kısmı geniş yüzey alanı nedeniyle ince bağırsakta kana karışır. Mide boşalma hızı alkol emilimini sınırlayan en önemli faktördür; bu nedenle midede besin bulunması emilim hızını ve kandaki alkol konsantrasyonunun tepe noktasını önemli ölçüde düşürür.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: 'Bu simülatör, Erik Widmark\'ın klasik denklemlerini 12 saatlik kesintisiz bir kompartman modeliyle birleştirir. Bireysel fizyolojik parametreler ayarlanarak alkolün zamana bağlı birikimi ve ardından karaciğer tarafından doğrusal olarak temizlenmesi gözlemlenebilir.',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: 'title',
|
|
118
|
+
text: 'Widmark Denkleminin Matematiksel Çıkarımı',
|
|
119
|
+
level: 3,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Temel Widmark denklemi, alkolün vücut suyunda anında dağıldığını varsayarak teorik kan alkol seviyesini hesaplar: <strong>BAC = (A / (W * r)) - (β * t)</strong>. Burada <em>A</em> tüketilen saf etanolün gram cinsinden kütlesi, <em>W</em> kg cinsinden vücut ağırlığı ve <em>r</em> Widmark dağılım faktörüdür. <em>β</em> saatlik eliminasyon hızını, <em>t</em> ise emilim başlangıcından itibaren geçen süreyi ifade eder.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Sıvı içecek hacminin saf etanol gramına dönüştürülmesi, hacmin (ml) alkol derecesiyle (ABV) ve etanol yoğunluğuyla (yaklaşık 0,8 g/ml) çarpılmasıyla yapılır. Örneğin, %5 alkollü 330 ml bir bira 13,2 gram saf alkol içerir. Bu kütle toplam vücut suyunda seyreltilir. Simülatör, r faktörünü biyolojik cinsiyete (erkeklerde 0,68 ve kadınlarda 0,55) ve hidrasyon durumuna göre dinamik olarak uyarlar.',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'title',
|
|
131
|
+
text: 'Fizyolojik Değişkenler ve Dağılım Hacmi',
|
|
132
|
+
level: 3,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'paragraph',
|
|
136
|
+
html: 'Etanolün dağılım hacmi doğrudan vücut bileşimine bağlıdır. Alkol suda çözünür ancak yağda çözünmez. Kas dokusu yaklaşık %75 su içerirken, yağ dokusu neredeyse hiç su barındırmaz. Dolayısıyla kaslı bir bireyin r faktörü daha yüksek olup, aynı kilodaki yağ oranı yüksek bir bireye göre daha düşük alkol zirvesi gösterir. Dehidrasyon da toplam vücut suyunu azaltarak zirve BAC değerini yükseltir.',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'table',
|
|
140
|
+
headers: ['Fizyolojik Değişken', 'Biyolojik Mekanizma', 'Farmakokinetik Etki', 'Adli Tıp Açısından Önemi'],
|
|
141
|
+
rows: [
|
|
142
|
+
['Vücut Ağırlığı', 'Vücuttaki toplam su havuzunun hacmini belirler.', 'Zirve BAC seviyesiyle ters orantılıdır.', 'Geriye dönük adli hesaplamalar için temel oluşturur.'],
|
|
143
|
+
['Biyolojik Cinsiyet', 'Kas ve yağ dokusunun tipik dağılımını belirler.', 'Kadınlarda r faktörü daha düşüktür (0,55), bu da zirveyi artırır.', 'Kadınların alkole karşı biyolojik duyarlılığını açıklar.'],
|
|
144
|
+
['Hidrasyon Seviyesi', 'Dokulardaki serbest su miktarını değiştirir.', 'Dehidrasyon r faktörünü 0,05 azaltarak eğriyi yükseltir.', 'Ağır efor veya susuzluk durumlarında hesaplamayı ayarlar.'],
|
|
145
|
+
['Mide Doluluğu', 'Besinler midenin boşalma hızını yavaşlatır.', 'Emilim sabiti ka\'yı düşürerek eğriyi düzleştirir.', 'Yemek sonrası yüksek miktarda alkol alımında düşük değerleri açıklar.'],
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'title',
|
|
150
|
+
text: 'Eliminasyon Kinetiği: Karaciğerde Sıfırıncı Derece Temizlenme',
|
|
151
|
+
level: 3,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'paragraph',
|
|
155
|
+
html: 'Kana karışan alkolün büyük kısmı karaciğerde alkol dehidrogenaz (ADH) enzimi tarafından parçalanır. Bu enzim çok düşük konsantrasyonlarda (0,02 g/L) bile tamamen doygunluğa ulaştığı için sıfırıncı derece kinetik devreye girer. Yani karaciğer, kandaki alkol miktarından bağımsız olarak zaman birimi başına sabit bir miktar alkolü yok eder. Yasal kabul gören ortalama eliminasyon hızı (β<sub>60</sub>) saatte 0,15 g/L\'dir. Bu doğrusal düşüş grafikteki düz aşağı yönlü eğriyi oluşturur.',
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
faq,
|
|
159
|
+
bibliography,
|
|
160
|
+
howTo,
|
|
161
|
+
schemas: [
|
|
162
|
+
{
|
|
163
|
+
'@context': 'https://schema.org',
|
|
164
|
+
'@type': 'SoftwareApplication',
|
|
165
|
+
name: title,
|
|
166
|
+
description,
|
|
167
|
+
applicationCategory: 'ForensicApplication',
|
|
168
|
+
operatingSystem: 'Any',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
'@context': 'https://schema.org',
|
|
172
|
+
'@type': 'FAQPage',
|
|
173
|
+
mainEntity: faq.map((item) => ({
|
|
174
|
+
'@type': 'Question',
|
|
175
|
+
name: item.question,
|
|
176
|
+
acceptedAnswer: {
|
|
177
|
+
'@type': 'Answer',
|
|
178
|
+
text: item.answer,
|
|
179
|
+
},
|
|
180
|
+
})),
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
'@context': 'https://schema.org',
|
|
184
|
+
'@type': 'HowTo',
|
|
185
|
+
name: title,
|
|
186
|
+
step: howTo.map((step) => ({
|
|
187
|
+
'@type': 'HowToStep',
|
|
188
|
+
name: step.name,
|
|
189
|
+
text: step.text,
|
|
190
|
+
})),
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
|
|
4
|
+
const slug = 'widmark-blood-alcohol-simulator';
|
|
5
|
+
const title = '魏德马克血液酒精浓度模拟器';
|
|
6
|
+
const description = '使用魏德马克公式模拟人体内乙醇的吸收、分布和代谢消除过程。';
|
|
7
|
+
|
|
8
|
+
const howTo = [
|
|
9
|
+
{
|
|
10
|
+
name: '配置身体物理参数',
|
|
11
|
+
text: '输入体重、生物学性别与脱水状况。这些生理特征直接计算魏德马克稀释因子(r),它决定了乙醇在体内的分布容积。',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: '设定胃部饱腹状态',
|
|
15
|
+
text: '可选择空腹、适量饮食或饱腹。该设置动态调整吸收速率常数(ka),用以展示食物对血液酒精浓度曲线的减缓与延迟作用。',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: '在时间线上添加饮酒记录',
|
|
19
|
+
text: '通过指定毫升数体积、酒精体积分数百分比(ABV)以及相对于模拟开始的饮酒小时来添加单次饮酒记录。',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: '分析生成的血液酒精浓度曲线',
|
|
23
|
+
text: '观察并检查12小时内的血液酒精浓度(BAC)图表。将峰值水平、达到峰值的时间以及完全清醒的总时长与标准驾车限制进行对比。',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const faq = [
|
|
28
|
+
{
|
|
29
|
+
key: 'faq-1',
|
|
30
|
+
question: '什么是魏德马克公式?它在法医科学中如何被应用?',
|
|
31
|
+
answer: '魏德马克公式是由 Erik M. P. Widmark 于 1932 年提出的一种经典数学模型。它基于摄入的纯酒精质量、体重、生物学分布系数(r)和随时间推移的线性消除速率来估算血液酒精浓度。法医毒物化学家在实际案情中常使用此公式进行逆向计算,以推算涉案人员在事故发生精确时刻的血液酒精浓度。',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: 'faq-2',
|
|
35
|
+
question: '胃部食物是如何影响血液酒精浓度(BAC)曲线形状的?',
|
|
36
|
+
answer: '胃内的食物会延缓胃排空进程,从而阻碍酒精迅速进入拥有巨大吸收表面积的小肠。在模拟器中,这一延迟效应通过降低吸收速率常数(ka)进行数学建模,其结果表现为 BAC 曲线峰值向后推迟,且最大峰值浓度显著降低。',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'faq-3',
|
|
40
|
+
question: '为什么酒精从体内的清除遵循零级动力学而非一级动力学?',
|
|
41
|
+
answer: '多数药物的清除遵循一级代谢动力学,即清除速率与血药浓度成正比。但酒精的消除遵循零级动力学,因为肝脏中负责代谢酒精的主要酶(乙醇脱氢酶,简称ADH)在非常低的血液酒精浓度下(约 0.02 g/L)就已经处于完全饱和状态。因此,肝脏以恒定的最大速度降解酒精,无论摄入量有多少。',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: 'faq-4',
|
|
45
|
+
question: '哪些生物学因素会导致魏德马克稀释因子 r 的个体差异?',
|
|
46
|
+
answer: '魏德马克稀释因子(r)代表体水分与总体重的比例。由于乙醇极易溶于水而不易溶于脂肪,因此它仅分布在体水分中。肌肉组织水分含量较高(约 75%),而脂肪组织含水量极低。因此,体脂率较高或处于脱水状态的个体其稀释因子 r 较小,摄入相同量酒精时产生的 BAC 峰值更高。',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: 'faq-5',
|
|
50
|
+
question: '我可以使用该模拟器来从法律上证明我清醒并可以安全驾驶吗?',
|
|
51
|
+
answer: '绝对不行。本模拟器仅用于教学与科普展示。在实际生活中,个体的肝脏健康状况、基因多态性、药物相互作用、睡眠不足、精神压力及胃肠道物理状态均能引入极大的误差。严禁将此模拟结果作为决定饮酒后能否驾驶的法律依据。',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
export const content: ToolLocaleContent = {
|
|
56
|
+
slug,
|
|
57
|
+
title,
|
|
58
|
+
description,
|
|
59
|
+
ui: {
|
|
60
|
+
subjectProfile: '个人身体参数',
|
|
61
|
+
weight: '体重 (kg)',
|
|
62
|
+
sex: '生物学性别',
|
|
63
|
+
male: '男性',
|
|
64
|
+
female: '女性',
|
|
65
|
+
hydration: '水分状态',
|
|
66
|
+
hydrationLow: '脱水/偏低',
|
|
67
|
+
hydrationNormal: '正常',
|
|
68
|
+
hydrationHigh: '充沛/偏高',
|
|
69
|
+
stomachState: '胃部状态',
|
|
70
|
+
stomachEmpty: '空腹 (吸收较快)',
|
|
71
|
+
stomachLight: '适量进食 (吸收中等)',
|
|
72
|
+
stomachFull: '饱腹 (吸收减缓)',
|
|
73
|
+
drinksTimeline: '饮酒时间线',
|
|
74
|
+
addDrink: '添加饮品',
|
|
75
|
+
drinkVolume: '容量 (毫升)',
|
|
76
|
+
drinkAbv: '酒精度 (% vol)',
|
|
77
|
+
drinkTime: '时间 (小时)',
|
|
78
|
+
drinksList: '已添加饮品',
|
|
79
|
+
remove: '移除',
|
|
80
|
+
beer: '啤酒 (330ml, 5%)',
|
|
81
|
+
wine: '葡萄酒 (150ml, 12%)',
|
|
82
|
+
spirits: '烈酒 (40ml, 40%)',
|
|
83
|
+
peakBac: 'BAC峰值',
|
|
84
|
+
timeToSober: '完全解酒时间',
|
|
85
|
+
sober: '清醒',
|
|
86
|
+
currentBac: '当前 BAC',
|
|
87
|
+
drivingLimitAlert: '驾驶状态',
|
|
88
|
+
safeLimit: '低于限制',
|
|
89
|
+
warningLimit: '超出预警限制',
|
|
90
|
+
dangerLimit: '超出醉驾限制',
|
|
91
|
+
graphTitle: '12小时血液酒精浓度变化曲线',
|
|
92
|
+
timeAxisLabel: '时间 (小时)',
|
|
93
|
+
bacAxisLabel: '浓度 (g/L)',
|
|
94
|
+
legalLimitText: '标准酒驾限制值',
|
|
95
|
+
noDrinksText: '添加饮品以生成模拟曲线。',
|
|
96
|
+
hours: '小时',
|
|
97
|
+
soberStatus: '{time} 小时内清醒',
|
|
98
|
+
neverSober: '超出 12小时 窗口',
|
|
99
|
+
noteDisclaimer: '本模拟器仅用于教学展示。饮酒后切勿驾车。',
|
|
100
|
+
noteWidmark: '基于魏德马克公式和零级消除动力学。',
|
|
101
|
+
},
|
|
102
|
+
seo: [
|
|
103
|
+
{
|
|
104
|
+
type: 'title',
|
|
105
|
+
text: '法医毒物化学与乙醇体内动力学',
|
|
106
|
+
level: 2,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'paragraph',
|
|
110
|
+
html: '理解乙醇在人体内的<strong>吸收、分布与代谢消除过程</strong>是法医学和交通事故分析的核心基础。当人饮酒时,酒精经食道进入胃部,只有极少部分直接在此处被血液吸收。由于小肠拥有极大的表面积,绝大多数的乙醇吸收发生于十二指肠和空肠。胃排空进入小肠的速度是酒精吸收的主要限速步骤,这解释了为什么胃部食物会对酒精吸收曲线起到明显的平缓与缓冲作用。',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: '本交互式模拟器基于 Erik M. P. Widmark 的经典公式,结合连续房室模拟模型展示12小时内的酒精浓度变化。通过调整被测个体的生理参数并添加饮酒记录,用户能直观观察到酒精的数学累积与肝脏零级代谢的线性衰减。',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: 'title',
|
|
118
|
+
text: '魏德马克公式的数学推导与计算',
|
|
119
|
+
level: 3,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: '经典的魏德马克方程在假定酒精被瞬间吸收和分布的理想状态下,计算理论上的最大血液酒精浓度:<strong>BAC = (A / (W * r)) - (β * t)</strong>。其中,<em>A</em> 表示所摄入纯乙醇的质量(以克为单位),<em>W</em> 是主体的体重(公斤),而 <em>r</em> 是魏德马克分布系数。参数 <em>β</em> 表示每小时血液酒精浓度的消除速度,而 <em>t</em> 是自吸收开始后经历的时间。',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: '要将饮品的液体毫升体积转化为纯乙醇质量克数,我们将毫升体积乘以酒精百分比(ABV)再乘以乙醇的密度(约 0.8 g/ml)。例如,330 ml 的 5% ABV 啤酒包含:330 * 0.05 * 0.8 = 13.2 克纯乙醇。这部分酒精将被体水分稀释。模拟器根据性别(男性的标准基准值为 0.68,女性因脂肪占比较高,基准值为 0.55)以及脱水程度动态调整 r 系数。',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'title',
|
|
131
|
+
text: '物理因素对分布容积和胃排空常数的影响',
|
|
132
|
+
level: 3,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'paragraph',
|
|
136
|
+
html: '乙醇的分布容积直接由身体的解剖组成决定。酒精高度亲水而疏水(不溶于脂质)。肌肉组织含有约 75% 的水,而脂肪组织几乎不含水。所以同等体重下,肌肉发达的个体拥有更大的稀释因子 r,其所达到的峰值 BAC 明显低于体脂率较高的个体。此外,急性脱水会缩减体内总自由水空间,使得相同的酒精剂量稀释空间变小,从而导致 BAC 曲线整体上抬。',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'table',
|
|
140
|
+
headers: ['生理学变量', '生物化学机制', '药代动力学影响', '法医学及审判意义'],
|
|
141
|
+
rows: [
|
|
142
|
+
['总体重', '决定身体总稀释水池的大小。', '与最大峰值 BAC 浓度成反比。', '为血液酒精浓度的逆向推导计算建立基础体积。'],
|
|
143
|
+
['生物学性别', '决定典型的肌肉与脂肪比率。', '女性的 r 系数(0.55)低于男性(0.68),因而产生更高 BAC。', '解释了为什么同等饮酒量下女性更容易出现较高醉酒程度。'],
|
|
144
|
+
['水分状态', '改变体内组织中可自由利用的水分体积。', '脱水会导致 r 下降约 0.05,进而显著拉高 BAC 曲线。', '用于校正高温环境下劳动或运动后的酒精估算精度。'],
|
|
145
|
+
['胃部状态', '食物能够有效阻碍胃排空,滞留酒精在胃内。', '大幅降低吸收速度常数 ka,使 BAC 曲线的峰值平坦并延后。', '合理解释了饱腹饮酒后测量出的偏低酒精数值。'],
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'title',
|
|
150
|
+
text: '代谢消除动力学:恒速零级肝脏清除率',
|
|
151
|
+
level: 3,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'paragraph',
|
|
155
|
+
html: '酒精在体内分布后,主要由肝脏中乙醇脱氢酶(ADH)代谢为乙醛。因为该酶系统极其高效,在血液酒精浓度达到极低值(0.02 g/L)时就已被彻底饱和。这导致了零级动力学代谢特征,即单位时间内清除固定质量的酒精。法医毒物化学中普遍采用的平均消除速率(β<sub>60</sub>)为每小时 0.15 g/L,这产生了解酒过程中特征性的线性下降斜率。',
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
faq,
|
|
159
|
+
bibliography,
|
|
160
|
+
howTo,
|
|
161
|
+
schemas: [
|
|
162
|
+
{
|
|
163
|
+
'@context': 'https://schema.org',
|
|
164
|
+
'@type': 'SoftwareApplication',
|
|
165
|
+
name: title,
|
|
166
|
+
description,
|
|
167
|
+
applicationCategory: 'ForensicApplication',
|
|
168
|
+
operatingSystem: 'Any',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
'@context': 'https://schema.org',
|
|
172
|
+
'@type': 'FAQPage',
|
|
173
|
+
mainEntity: faq.map((item) => ({
|
|
174
|
+
'@type': 'Question',
|
|
175
|
+
name: item.question,
|
|
176
|
+
acceptedAnswer: {
|
|
177
|
+
'@type': 'Answer',
|
|
178
|
+
text: item.answer,
|
|
179
|
+
},
|
|
180
|
+
})),
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
'@context': 'https://schema.org',
|
|
184
|
+
'@type': 'HowTo',
|
|
185
|
+
name: title,
|
|
186
|
+
step: howTo.map((step) => ({
|
|
187
|
+
'@type': 'HowToStep',
|
|
188
|
+
name: step.name,
|
|
189
|
+
text: step.text,
|
|
190
|
+
})),
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { widmarkAlcoholSimulator } from './entry';
|
|
2
|
+
import type { ToolDefinition } from '../../types';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const WIDMARK_ALCOHOL_SIMULATOR_TOOL: ToolDefinition = {
|
|
7
|
+
entry: widmarkAlcoholSimulator,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export interface SubjectProfile {
|
|
2
|
+
weight: number;
|
|
3
|
+
sex: 'male' | 'female';
|
|
4
|
+
hydration: 'low' | 'normal' | 'high';
|
|
5
|
+
stomach: 'empty' | 'light' | 'full';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface DrinkInput {
|
|
9
|
+
volume: number;
|
|
10
|
+
abv: number;
|
|
11
|
+
time: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface BacDatapoint {
|
|
15
|
+
time: number;
|
|
16
|
+
bac: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface WidmarkResult {
|
|
20
|
+
datapoints: BacDatapoint[];
|
|
21
|
+
peakBac: number;
|
|
22
|
+
peakTime: number;
|
|
23
|
+
soberTime: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class WidmarkEngine {
|
|
27
|
+
private static readonly ETHANOL_DENSITY = 0.8;
|
|
28
|
+
private static readonly BASE_BETA_60 = 0.15;
|
|
29
|
+
|
|
30
|
+
private static getWidmarkFactor(sex: 'male' | 'female', hydration: 'low' | 'normal' | 'high'): number {
|
|
31
|
+
let r = sex === 'male' ? 0.68 : 0.55;
|
|
32
|
+
if (hydration === 'low') {
|
|
33
|
+
r -= 0.05;
|
|
34
|
+
} else if (hydration === 'high') {
|
|
35
|
+
r += 0.05;
|
|
36
|
+
}
|
|
37
|
+
return r;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private static getAbsorptionRate(stomach: 'empty' | 'light' | 'full'): number {
|
|
41
|
+
if (stomach === 'empty') return 4.0;
|
|
42
|
+
if (stomach === 'light') return 2.0;
|
|
43
|
+
return 1.0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private static getDrinksMap(drinks: DrinkInput[], timeStep: number): Map<number, number> {
|
|
47
|
+
const drinksMap = new Map<number, number>();
|
|
48
|
+
for (const drink of drinks) {
|
|
49
|
+
const timeSlot = Math.round(drink.time / timeStep) * timeStep;
|
|
50
|
+
const alcoholGrams = drink.volume * (drink.abv / 100) * this.ETHANOL_DENSITY;
|
|
51
|
+
drinksMap.set(timeSlot, (drinksMap.get(timeSlot) || 0) + alcoholGrams);
|
|
52
|
+
}
|
|
53
|
+
return drinksMap;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private static step(
|
|
57
|
+
stomachGrams: number,
|
|
58
|
+
params: { ka: number; elimGrams: number; wr: number },
|
|
59
|
+
state: { stomach: number; blood: number }
|
|
60
|
+
): number {
|
|
61
|
+
state.stomach += stomachGrams;
|
|
62
|
+
const absorbed = state.stomach * (1 - Math.exp(-params.ka * 0.05));
|
|
63
|
+
state.stomach -= absorbed;
|
|
64
|
+
state.blood += absorbed;
|
|
65
|
+
state.blood -= Math.min(params.elimGrams * 0.05, state.blood);
|
|
66
|
+
return Number((state.blood / params.wr).toFixed(3));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public static simulate(profile: SubjectProfile, drinks: DrinkInput[]): WidmarkResult {
|
|
70
|
+
const r = this.getWidmarkFactor(profile.sex, profile.hydration);
|
|
71
|
+
const wr = profile.weight * r;
|
|
72
|
+
const params = { ka: this.getAbsorptionRate(profile.stomach), elimGrams: this.BASE_BETA_60 * wr, wr };
|
|
73
|
+
const drinksMap = this.getDrinksMap(drinks, 0.05);
|
|
74
|
+
const datapoints: BacDatapoint[] = [];
|
|
75
|
+
const state = { stomach: 0, blood: 0 };
|
|
76
|
+
let peakBac = 0;
|
|
77
|
+
let peakTime = 0;
|
|
78
|
+
let soberTime = -1;
|
|
79
|
+
|
|
80
|
+
for (let step = 0; step <= 240; step++) {
|
|
81
|
+
const t = Number((step * 0.05).toFixed(2));
|
|
82
|
+
const bac = this.step(drinksMap.get(t) || 0, params, state);
|
|
83
|
+
datapoints.push({ time: t, bac });
|
|
84
|
+
if (bac > peakBac) {
|
|
85
|
+
peakBac = bac;
|
|
86
|
+
peakTime = t;
|
|
87
|
+
}
|
|
88
|
+
if (bac > 0) soberTime = t;
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
datapoints,
|
|
92
|
+
peakBac: Number(peakBac.toFixed(3)),
|
|
93
|
+
peakTime,
|
|
94
|
+
soberTime: soberTime >= 11.94 ? -2 : soberTime,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { widmarkAlcoholSimulator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const content = await widmarkAlcoholSimulator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|