@jjlmoya/utils-aquarium 1.0.0 → 1.53.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 (29) hide show
  1. package/package.json +13 -4
  2. package/src/category/i18n/zh.ts +1 -1
  3. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  4. package/src/tests/i18n_coverage.test.ts +1 -1
  5. package/src/tests/seo_wellformed_export.test.ts +65 -0
  6. package/src/tool/aquariumTankVolumeWaterChangeCalculator/aquarium-tank-volume-water-change-calculator.css +107 -56
  7. package/src/tool/aquariumTankVolumeWaterChangeCalculator/bibliography.ts +6 -6
  8. package/src/tool/aquariumTankVolumeWaterChangeCalculator/component.astro +24 -39
  9. package/src/tool/aquariumTankVolumeWaterChangeCalculator/controller.ts +90 -39
  10. package/src/tool/aquariumTankVolumeWaterChangeCalculator/dom-views.ts +19 -11
  11. package/src/tool/aquariumTankVolumeWaterChangeCalculator/entry.ts +14 -0
  12. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/de.ts +34 -0
  13. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/en.ts +8 -8
  14. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/es.ts +34 -0
  15. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/fr.ts +34 -0
  16. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/id.ts +34 -0
  17. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/it.ts +34 -0
  18. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/ja.ts +34 -0
  19. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/ko.ts +34 -0
  20. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/nl.ts +34 -0
  21. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/pl.ts +34 -0
  22. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/pt.ts +34 -0
  23. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/ru.ts +34 -0
  24. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/sv.ts +34 -0
  25. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/tr.ts +34 -0
  26. package/src/tool/aquariumTankVolumeWaterChangeCalculator/i18n/zh.ts +34 -0
  27. package/src/tool/aquariumTankVolumeWaterChangeCalculator/localized-content.ts +60 -0
  28. package/src/tool/aquariumTankVolumeWaterChangeCalculator/logic.test.ts +10 -0
  29. package/src/tool/aquariumTankVolumeWaterChangeCalculator/ui.ts +3 -3
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'ko',
5
+ slug: 'aquarium-tank-volume-water-change-calculator',
6
+ title: '수조 용량 및 환수량 계산기',
7
+ description: '수조 내부 치수와 바닥재 두께를 입력해 실제 사용 가능한 물의 양, 환수량, 물의 무게를 계산합니다.',
8
+ faq: [
9
+ { question: '제품에 표시된 수조 용량을 그대로 사용하나요?', answer: '아니요. 기하학적 용량에서 바닥재가 차지하는 공간을 빼서 실제로 사용할 수 있는 물의 양을 추정합니다.' },
10
+ { question: '곡면 전면 수조는 어떻게 계산하나요?', answer: '직사각형 바닥에 원형 구간의 근사치를 더합니다. 유리 곡선은 제품마다 다르므로 결과는 참고용입니다.' },
11
+ { question: '어떤 단위를 사용할 수 있나요?', answer: '미터법에서는 센티미터, 리터, 킬로그램을 표시하고 임페리얼에서는 인치, 갤런, 파운드를 표시합니다.' },
12
+ { question: '환수 주기도 추천하나요?', answer: '아니요. 입력한 비율에 해당하는 양만 계산하며 수질이나 생물 수를 판단하지 않습니다.' },
13
+ { question: '입력한 데이터가 외부로 전송되나요?', answer: '아니요. 계산은 브라우저에서 이루어지고 마지막 설정은 이 브라우저에만 저장할 수 있습니다.' },
14
+ ],
15
+ howTo: [
16
+ { name: '수조 형태 선택', text: '직사각형, 원통형 또는 곡면 전면을 선택합니다. 선택한 형태에 필요한 입력만 표시됩니다.' },
17
+ { name: '내부 치수 입력', text: '길이, 너비, 높이를 입력하거나 원통형이면 지름과 높이를 입력합니다. 가능한 한 유리 안쪽을 측정하세요.' },
18
+ { name: '바닥재 두께 입력', text: '경사진 바닥재는 여러 지점에서 측정해 평균 두께를 입력합니다. 이 공간은 총 용량에서 빠집니다.' },
19
+ { name: '환수 비율 입력', text: '교체할 비율을 입력합니다. 해당 물의 양과 물 무게의 근사값이 표시됩니다.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: '수조에 실제로 들어 있는 물의 양 계산', level: 2 },
23
+ { type: 'paragraph', html: '제품에 적힌 용량은 수조를 가득 채운 값인 경우가 많습니다. 환수나 첨가제 양을 정할 때는 내부 치수에서 바닥재가 차지하는 공간을 뺀 실제 작업용 물의 양이 더 유용합니다.' },
24
+ { type: 'title', text: '형태에 맞는 계산식 사용', level: 2 },
25
+ { type: 'list', items: ['<strong>직사각형:</strong> 길이×너비×높이로 계산합니다.', '<strong>원통형:</strong> 반지름의 제곱×원주율×높이로 계산합니다.', '<strong>곡면 전면:</strong> 직사각형 바닥에 곡면 구간의 근사치를 더합니다.'] },
26
+ { type: 'title', text: '외부 치수 대신 내부를 측정', level: 2 },
27
+ { type: 'paragraph', html: '유리 안쪽을 측정하세요. 바닥재가 기울어져 있다면 여러 지점의 평균을 사용합니다. 매우 불규칙한 수조는 알려진 용량의 용기로 실제로 채워 보는 방법이 기하학적 근사보다 정확할 수 있습니다.' },
28
+ { type: 'tip', title: '환수량 해석', html: '<p>환수량은 입력한 비율을 실제 작업용 물의 양에 적용한 결과입니다. 수온, 염도, 유목과 장식물은 물의 실제 무게를 조금 바꿀 수 있습니다.</p>' },
29
+ { type: 'table', headers: ['결과', '의미'], rows: [['총 용량', '바닥재를 빼기 전 기하학적 용량'], ['바닥재 공간', '바닥재가 차지한다고 추정한 공간'], ['사용 가능 물', '바닥재를 뺀 작업용 물의 양'], ['환수량', '사용 가능 물에 입력 비율을 적용한 양']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: '수조 설정', dimensionsTitle: '수조 치수', shapeLabel: '수조 형태', rectangularShape: '직사각형', cylindricalShape: '원통형', bowShape: '곡면 전면', lengthLabel: '내부 길이', widthLabel: '내부 너비', heightLabel: '내부 높이', diameterLabel: '내부 지름', bowDepthLabel: '전면 곡선 깊이', substrateLabel: '바닥재 두께', changeLabel: '환수', unitLabel: '단위', metricLabel: '미터법', imperialLabel: '임페리얼', resetLabel: '초기화', grossVolumeLabel: '총 용량', substrateVolumeLabel: '바닥재 공간', netVolumeLabel: '사용 가능 물', changeVolumeLabel: '교체할 물', waterWeightLabel: '물의 무게', emptyState: '치수를 조정하면 수위가 표시됩니다.', invalidState: '치수를 확인하세요. 양수를 사용하고 바닥재를 수조 높이보다 낮게 입력하며 환수 비율은 0에서 100퍼센트 사이여야 합니다.', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'in', shapeHint: '내부 치수를 사용하면 더 유용한 추정값을 얻을 수 있습니다.', bowHint: '곡면 전면은 투명한 근사 계산을 사용합니다.', substrateHint: '이 두께를 총 용량에서 뺍니다.', resultHint: '입력하는 동안 결과가 업데이트됩니다.', approximationLabel: '바닥재 비율', footprintLabel: '바닥 면적', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: '소형', compact: '표준', roomy: '대형', showcase: '초대형',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'nl',
5
+ slug: 'aquarium-inhoud-waterwissel-calculator',
6
+ title: 'Aquariuminhoud en waterwissel calculator',
7
+ description: 'Bereken de bruikbare waterinhoud, de ruimte van de bodem en de hoeveelheid water voor een wissel met de binnenmaten van je aquarium.',
8
+ faq: [
9
+ { question: 'Gebruikt de calculator de inhoud op de verpakking?', answer: 'Nee. De hoogte van de bodem wordt van de geometrische inhoud afgetrokken, zodat je een schatting van het bruikbare water krijgt.' },
10
+ { question: 'Hoe werkt de optie met gebogen voorkant?', answer: 'Er wordt een geschat cirkelsegment aan de rechthoekige bodem toegevoegd. De uitkomst blijft een benadering omdat glasprofielen verschillen.' },
11
+ { question: 'Welke eenheden zijn beschikbaar?', answer: 'Metrisch toont centimeter, liter en kilogram. Imperiaal toont inch, gallon en pond.' },
12
+ { question: 'Adviseert de calculator een wisselschema?', answer: 'Nee. Hij past alleen het ingevoerde percentage toe en beoordeelt geen waterkwaliteit of bezetting.' },
13
+ { question: 'Verlaten mijn gegevens de browser?', answer: 'Nee. De berekening gebeurt lokaal en de laatste instellingen kunnen lokaal in deze browser worden bewaard.' },
14
+ ],
15
+ howTo: [
16
+ { name: 'Kies de aquariumvorm', text: 'Kies rechthoekig, cilindrisch of gebogen front. Daarna verschijnen alleen de maten die voor die vorm nodig zijn.' },
17
+ { name: 'Voer de binnenmaten in', text: 'Voer lengte, breedte en hoogte in, of diameter en hoogte voor een cilinder. Binnenmaten geven de bruikbaarste schatting.' },
18
+ { name: 'Vul de bodemdikte in', text: 'Meet de gemiddelde dikte van de bodem en voer die in. Deze laag wordt van de bruto-inhoud afgetrokken.' },
19
+ { name: 'Stel het wisselpercentage in', text: 'Voer het percentage in dat je wilt vervangen. De calculator toont het volume en een geschat gewicht.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: 'Hoeveel water zit er echt in je aquarium?', level: 2 },
23
+ { type: 'paragraph', html: 'De inhoud op een doos gaat vaak uit van een volledig gevuld aquarium. Voor dosering, verwarming en waterwissels is de bruikbare inhoud belangrijker: binnenmaten minus de ruimte van de bodem.' },
24
+ { type: 'title', text: 'Een formule voor elke vorm', level: 2 },
25
+ { type: 'list', items: ['<strong>Rechthoekig:</strong> lengte maal breedte maal hoogte.', '<strong>Cilindrisch:</strong> grondvlak met pi maal straal in het kwadraat maal hoogte.', '<strong>Gebogen front:</strong> rechthoekig grondvlak plus een geschat cirkelsegment.'] },
26
+ { type: 'title', text: 'Meet de binnenkant', level: 2 },
27
+ { type: 'paragraph', html: 'Meet vanaf de binnenkant van het glas. Meet een hellende bodem op meerdere punten en gebruik het gemiddelde. Bij een sterk onregelmatige vorm kan vullen met een vat met bekende inhoud nauwkeuriger zijn dan een geometrische schatting.' },
28
+ { type: 'tip', title: 'Gebruik het resultaat als werkvolume', html: '<p>De wisselhoeveelheid volgt het ingevoerde percentage. Temperatuur, zoutgehalte en decoratie kunnen het werkelijke gewicht van het water iets veranderen.</p>' },
29
+ { type: 'table', headers: ['Resultaat', 'Betekenis'], rows: [['Bruto-inhoud', 'Geometrische inhoud vóór de bodem'], ['Bodemverdringing', 'Geschatte ruimte van de bodemlaag'], ['Bruikbaar watervolume', 'Werkvolume na aftrek van de bodem'], ['Waterwissel', 'Het ingevoerde percentage van het werkvolume']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: 'Aquarium instellen', dimensionsTitle: 'Aquariummaten', shapeLabel: 'Aquariumvorm', rectangularShape: 'Rechthoekig', cylindricalShape: 'Cilindrisch', bowShape: 'Gebogen front', lengthLabel: 'Binnenlengte', widthLabel: 'Binnenbreedte', heightLabel: 'Binnenhoogte', diameterLabel: 'Binnendiameter', bowDepthLabel: 'Diepte van de frontboog', substrateLabel: 'Bodemdikte', changeLabel: 'Waterwissel', unitLabel: 'Eenheden', metricLabel: 'Metrisch', imperialLabel: 'Imperiaal', resetLabel: 'Wissen', grossVolumeLabel: 'Bruto-inhoud', substrateVolumeLabel: 'Bodemverdringing', netVolumeLabel: 'Bruikbaar water', changeVolumeLabel: 'Te vervangen water', waterWeightLabel: 'Watergewicht', emptyState: 'Pas de maten aan om het niveau te zien.', invalidState: 'Controleer de maten: gebruik positieve waarden, houd de bodem lager dan de bakhoogte en kies 0 tot 100 procent.', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'in', shapeHint: 'Gebruik binnenmaten voor een bruikbaardere schatting.', bowHint: 'Het gebogen front is een transparante benadering.', substrateHint: 'Deze laag wordt van de bruto-inhoud afgetrokken.', resultHint: 'Het resultaat wordt bijgewerkt tijdens het typen.', approximationLabel: 'Bodemaandeel', footprintLabel: 'Grondvlak', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: 'Nano', compact: 'Compact', roomy: 'Ruim', showcase: 'Extra groot',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'pl',
5
+ slug: 'kalkulator-pojemnosci-akwarium-podmiany-wody',
6
+ title: 'Kalkulator pojemności akwarium i podmiany wody',
7
+ description: 'Oblicz użyteczną ilość wody, przestrzeń zajętą przez podłoże oraz objętość podmiany na podstawie wewnętrznych wymiarów akwarium.',
8
+ faq: [
9
+ { question: 'Czy kalkulator używa pojemności podanej przez producenta?', answer: 'Nie. Odejmuje wysokość podłoża od objętości geometrycznej, aby oszacować rzeczywistą ilość użytecznej wody.' },
10
+ { question: 'Jak działa opcja przedniej szyby giętej?', answer: 'Do prostokątnej podstawy dodaje przybliżony wycinek koła. Wynik jest orientacyjny, ponieważ profile szyb różnią się między akwariami.' },
11
+ { question: 'Jakie jednostki są dostępne?', answer: 'Tryb metryczny pokazuje centymetry, litry i kilogramy. Tryb imperialny pokazuje cale, galony i funty.' },
12
+ { question: 'Czy kalkulator zaleca harmonogram podmian?', answer: 'Nie. Stosuje tylko podany procent i nie ocenia jakości wody ani obsady akwarium.' },
13
+ { question: 'Czy dane opuszczają przeglądarkę?', answer: 'Nie. Obliczenia działają lokalnie, a ostatnie ustawienia mogą zostać zapisane w tej przeglądarce.' },
14
+ ],
15
+ howTo: [
16
+ { name: 'Wybierz kształt akwarium', text: 'Wybierz akwarium prostokątne, cylindryczne albo z giętą przednią szybą. Zobaczysz tylko potrzebne wymiary.' },
17
+ { name: 'Wpisz wymiary wewnętrzne', text: 'Wpisz długość, szerokość i wysokość albo średnicę i wysokość dla walca. Wymiary wewnętrzne dają lepszy wynik.' },
18
+ { name: 'Uwzględnij podłoże', text: 'Zmierz średnią wysokość podłoża i wpisz ją. Ta warstwa zostanie odjęta od objętości brutto.' },
19
+ { name: 'Ustaw procent podmiany', text: 'Wpisz procent wody do wymiany. Wynik pokaże odpowiednią objętość i przybliżoną masę wody.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: 'Sprawdź, ile wody naprawdę mieści akwarium', level: 2 },
23
+ { type: 'paragraph', html: 'Pojemność z opakowania często oznacza akwarium napełnione po brzegi. Do dozowania, ogrzewania i planowania podmiany lepsza jest objętość robocza: wymiary wewnętrzne pomniejszone o miejsce zajęte przez podłoże.' },
24
+ { type: 'title', text: 'Dobierz wzór do kształtu', level: 2 },
25
+ { type: 'list', items: ['<strong>Prostokątne:</strong> długość razy szerokość razy wysokość.', '<strong>Cylindryczne:</strong> pole podstawy, pi razy kwadrat promienia, razy wysokość.', '<strong>Gięta szyba:</strong> prostokątna podstawa plus przybliżony wycinek koła.'] },
26
+ { type: 'title', text: 'Mierz od środka szyby', level: 2 },
27
+ { type: 'paragraph', html: 'Mierz wewnątrz akwarium. Jeśli podłoże jest nachylone, zmierz kilka punktów i wpisz średnią. Przy bardzo nieregularnym kształcie napełnienie zbiornika naczyniem o znanej objętości może być dokładniejsze niż przybliżenie geometryczne.' },
28
+ { type: 'tip', title: 'Jak czytać wynik podmiany', html: '<p>Objętość podmiany to wybrany procent użytecznej ilości wody. Temperatura, zasolenie oraz dekoracje mogą nieznacznie zmienić rzeczywistą masę wody.</p>' },
29
+ { type: 'table', headers: ['Wynik', 'Znaczenie'], rows: [['Objętość brutto', 'Objętość geometryczna przed odjęciem podłoża'], ['Przestrzeń podłoża', 'Szacowana objętość zajęta przez warstwę dna'], ['Użyteczna ilość wody', 'Objętość robocza po odjęciu podłoża'], ['Podmiana wody', 'Wpisany procent użytecznej ilości wody']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: 'Ustaw akwarium', dimensionsTitle: 'Wymiary akwarium', shapeLabel: 'Kształt akwarium', rectangularShape: 'Prostokątne', cylindricalShape: 'Cylindryczne', bowShape: 'Gięta szyba', lengthLabel: 'Długość wewnętrzna', widthLabel: 'Szerokość wewnętrzna', heightLabel: 'Wysokość wewnętrzna', diameterLabel: 'Średnica wewnętrzna', bowDepthLabel: 'Głębokość łuku z przodu', substrateLabel: 'Wysokość podłoża', changeLabel: 'Podmiana wody', unitLabel: 'Jednostki', metricLabel: 'Metryczne', imperialLabel: 'Imperialne', resetLabel: 'Resetuj', grossVolumeLabel: 'Objętość brutto', substrateVolumeLabel: 'Przestrzeń podłoża', netVolumeLabel: 'Użyteczna ilość wody', changeVolumeLabel: 'Woda do wymiany', waterWeightLabel: 'Masa wody', emptyState: 'Zmień wymiary, aby zobaczyć poziom.', invalidState: 'Sprawdź wymiary: użyj wartości dodatnich, podłoże musi być niższe niż zbiornik, a podmiana musi wynosić od 0 do 100 procent.', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'cale', shapeHint: 'Użyj wymiarów wewnętrznych, aby uzyskać praktyczniejsze oszacowanie.', bowHint: 'Gięta szyba używa przejrzystego przybliżenia.', substrateHint: 'Ta warstwa jest odejmowana od objętości brutto.', resultHint: 'Wynik aktualizuje się podczas wpisywania.', approximationLabel: 'Udział podłoża', footprintLabel: 'Podstawa', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: 'Nano', compact: 'Kompaktowe', roomy: 'Duże', showcase: 'Pokazowe',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'pt',
5
+ slug: 'calculadora-volume-aquario-troca-agua',
6
+ title: 'Calculadora de volume do aquário e troca de água',
7
+ description: 'Calcule o volume útil, o espaço ocupado pelo substrato e a quantidade de água para uma troca usando as medidas internas do aquário.',
8
+ faq: [
9
+ { question: 'A calculadora usa a capacidade indicada na embalagem?', answer: 'Não. Ela subtrai a altura do substrato do volume geométrico para estimar a quantidade de água realmente disponível.' },
10
+ { question: 'Como funciona a opção de frente curva?', answer: 'Ela acrescenta um segmento circular aproximado à base retangular. O resultado é uma estimativa porque os perfis de vidro variam.' },
11
+ { question: 'Quais unidades estão disponíveis?', answer: 'O modo métrico mostra centímetros, litros e quilogramas. O modo imperial mostra polegadas, galões e libras.' },
12
+ { question: 'A calculadora recomenda uma frequência de troca?', answer: 'Não. Ela apenas aplica a porcentagem informada e não avalia a qualidade da água ou a população do aquário.' },
13
+ { question: 'Os meus dados saem do navegador?', answer: 'Não. O cálculo ocorre no navegador e as últimas configurações podem ser guardadas localmente.' },
14
+ ],
15
+ howTo: [
16
+ { name: 'Escolha o formato do aquário', text: 'Selecione retangular, cilíndrico ou frente curva. Só serão mostradas as medidas necessárias para esse formato.' },
17
+ { name: 'Informe as medidas internas', text: 'Digite comprimento, largura e altura, ou diâmetro e altura para um cilindro. As medidas internas são mais úteis.' },
18
+ { name: 'Informe a altura do substrato', text: 'Meça o substrato em vários pontos se houver inclinação e informe a média. Essa camada é retirada do volume bruto.' },
19
+ { name: 'Defina a porcentagem da troca', text: 'Digite a porcentagem que pretende substituir. O resultado mostra o volume e a massa aproximada da água.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: 'Calcule a água que realmente está no aquário', level: 2 },
23
+ { type: 'paragraph', html: 'A capacidade da embalagem costuma representar o aquário cheio até a borda. Para dosagem, aquecimento e troca de água, é melhor usar o volume de trabalho: medidas internas menos o espaço ocupado pelo substrato.' },
24
+ { type: 'title', text: 'Uma fórmula para cada formato', level: 2 },
25
+ { type: 'list', items: ['<strong>Retangular:</strong> comprimento vezes largura vezes altura.', '<strong>Cilíndrico:</strong> área da base, pi vezes o raio ao quadrado, vezes a altura.', '<strong>Frente curva:</strong> base retangular mais um segmento circular aproximado.'] },
26
+ { type: 'title', text: 'Meça por dentro do vidro', level: 2 },
27
+ { type: 'paragraph', html: 'Faça as medições no lado interno do vidro. Se o substrato for inclinado, meça vários pontos e use a média. Para um formato muito irregular, encher o aquário com um recipiente de volume conhecido pode ser mais preciso.' },
28
+ { type: 'tip', title: 'Use o resultado como volume de trabalho', html: '<p>A quantidade da troca corresponde à porcentagem aplicada ao volume útil. Temperatura, salinidade e objetos dentro do aquário podem alterar um pouco a massa real da água.</p>' },
29
+ { type: 'table', headers: ['Resultado', 'Significado'], rows: [['Volume bruto', 'Volume geométrico antes de descontar o substrato'], ['Deslocamento do substrato', 'Espaço estimado ocupado pela camada do fundo'], ['Volume útil', 'Estimativa de água após descontar o substrato'], ['Troca de água', 'Porcentagem informada aplicada ao volume útil']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: 'Configure o aquário', dimensionsTitle: 'Medidas do aquário', shapeLabel: 'Formato do aquário', rectangularShape: 'Retangular', cylindricalShape: 'Cilíndrico', bowShape: 'Frente curva', lengthLabel: 'Comprimento interno', widthLabel: 'Largura interna', heightLabel: 'Altura interna', diameterLabel: 'Diâmetro interno', bowDepthLabel: 'Profundidade da curva frontal', substrateLabel: 'Altura do substrato', changeLabel: 'Troca de água', unitLabel: 'Unidades', metricLabel: 'Métrico', imperialLabel: 'Imperial', resetLabel: 'Redefinir', grossVolumeLabel: 'Volume bruto', substrateVolumeLabel: 'Deslocamento do substrato', netVolumeLabel: 'Volume útil de água', changeVolumeLabel: 'Água a substituir', waterWeightLabel: 'Peso da água', emptyState: 'Ajuste as medidas para ver o nível.', invalidState: 'Verifique as medidas: use valores positivos, mantenha o substrato abaixo da altura e escolha uma troca entre 0 e 100 por cento.', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'pol', shapeHint: 'Use medidas internas para obter uma estimativa mais útil.', bowHint: 'A frente curva usa uma aproximação transparente.', substrateHint: 'Essa camada é subtraída do volume bruto.', resultHint: 'O resultado é atualizado enquanto você digita.', approximationLabel: 'Parte do substrato', footprintLabel: 'Base', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: 'Nano', compact: 'Compacto', roomy: 'Amplo', showcase: 'Expositor',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'ru',
5
+ slug: 'kalkulyator-obema-akvariuma-podmeny-vody',
6
+ title: 'Калькулятор объема аквариума и подмены воды',
7
+ description: 'Рассчитайте полезный объем, место, занятое грунтом, и количество воды для подмены по внутренним размерам аквариума.',
8
+ faq: [
9
+ { question: 'Калькулятор использует объем с упаковки?', answer: 'Нет. Он вычитает высоту грунта из геометрического объема и оценивает фактическое количество доступной воды.' },
10
+ { question: 'Как работает форма с панорамным передним стеклом?', answer: 'Она добавляет к прямоугольному основанию приблизительный круговой сегмент. Это оценка, поскольку профили стекла различаются.' },
11
+ { question: 'Какие единицы доступны?', answer: 'В метрическом режиме используются сантиметры, литры и килограммы. В имперском режиме используются дюймы, галлоны и фунты.' },
12
+ { question: 'Калькулятор подсказывает частоту подмен?', answer: 'Нет. Он применяет указанную процентную долю и не оценивает качество воды или состав населения аквариума.' },
13
+ { question: 'Мои данные покидают браузер?', answer: 'Нет. Расчет выполняется в браузере, а последние настройки могут храниться локально.' },
14
+ ],
15
+ howTo: [
16
+ { name: 'Выберите форму аквариума', text: 'Выберите прямоугольную, цилиндрическую или панорамную форму. Появятся только размеры, нужные для выбранной формы.' },
17
+ { name: 'Введите внутренние размеры', text: 'Введите длину, ширину и высоту либо диаметр и высоту цилиндра. Внутренние размеры дают более полезную оценку.' },
18
+ { name: 'Укажите высоту грунта', text: 'При наклонном грунте измерьте несколько точек и введите среднее значение. Этот слой вычитается из общего объема.' },
19
+ { name: 'Задайте процент подмены', text: 'Введите процент воды, который хотите заменить. Результат покажет объем и примерную массу воды.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: 'Рассчитайте фактический объем воды в аквариуме', level: 2 },
23
+ { type: 'paragraph', html: 'Объем на упаковке обычно означает заполнение до самого верха. Для дозировки препаратов, нагрева и подмены лучше использовать рабочий объем: внутренние размеры за вычетом пространства, занятого грунтом.' },
24
+ { type: 'title', text: 'Для каждой формы применяется своя формула', level: 2 },
25
+ { type: 'list', items: ['<strong>Прямоугольный:</strong> длина умножить на ширину и высоту.', '<strong>Цилиндрический:</strong> площадь основания, пи умножить на квадрат радиуса, умножить на высоту.', '<strong>Панорамный:</strong> прямоугольное основание плюс приблизительный круговой сегмент.'] },
26
+ { type: 'title', text: 'Измеряйте внутри стекла', level: 2 },
27
+ { type: 'paragraph', html: 'Проводите измерения по внутренней стороне стекла. Если грунт наклонен, измерьте несколько мест и используйте среднее. Для очень сложной формы точнее может быть наполнение емкостью известного объема.' },
28
+ { type: 'tip', title: 'Используйте результат как рабочий объем', html: '<p>Объем подмены равен указанному проценту от полезного объема. Температура, соленость и предметы внутри аквариума могут немного изменить фактическую массу воды.</p>' },
29
+ { type: 'table', headers: ['Результат', 'Значение'], rows: [['Общий объем', 'Геометрический объем до вычитания грунта'], ['Объем грунта', 'Оценочное пространство, занятое донным слоем'], ['Полезный объем', 'Оценка воды после вычитания грунта'], ['Подмена воды', 'Указанный процент от полезного объема']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: 'Настройте аквариум', dimensionsTitle: 'Размеры аквариума', shapeLabel: 'Форма аквариума', rectangularShape: 'Прямоугольный', cylindricalShape: 'Цилиндрический', bowShape: 'Панорамный', lengthLabel: 'Внутренняя длина', widthLabel: 'Внутренняя ширина', heightLabel: 'Внутренняя высота', diameterLabel: 'Внутренний диаметр', bowDepthLabel: 'Глубина передней дуги', substrateLabel: 'Высота грунта', changeLabel: 'Подмена воды', unitLabel: 'Единицы', metricLabel: 'Метрические', imperialLabel: 'Имперские', resetLabel: 'Сбросить', grossVolumeLabel: 'Общий объем', substrateVolumeLabel: 'Объем грунта', netVolumeLabel: 'Полезный объем воды', changeVolumeLabel: 'Воды к замене', waterWeightLabel: 'Масса воды', emptyState: 'Измените размеры, чтобы увидеть уровень.', invalidState: 'Проверьте размеры: используйте положительные значения, грунт должен быть ниже высоты, а подмена должна быть от 0 до 100 процентов.', litreUnit: 'л', gallonUnit: 'gal', kilogramUnit: 'кг', poundUnit: 'фунт', lengthUnitMetric: 'см', lengthUnitImperial: 'дюйм', shapeHint: 'Используйте внутренние размеры для более полезной оценки.', bowHint: 'Панорамная форма использует понятное приближение.', substrateHint: 'Этот слой вычитается из общего объема.', resultHint: 'Результат обновляется во время ввода.', approximationLabel: 'Доля грунта', footprintLabel: 'Площадь основания', squareMetreUnit: 'м²', squareFootUnit: 'ft²', nano: 'Нано', compact: 'Компактный', roomy: 'Просторный', showcase: 'Выставочный',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'sv',
5
+ slug: 'akvarievolym-vattenbyte-kalkylator',
6
+ title: 'Kalkylator för akvarievolym och vattenbyte',
7
+ description: 'Räkna ut användbar vattenvolym, substratets utrymme och mängden vatten för ett byte med akvariets invändiga mått.',
8
+ faq: [
9
+ { question: 'Använder kalkylatorn volymen från förpackningen?', answer: 'Nej. Den drar av substratets höjd från den geometriska volymen för att uppskatta den tillgängliga vattenmängden.' },
10
+ { question: 'Hur fungerar formen med välvd front?', answer: 'Den lägger till ett ungefärligt cirkelsegment till den rektangulära basen. Resultatet är en uppskattning eftersom glasprofiler varierar.' },
11
+ { question: 'Vilka enheter finns?', answer: 'Metriskt läge visar centimeter, liter och kilogram. Engelskt läge visar tum, gallon och pund.' },
12
+ { question: 'Rekommenderar kalkylatorn hur ofta jag ska byta vatten?', answer: 'Nej. Den använder bara den angivna procentandelen och bedömer inte vattenkvalitet eller akvariets invånare.' },
13
+ { question: 'Lämnar mina uppgifter webbläsaren?', answer: 'Nej. Beräkningen sker i webbläsaren och de senaste inställningarna kan sparas lokalt.' },
14
+ ],
15
+ howTo: [
16
+ { name: 'Välj akvariets form', text: 'Välj rektangulär, cylindrisk eller välvd front. Endast måtten för den valda formen visas.' },
17
+ { name: 'Ange invändiga mått', text: 'Skriv in längd, bredd och höjd, eller diameter och höjd för en cylinder. Invändiga mått ger en bättre uppskattning.' },
18
+ { name: 'Ange substratets höjd', text: 'Mät på flera ställen om substratet lutar och ange medelvärdet. Lagret dras av från bruttovolymen.' },
19
+ { name: 'Ange bytesprocent', text: 'Skriv in hur många procent du vill byta. Resultatet visar volymen och vattnets ungefärliga massa.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: 'Räkna ut hur mycket vatten akvariet faktiskt rymmer', level: 2 },
23
+ { type: 'paragraph', html: 'Volymen på förpackningen avser ofta ett helt fyllt akvarium. För dosering, uppvärmning och vattenbyte är arbetsvolymen mer användbar: invändiga mått minus utrymmet som substratet tar.' },
24
+ { type: 'title', text: 'En formel för varje akvarieform', level: 2 },
25
+ { type: 'list', items: ['<strong>Rektangulär:</strong> längd gånger bredd gånger höjd.', '<strong>Cylindrisk:</strong> basytan, pi gånger radien i kvadrat, gånger höjden.', '<strong>Välvd front:</strong> rektangulär bas plus ett ungefärligt cirkelsegment.'] },
26
+ { type: 'title', text: 'Mät på insidan av glaset', level: 2 },
27
+ { type: 'paragraph', html: 'Mät på glasets insida. Om substratet lutar bör du mäta på flera ställen och använda medelvärdet. För en mycket oregelbunden form kan en behållare med känd volym ge bättre precision.' },
28
+ { type: 'tip', title: 'Använd resultatet som arbetsvolym', html: '<p>Bytesmängden är den angivna procentandelen av den användbara volymen. Temperatur, salthalt och föremål i akvariet kan ändra vattnets verkliga massa något.</p>' },
29
+ { type: 'table', headers: ['Resultat', 'Betydelse'], rows: [['Bruttovolym', 'Geometrisk volym innan substratet dras av'], ['Substratets förskjutning', 'Uppskattat utrymme som bottenlagret tar'], ['Användbar volym', 'Uppskattad vattenmängd efter avdrag för substratet'], ['Vattenbyte', 'Angiven procent av den användbara volymen']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: 'Ställ in akvariet', dimensionsTitle: 'Akvariets mått', shapeLabel: 'Akvariets form', rectangularShape: 'Rektangulär', cylindricalShape: 'Cylindrisk', bowShape: 'Välvd front', lengthLabel: 'Invändig längd', widthLabel: 'Invändig bredd', heightLabel: 'Invändig höjd', diameterLabel: 'Invändig diameter', bowDepthLabel: 'Djup på frontens kurva', substrateLabel: 'Substratets höjd', changeLabel: 'Vattenbyte', unitLabel: 'Enheter', metricLabel: 'Metriskt', imperialLabel: 'Engelskt', resetLabel: 'Återställ', grossVolumeLabel: 'Bruttovolym', substrateVolumeLabel: 'Substratets förskjutning', netVolumeLabel: 'Användbar vattenvolym', changeVolumeLabel: 'Vatten att byta', waterWeightLabel: 'Vattnets vikt', emptyState: 'Ändra måtten för att se nivån.', invalidState: 'Kontrollera måtten: använd positiva värden, håll substratet under höjden och välj ett byte mellan 0 och 100 procent.', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'tum', shapeHint: 'Använd invändiga mått för en mer användbar uppskattning.', bowHint: 'Den välvda fronten använder en tydlig uppskattning.', substrateHint: 'Detta lager dras av från bruttovolymen.', resultHint: 'Resultatet uppdateras medan du skriver.', approximationLabel: 'Substratandel', footprintLabel: 'Bottenyta', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: 'Nano', compact: 'Kompakt', roomy: 'Rymlig', showcase: 'Utställning',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'tr',
5
+ slug: 'akvaryum-hacmi-su-degisimi-hesaplama',
6
+ title: 'Akvaryum hacmi ve su değişimi hesaplayıcısı',
7
+ description: 'Akvaryumun iç ölçülerini kullanarak kullanılabilir su hacmini, zeminin kapladığı alanı ve değiştirilecek su miktarını hesaplayın.',
8
+ faq: [
9
+ { question: 'Hesaplayıcı kutudaki kapasiteyi mi kullanır?', answer: 'Hayır. Gerçek su miktarını tahmin etmek için geometrik hacimden taban malzemesinin yüksekliğini çıkarır.' },
10
+ { question: 'Bombeli ön yüz seçeneği nasıl çalışır?', answer: 'Dikdörtgen tabana yaklaşık bir dairesel bölüm ekler. Cam profilleri değiştiği için sonuç bir tahmindir.' },
11
+ { question: 'Hangi birimler kullanılabilir?', answer: 'Metrik mod santimetre, litre ve kilogram gösterir. İngiliz ölçüleri modu inç, galon ve pound gösterir.' },
12
+ { question: 'Hesaplayıcı su değişim sıklığı önerir mi?', answer: 'Hayır. Yalnızca girdiğiniz yüzdeyi uygular; su kalitesini veya akvaryumdaki canlıları değerlendirmez.' },
13
+ { question: 'Verilerim tarayıcıdan çıkar mı?', answer: 'Hayır. Hesaplama tarayıcıda yapılır ve son ayarlar yerel olarak saklanabilir.' },
14
+ ],
15
+ howTo: [
16
+ { name: 'Akvaryum şeklini seçin', text: 'Dikdörtgen, silindirik veya bombeli ön yüz seçin. Yalnızca o şekil için gereken ölçüler gösterilir.' },
17
+ { name: 'İç ölçüleri girin', text: 'Uzunluk, genişlik ve yüksekliği ya da silindir için çap ve yüksekliği girin. İç ölçüler daha yararlı bir tahmin sağlar.' },
18
+ { name: 'Taban malzemesi yüksekliğini girin', text: 'Zemin eğimliyse birkaç noktadan ölçüm yapın ve ortalamayı girin. Bu katman brüt hacimden çıkarılır.' },
19
+ { name: 'Değişim yüzdesini belirleyin', text: 'Değiştirmek istediğiniz yüzdeyi girin. Sonuç su hacmini ve yaklaşık su kütlesini gösterir.' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: 'Akvaryumda gerçekten bulunan suyu hesaplayın', level: 2 },
23
+ { type: 'paragraph', html: 'Kutudaki kapasite genellikle akvaryumun ağzına kadar dolu halini ifade eder. Dozaj, ısıtma ve su değişimi için çalışma hacmini kullanmak daha uygundur: iç ölçülerden taban malzemesinin kapladığı alan çıkarılır.' },
24
+ { type: 'title', text: 'Her şekil için ayrı formül', level: 2 },
25
+ { type: 'list', items: ['<strong>Dikdörtgen:</strong> uzunluk çarpı genişlik çarpı yükseklik.', '<strong>Silindirik:</strong> taban alanı, pi çarpı yarıçapın karesi, çarpı yükseklik.', '<strong>Bombeli ön yüz:</strong> dikdörtgen taban artı yaklaşık bir dairesel bölüm.'] },
26
+ { type: 'title', text: 'Camın içinden ölçün', level: 2 },
27
+ { type: 'paragraph', html: 'Ölçüleri camın iç tarafından alın. Zemin eğimliyse birkaç noktayı ölçüp ortalamayı kullanın. Çok düzensiz bir şekil için bilinen hacimli bir kapla doldurmak daha doğru olabilir.' },
28
+ { type: 'tip', title: 'Sonucu çalışma hacmi olarak kullanın', html: '<p>Değişim miktarı, kullanılabilir hacme uygulanan yüzdeye eşittir. Sıcaklık, tuzluluk ve akvaryumdaki nesneler suyun gerçek kütlesini bir miktar değiştirebilir.</p>' },
29
+ { type: 'table', headers: ['Sonuç', 'Anlamı'], rows: [['Brüt hacim', 'Taban malzemesi çıkarılmadan önceki geometrik hacim'], ['Taban malzemesi hacmi', 'Zemin katmanının kapladığı tahmini alan'], ['Kullanılabilir hacim', 'Taban malzemesi çıkarıldıktan sonraki tahmini su'], ['Su değişimi', 'Kullanılabilir hacme uygulanan girilmiş yüzde']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: 'Akvaryumu yapılandırın', dimensionsTitle: 'Akvaryum ölçüleri', shapeLabel: 'Akvaryum şekli', rectangularShape: 'Dikdörtgen', cylindricalShape: 'Silindirik', bowShape: 'Bombeli ön yüz', lengthLabel: 'İç uzunluk', widthLabel: 'İç genişlik', heightLabel: 'İç yükseklik', diameterLabel: 'İç çap', bowDepthLabel: 'Ön eğrinin derinliği', substrateLabel: 'Taban malzemesi yüksekliği', changeLabel: 'Su değişimi', unitLabel: 'Birimler', metricLabel: 'Metrik', imperialLabel: 'İngiliz ölçüleri', resetLabel: 'Sıfırla', grossVolumeLabel: 'Brüt hacim', substrateVolumeLabel: 'Taban malzemesi hacmi', netVolumeLabel: 'Kullanılabilir su hacmi', changeVolumeLabel: 'Değiştirilecek su', waterWeightLabel: 'Su ağırlığı', emptyState: 'Seviyeyi görmek için ölçüleri ayarlayın.', invalidState: 'Ölçüleri kontrol edin: pozitif değerler kullanın, taban malzemesini yükseklikten düşük tutun ve yüzdeyi 0 ile 100 arasında seçin.', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'inç', shapeHint: 'Daha yararlı bir tahmin için iç ölçüleri kullanın.', bowHint: 'Bombeli ön yüz anlaşılır bir yaklaşık hesap kullanır.', substrateHint: 'Bu katman brüt hacimden çıkarılır.', resultHint: 'Siz yazdıkça sonuç güncellenir.', approximationLabel: 'Taban malzemesi payı', footprintLabel: 'Taban alanı', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: 'Nano', compact: 'Kompakt', roomy: 'Geniş', showcase: 'Sergi',
33
+ },
34
+ });
@@ -0,0 +1,34 @@
1
+ import { createAquariumContent } from '../localized-content';
2
+
3
+ export const content = createAquariumContent({
4
+ locale: 'zh',
5
+ slug: 'aquarium-tank-volume-water-change-calculator',
6
+ title: '鱼缸容量与换水量计算器',
7
+ description: '根据鱼缸内部尺寸和底砂厚度,计算可用水量、底砂占用空间、换水量以及水的重量,帮助日常维护。',
8
+ faq: [
9
+ { question: '计算器会直接使用鱼缸标注的容量吗?', answer: '不会。它会从几何容量中扣除底砂占用的空间,得到实际可用水量的估算值。' },
10
+ { question: '弧形前脸鱼缸如何计算?', answer: '在矩形底面积上增加一个圆形区段的近似值。由于玻璃曲线因鱼缸而异,结果只能作为估算。' },
11
+ { question: '可以使用哪些单位?', answer: '公制显示厘米、升和千克;英制显示英寸、加仑和磅。' },
12
+ { question: '会推荐换水周期吗?', answer: '不会。计算器只根据你输入的比例计算水量,不判断水质、养殖密度或鱼种。' },
13
+ { question: '输入数据会离开浏览器吗?', answer: '不会。计算在浏览器本地完成,最近的设置也只会保存在当前浏览器中。' },
14
+ ],
15
+ howTo: [
16
+ { name: '选择鱼缸形状', text: '选择矩形、圆柱形或弧形前脸。页面只会显示该形状所需的尺寸。' },
17
+ { name: '输入内部尺寸', text: '输入长、宽、高,或在圆柱形中输入直径和高度。尽量测量玻璃内侧。' },
18
+ { name: '输入底砂厚度', text: '如果底砂有坡度,请在多个位置测量并输入平均厚度。这个空间会从总容量中扣除。' },
19
+ { name: '输入换水比例', text: '输入计划更换的百分比。结果会显示对应水量和水重的估算值。' },
20
+ ],
21
+ seo: [
22
+ { type: 'title', text: '计算鱼缸里真正可用的水量', level: 2 },
23
+ { type: 'paragraph', html: '产品标注的容量通常代表鱼缸装满时的体积。准备换水、加热或计算添加剂用量时,更有用的是内部尺寸减去底砂占用空间后的工作水量。' },
24
+ { type: 'title', text: '根据形状选择计算方式', level: 2 },
25
+ { type: 'list', items: ['<strong>矩形:</strong> 长×宽×高。', '<strong>圆柱形:</strong> 圆周率×半径平方×高度。', '<strong>弧形前脸:</strong> 矩形底面加上弧形区段的近似值。'] },
26
+ { type: 'title', text: '测量内侧而不是依赖包装', level: 2 },
27
+ { type: 'paragraph', html: '请从玻璃内侧测量。如果底砂倾斜,应测量多个位置并使用平均值。对于形状很不规则的鱼缸,用已知容量的容器实际加水,有时比几何近似更准确。' },
28
+ { type: 'tip', title: '如何使用换水结果', html: '<p>换水结果是把输入比例应用到可用水量后的数值。水温、盐度、沉木和装饰物可能让实际水重略有不同。</p>' },
29
+ { type: 'table', headers: ['结果', '含义'], rows: [['总容量', '扣除底砂前的几何容量'], ['底砂占用', '估算底砂层所占的空间'], ['可用水量', '扣除底砂后的工作水量'], ['换水量', '可用水量乘以输入比例']] },
30
+ ],
31
+ ui: {
32
+ configureLabel: '设置鱼缸', dimensionsTitle: '鱼缸尺寸', shapeLabel: '鱼缸形状', rectangularShape: '矩形', cylindricalShape: '圆柱形', bowShape: '弧形前脸', lengthLabel: '内部长度', widthLabel: '内部宽度', heightLabel: '内部高度', diameterLabel: '内部直径', bowDepthLabel: '前脸弧深', substrateLabel: '底砂厚度', changeLabel: '换水', unitLabel: '单位', metricLabel: '公制', imperialLabel: '英制', resetLabel: '重置', grossVolumeLabel: '总容量', substrateVolumeLabel: '底砂占用', netVolumeLabel: '可用水量', changeVolumeLabel: '需要更换的水', waterWeightLabel: '水的重量', emptyState: '调整尺寸即可查看水位。', invalidState: '请检查尺寸:使用正数,底砂必须低于鱼缸高度,换水比例必须在0到100之间。', litreUnit: 'L', gallonUnit: 'gal', kilogramUnit: 'kg', poundUnit: 'lb', lengthUnitMetric: 'cm', lengthUnitImperial: 'in', shapeHint: '使用内部尺寸可以得到更实用的估算。', bowHint: '弧形前脸使用透明的近似计算。', substrateHint: '该厚度会从总容量中扣除。', resultHint: '输入时结果会实时更新。', approximationLabel: '底砂占比', footprintLabel: '底面积', squareMetreUnit: 'm²', squareFootUnit: 'ft²', nano: '小型', compact: '标准', roomy: '大型', showcase: '展示级',
33
+ },
34
+ });
@@ -0,0 +1,60 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, Thing, WithContext } from 'schema-dts';
2
+ import { bibliography } from './bibliography';
3
+ import type { ToolLocaleContent } from '../../types';
4
+ import type { AquariumTankVolumeWaterChangeCalculatorUI } from './ui';
5
+
6
+ export interface AquariumLocaleCopy {
7
+ locale: string;
8
+ slug: string;
9
+ title: string;
10
+ description: string;
11
+ faq: { question: string; answer: string }[];
12
+ howTo: { name: string; text: string }[];
13
+ seo: ToolLocaleContent['seo'];
14
+ ui: AquariumTankVolumeWaterChangeCalculatorUI;
15
+ }
16
+
17
+ function createFaqSchema(copy: AquariumLocaleCopy): WithContext<FAQPage> {
18
+ return {
19
+ '@context': 'https://schema.org',
20
+ '@type': 'FAQPage',
21
+ mainEntity: copy.faq.map((item) => ({
22
+ '@type': 'Question',
23
+ name: item.question,
24
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
25
+ })),
26
+ };
27
+ }
28
+
29
+ function createHowToSchema(copy: AquariumLocaleCopy): WithContext<HowTo> {
30
+ return {
31
+ '@context': 'https://schema.org',
32
+ '@type': 'HowTo',
33
+ name: copy.title,
34
+ description: copy.description,
35
+ step: copy.howTo.map((step, index) => ({
36
+ '@type': 'HowToStep',
37
+ position: index + 1,
38
+ name: step.name,
39
+ text: step.text,
40
+ })),
41
+ };
42
+ }
43
+
44
+ function createAppSchema(copy: AquariumLocaleCopy): WithContext<SoftwareApplication> {
45
+ return {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'SoftwareApplication',
48
+ name: copy.title,
49
+ description: copy.description,
50
+ applicationCategory: 'UtilityApplication',
51
+ operatingSystem: 'All',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ inLanguage: copy.locale,
54
+ };
55
+ }
56
+
57
+ export function createAquariumContent(copy: AquariumLocaleCopy): ToolLocaleContent<AquariumTankVolumeWaterChangeCalculatorUI> {
58
+ const schemas: WithContext<Thing>[] = [createFaqSchema(copy), createHowToSchema(copy), createAppSchema(copy)];
59
+ return { ...copy, schemas, bibliography };
60
+ }
@@ -37,6 +37,16 @@ describe('aquarium tank volume logic', () => {
37
37
  }
38
38
  });
39
39
 
40
+ it('subtracts the entered substrate depth from usable water volume', () => {
41
+ const withoutSubstrate = calculateTankVolume({ ...DEFAULT_TANK_INPUT, substrateDepthCm: 0 });
42
+ const withSubstrate = calculateTankVolume({ ...DEFAULT_TANK_INPUT, substrateDepthCm: 8 });
43
+ expect(withoutSubstrate.ok).toBe(true);
44
+ expect(withSubstrate.ok).toBe(true);
45
+ if (withoutSubstrate.ok && withSubstrate.ok) {
46
+ expect(withoutSubstrate.value.netLitres - withSubstrate.value.netLitres).toBeCloseTo(14.4, 8);
47
+ }
48
+ });
49
+
40
50
  it('uses the bow front approximation and rejects impossible substrate', () => {
41
51
  const bowResult = calculateTankVolume({ ...DEFAULT_TANK_INPUT, shape: 'bow', bowDepthCm: 6 });
42
52
  expect(bowResult.ok).toBe(true);
@@ -1,7 +1,6 @@
1
1
  export interface AquariumTankVolumeWaterChangeCalculatorUI {
2
2
  [key: string]: string;
3
- toolTitle: string;
4
- toolSubtitle: string;
3
+ configureLabel: string;
5
4
  dimensionsTitle: string;
6
5
  shapeLabel: string;
7
6
  rectangularShape: string;
@@ -17,7 +16,6 @@ export interface AquariumTankVolumeWaterChangeCalculatorUI {
17
16
  unitLabel: string;
18
17
  metricLabel: string;
19
18
  imperialLabel: string;
20
- calculateLabel: string;
21
19
  resetLabel: string;
22
20
  grossVolumeLabel: string;
23
21
  substrateVolumeLabel: string;
@@ -38,4 +36,6 @@ export interface AquariumTankVolumeWaterChangeCalculatorUI {
38
36
  resultHint: string;
39
37
  approximationLabel: string;
40
38
  footprintLabel: string;
39
+ squareMetreUnit: string;
40
+ squareFootUnit: string;
41
41
  }