@jjlmoya/utils-home 1.30.0 → 1.32.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 (56) hide show
  1. package/package.json +2 -1
  2. package/src/entries.ts +7 -1
  3. package/src/index.ts +1 -0
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/lightingCalculator/bibliography.astro +36 -0
  7. package/src/tool/lightingCalculator/bibliography.ts +10 -0
  8. package/src/tool/lightingCalculator/component.astro +308 -0
  9. package/src/tool/lightingCalculator/draw.ts +247 -0
  10. package/src/tool/lightingCalculator/entry.ts +29 -0
  11. package/src/tool/lightingCalculator/how-many-lights-per-room.css +493 -0
  12. package/src/tool/lightingCalculator/i18n/de.ts +213 -0
  13. package/src/tool/lightingCalculator/i18n/en.ts +213 -0
  14. package/src/tool/lightingCalculator/i18n/es.ts +213 -0
  15. package/src/tool/lightingCalculator/i18n/fr.ts +213 -0
  16. package/src/tool/lightingCalculator/i18n/id.ts +213 -0
  17. package/src/tool/lightingCalculator/i18n/it.ts +213 -0
  18. package/src/tool/lightingCalculator/i18n/ja.ts +213 -0
  19. package/src/tool/lightingCalculator/i18n/ko.ts +213 -0
  20. package/src/tool/lightingCalculator/i18n/nl.ts +213 -0
  21. package/src/tool/lightingCalculator/i18n/pl.ts +213 -0
  22. package/src/tool/lightingCalculator/i18n/pt.ts +213 -0
  23. package/src/tool/lightingCalculator/i18n/ru.ts +213 -0
  24. package/src/tool/lightingCalculator/i18n/sv.ts +213 -0
  25. package/src/tool/lightingCalculator/i18n/tr.ts +213 -0
  26. package/src/tool/lightingCalculator/i18n/zh.ts +213 -0
  27. package/src/tool/lightingCalculator/index.ts +9 -0
  28. package/src/tool/lightingCalculator/logic.ts +119 -0
  29. package/src/tool/lightingCalculator/seo.astro +15 -0
  30. package/src/tool/lightingCalculator/state.ts +113 -0
  31. package/src/tool/lightingCalculator/ui.ts +48 -0
  32. package/src/tool/tileLayoutCalculator/bibliography.astro +14 -0
  33. package/src/tool/tileLayoutCalculator/bibliography.ts +10 -0
  34. package/src/tool/tileLayoutCalculator/component.astro +415 -0
  35. package/src/tool/tileLayoutCalculator/entry.ts +29 -0
  36. package/src/tool/tileLayoutCalculator/i18n/de.ts +208 -0
  37. package/src/tool/tileLayoutCalculator/i18n/en.ts +208 -0
  38. package/src/tool/tileLayoutCalculator/i18n/es.ts +208 -0
  39. package/src/tool/tileLayoutCalculator/i18n/fr.ts +208 -0
  40. package/src/tool/tileLayoutCalculator/i18n/id.ts +208 -0
  41. package/src/tool/tileLayoutCalculator/i18n/it.ts +208 -0
  42. package/src/tool/tileLayoutCalculator/i18n/ja.ts +208 -0
  43. package/src/tool/tileLayoutCalculator/i18n/ko.ts +208 -0
  44. package/src/tool/tileLayoutCalculator/i18n/nl.ts +208 -0
  45. package/src/tool/tileLayoutCalculator/i18n/pl.ts +208 -0
  46. package/src/tool/tileLayoutCalculator/i18n/pt.ts +208 -0
  47. package/src/tool/tileLayoutCalculator/i18n/ru.ts +208 -0
  48. package/src/tool/tileLayoutCalculator/i18n/sv.ts +208 -0
  49. package/src/tool/tileLayoutCalculator/i18n/tr.ts +208 -0
  50. package/src/tool/tileLayoutCalculator/i18n/zh.ts +208 -0
  51. package/src/tool/tileLayoutCalculator/index.ts +9 -0
  52. package/src/tool/tileLayoutCalculator/logic.ts +55 -0
  53. package/src/tool/tileLayoutCalculator/seo.astro +15 -0
  54. package/src/tool/tileLayoutCalculator/tile-layout-calculator.css +404 -0
  55. package/src/tool/tileLayoutCalculator/ui.ts +37 -0
  56. package/src/tools.ts +4 -0
@@ -0,0 +1,208 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TileLayoutCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'kakel-layout-berakning';
7
+ const title = 'Kakellayout och Spillberäknare';
8
+ const description =
9
+ 'Planera ditt rumsgolv med millimeterprecision. Beräkna exakt antal kakel, lådor som behövs, total kostnad och visualisera layouten i realtid med en interaktiv rutnätsförhandsvisning.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Hur beräknar jag hur många kakelplattor jag behöver för ett rum?',
14
+ answer:
15
+ 'Mät rummets bredd och längd, välj kakelstorlek och ange fogbredden. Kalkylatorn delar rummets mått med kakel plus fog för att ge exakt antal plattor per rad och kolumn.',
16
+ },
17
+ {
18
+ question: 'Vilken spillprocent bör jag lägga till vid köp av kakel?',
19
+ answer:
20
+ 'För standard rektangulära rum, lägg till 10% spill. För rum med många hörn, diagonala mönster eller komplexa snitt, öka till 15%. Detta täcker sönder och snittfel.',
21
+ },
22
+ {
23
+ question: 'Påverkar fogtjockleken verkligen antalet kakelplattor?',
24
+ answer:
25
+ 'Ja. Bredare fogar minskar varje plattas effektiva täckning, vilket ökar det totala antalet något. Kalkylatorn tar hänsyn till detta automatiskt i varje rad och kolumn.',
26
+ },
27
+ {
28
+ question: 'Bör jag köpa extra lådor utöver spillprocenten?',
29
+ answer:
30
+ 'Det är klokt att köpa en extra låda om sådan finns. Färgbad kan variera mellan produktionsomgångar, och matchande reservdelar gör framtida reparationer sömlösa.',
31
+ },
32
+ {
33
+ question: 'Hur kaklar jag ett rum med oregelbunden form?',
34
+ answer:
35
+ 'Dela upp rummet i mindre rektanglar. Beräkna varje sektion separat och summera resultaten. Avrunda alltid delvisa lådor uppåt för att säkerställa full täckning.',
36
+ },
37
+ {
38
+ question: 'Vad är skillnaden i spill mellan keramik och porslin?',
39
+ answer:
40
+ 'Porslin är tätare och svårare att skära, vilket kan öka skärtspill med 2% till 3% jämfört med standardkeramik. Båda materialen bör följa samma mätprocess.',
41
+ },
42
+ {
43
+ question: 'Kan jag returnera oanvända kakellådor?',
44
+ answer:
45
+ 'De flesta återförsäljare accepterar oöppnade lådor inom 30 dagar. Spara alltid kvittot och öppna inte överskottslådor förrän installationen är helt klar.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Mät rummet',
52
+ text: 'Anteckna bredd och längd på golvyta i ditt föredragna måttsystem.',
53
+ },
54
+ {
55
+ name: 'Välj kakel och fog',
56
+ text: 'Välj dina kakeldimensioner och önskad fogbredd.',
57
+ },
58
+ {
59
+ name: 'Beräkna och visualisera',
60
+ text: 'Mata in värdena i kalkylatorn, justera spillmarginalen och granska live-layout-förhandsvisningen.',
61
+ },
62
+ ];
63
+
64
+ const faqSchema: WithContext<FAQPage> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'FAQPage',
67
+ mainEntity: faqData.map((item) => ({
68
+ '@type': 'Question',
69
+ name: item.question,
70
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
71
+ })),
72
+ };
73
+
74
+ const howToSchema: WithContext<HowTo> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'HowTo',
77
+ name: title,
78
+ description,
79
+ step: howToData.map((step) => ({
80
+ '@type': 'HowToStep',
81
+ name: step.name,
82
+ text: step.text,
83
+ })),
84
+ };
85
+
86
+ const appSchema: WithContext<SoftwareApplication> = {
87
+ '@context': 'https://schema.org',
88
+ '@type': 'SoftwareApplication',
89
+ name: title,
90
+ description,
91
+ applicationCategory: 'UtilityApplication',
92
+ operatingSystem: 'All',
93
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'SEK' },
94
+ inLanguage: 'sv',
95
+ };
96
+
97
+ export const content: ToolLocaleContent<TileLayoutCalculatorUI> = {
98
+ slug,
99
+ title,
100
+ description,
101
+ faq: faqData,
102
+ bibliography,
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: 'Komplett Guide för Kakelgolvplanering och Spillkontroll',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Ett lyckat kakelprojekt börjar långt innan det första limmet läggs på. Noggrann mätning, intelligent layoutplanering och korrekt spilluppskattning avgör om din renovering håller sig inom budget och tidsplan. <strong>Vår interaktiva kakel-layoutkalkylator</strong> omvandlar råa mått till en visuell golvplan som visar exakt hur många plattor som får plats per rad, hur många lådor du behöver köpa och vart dina pengar går.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Standardspill', icon: 'mdi:alert-circle' },
119
+ { value: '30+ år', label: 'Kakellivslängd', icon: 'mdi:clock-outline' },
120
+ { value: '48h', label: 'Genomsnittlig montering', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Storformat Kakel',
129
+ description: 'Kakel större än 60 cm skapar en sömlös, modern look men kräver perfekt plana underlag och ger högre skärspill i små rum.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Färre fogar', 'Premium visuell effekt', 'Högre spill i trånga utrymmen'],
132
+ },
133
+ {
134
+ title: 'Små Mosaikplattor',
135
+ description: 'Idealiska för badrum och intrikata mönster. De anpassar sig till oregelbundna former men kräver mer fog och arbetstid.',
136
+ icon: 'mdi:apps',
137
+ points: ['Flexibla runt hinder', 'Mer fog krävs', 'Längre monteringstid'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Varför Layoutvisualisering Betyder Något',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Att se ditt kakelnät innan köp förhindrar dyra överraskningar. En live-förhandsvisning avslöjar om din valda kakelstorlek lämnar obehagliga smala strimmor vid kanterna eller skapar ett balanserat, symmetriskt golv. Genom att justera fogbredd och kakelorientering i kalkylatorn kan du optimera layouten för estetik och effektivitet innan du beställer.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Snabb Referenstabell för Täckning',
155
+ icon: 'mdi:table',
156
+ badge: 'Referens',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → 11 plattor per m²</li><li><strong>45 x 45 cm</strong> → 5 plattor per m²</li><li><strong>60 x 60 cm</strong> → 3 plattor per m²</li><li><strong>60 x 120 cm</strong> → 1,5 plattor per m²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Proffstips för att Minimera Spill',
162
+ items: [
163
+ 'Beställ 10% extra för raka mönster och 15% för diagonala eller fiskbensmönster.',
164
+ 'Förvara alla lådor från samma produktionsbatch för att säkerställa färgkonsekvens.',
165
+ 'Mät diagonalt över rummet för att kontrollera vinkelräthet innan du planerar rader.',
166
+ 'Använd storformat endast i rum som är bredare än plattans längd för att undvika överdriven skärning.',
167
+ 'Avrunda alltid lådor uppåt; det är billigare än en andra leverans.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Rumskonfiguration',
173
+ labelRoomWidth: 'Rumsbredd',
174
+ labelRoomLength: 'Rumslängd',
175
+ labelTileWidth: 'Kakelbredd',
176
+ labelTileLength: 'Kakellängd',
177
+ labelGrout: 'Fogbredd',
178
+ labelWaste: 'Spillmarginal',
179
+ labelTilesPerBox: 'Plattor per låda',
180
+ labelPrice: 'Pris per låda',
181
+ labelPattern: 'Kakelmonstret',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'st',
190
+ unitPrice: '/låda',
191
+ resultBadge: 'Live layout-förhandsvisning',
192
+ labelArea: 'Golvyta',
193
+ labelTiles: 'Totalt antal plattor',
194
+ labelBoxes: 'Lådor som behövs',
195
+ labelCost: 'Total kostnad',
196
+ labelWasteCount: 'Spillplattor',
197
+ labelCuts: 'Delvisa snitt',
198
+ currency: 'SEK',
199
+ btnMetric: 'Metriskt',
200
+ btnImperial: 'Imperialiskt',
201
+ btnPatternStraight: 'Rakt',
202
+ btnPatternBrick: 'Förskjutet',
203
+ btnPatternDiagonal: 'Diagonalt',
204
+ badgeOptimal: 'Optimal layout',
205
+ badgeWarning: 'Högt spill',
206
+ visualTitle: 'Layout förhandsvisning',
207
+ },
208
+ };
@@ -0,0 +1,208 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TileLayoutCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'fayans-doseme-hesaplayici';
7
+ const title = 'Fayans Döşeme ve Fire Hesaplayıcı';
8
+ const description =
9
+ 'Oda zeminini milimetrik hassasiyetle planlayın. Gereken fayans sayısını, koli miktarını, toplam maliyeti hesaplayın ve etkileşimli ızgara önizlemesiyle döşemeyi gerçek zamanlı görselleştirin.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Bir oda için kaç fayans gerektiğini nasıl hesaplarım?',
14
+ answer:
15
+ 'Odanın genişliğini ve uzunluğunu ölçün, fayans boyutunu seçin ve derz genişliğini girin. Hesaplayıcı, oda boyutlarını fayans artı derz genişliğine bölerek her sıra ve kolonda kaç adet gerektiğini tam olarak verir.',
16
+ },
17
+ {
18
+ question: 'Fayans alırken ne kadar fire payı eklemeliyim?',
19
+ answer:
20
+ 'Standart dikdörtgen odalar için %10 fire payı ekleyin. Çok köşeli odalar, çapraz döşeme veya karmaşık kesimler gerektiren durumlarda %15\'e çıkarın. Bu, kırılmaları ve kesim hatalarını karşılar.',
21
+ },
22
+ {
23
+ question: 'Derz kalınlığı gerçekten fayans sayısını değiştirir mi?',
24
+ answer:
25
+ 'Evet. Daha geniş derzler her fayansın etkili kaplama alanını azaltır, bu da toplam sayıyı hafifçe artırır. Hesaplayıcı bunu her sıra ve kolonda otomatik olarak hesaba katar.',
26
+ },
27
+ {
28
+ question: 'Fire payının üzerine ekstra koli almalı mıyım?',
29
+ answer:
30
+ 'Mevcutsa bir koli fazla almak akıllıcadır. Üretim partileri arasında renk tonu farklılıkları olabilir; eşleşen yedek parçalar gelecekteki tamiratları kolaylaştırır.',
31
+ },
32
+ {
33
+ question: 'Düzgün olmayan şekilli bir odaya fayans nasıl döşenir?',
34
+ answer:
35
+ 'Odayı daha küçük dikdörtgenlere ayırın. Her bölgeyi ayrı hesaplayıp toplamları birleştirin. Kısmi kolileri her zaman yukarı yuvarlayarak tam kapsama sağlayın.',
36
+ },
37
+ {
38
+ question: 'Seramik ve porselen fayans arasındaki fire farkı nedir?',
39
+ answer:
40
+ 'Porselen daha yoğun ve kesilmesi daha zordur; bu da standart seramiğe göre kesim firelerini %2 ile %3 artırabilir. Her iki malzeme de aynı ölçüm sürecini takip etmelidir.',
41
+ },
42
+ {
43
+ question: 'Kullanılmamış fayans kolilerini iade edebilir miyim?',
44
+ answer:
45
+ 'Çoğu perakendeci, açılmamış kolileri 30 gün içinde iade alır. Her zaman fişi saklayın ve kurulum tamamen bitene kadar fazla kolileri açmayın.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Odayı ölçün',
52
+ text: 'Tercih ettiğiniz birim sisteminde zemin genişliğini ve uzunluğunu kaydedin.',
53
+ },
54
+ {
55
+ name: 'Fayans ve derz seçin',
56
+ text: 'Fayans boyutlarınızı ve istediğiniz derz genişliğini seçin.',
57
+ },
58
+ {
59
+ name: 'Hesaplayın ve görselleştirin',
60
+ text: 'Değerleri hesaplayıcıya girin, fire payını ayarlayın ve canlı döşeme önizlemesini inceleyin.',
61
+ },
62
+ ];
63
+
64
+ const faqSchema: WithContext<FAQPage> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'FAQPage',
67
+ mainEntity: faqData.map((item) => ({
68
+ '@type': 'Question',
69
+ name: item.question,
70
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
71
+ })),
72
+ };
73
+
74
+ const howToSchema: WithContext<HowTo> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'HowTo',
77
+ name: title,
78
+ description,
79
+ step: howToData.map((step) => ({
80
+ '@type': 'HowToStep',
81
+ name: step.name,
82
+ text: step.text,
83
+ })),
84
+ };
85
+
86
+ const appSchema: WithContext<SoftwareApplication> = {
87
+ '@context': 'https://schema.org',
88
+ '@type': 'SoftwareApplication',
89
+ name: title,
90
+ description,
91
+ applicationCategory: 'UtilityApplication',
92
+ operatingSystem: 'All',
93
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'TRY' },
94
+ inLanguage: 'tr',
95
+ };
96
+
97
+ export const content: ToolLocaleContent<TileLayoutCalculatorUI> = {
98
+ slug,
99
+ title,
100
+ description,
101
+ faq: faqData,
102
+ bibliography,
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: 'Fayans Döşeme Planlama ve Fire Kontrolü İçin Tam Rehber',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Başarılı bir fayans döşeme projesi, ilk yapıştırıcı sürülmeden çok önce başlar. Hassas ölçüm, akıllı döşeme planlaması ve doğru fire hesabı, tadilatınızın bütçe ve programa uymasını belirler. <strong>Etkileşimli fayans döşeme hesaplayıcımız</strong>, ham boyutları görsel bir zemin planına dönüştürerek, her sırada kaç fayans sığacağını, kaç koli almanız gerektiğini ve paranızın nereye gittiğini tam olarak gösterir.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Standart Fire', icon: 'mdi:alert-circle' },
119
+ { value: '30+ yıl', label: 'Fayans Ömrü', icon: 'mdi:clock-outline' },
120
+ { value: '48 saat', label: 'Ortalama Döşeme', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Büyük Format Fayanslar',
129
+ description: '60 cm\'den büyük fayanslar kesintisiz, modern bir görünüm sunar ancak mükemmel düz zemin gerektirir ve küçük odalarda kesim firelerini artırır.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Daha az derz', 'Premium görsel etki', 'Dar alanlarda yüksek fire'],
132
+ },
133
+ {
134
+ title: 'Küçük Mozaikler',
135
+ description: 'Banyolar ve karmaşık desenler için ideal. Düzgün olmayan şekillere uyum sağlar ancak daha fazla derz ve işçilik zamanı gerektirir.',
136
+ icon: 'mdi:apps',
137
+ points: ['Engellerin etrafında esneklik', 'Daha fazla derz gerekli', 'Daha uzun döşeme süresi'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Döşeme Görselleştirmesi Neden Önemli',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Satın almadan önce fayans ızgarasını görmek, maliyetli sürprizleri önler. Canlı önizleme, seçtiğiniz fayans boyutunun kenarlarda hoş olmayan dar şeritler bırakıp bırakmadığını veya dengeli, simetrik bir zemin oluşturup oluşturmadığını gösterir. Hesaplayıcıda derz genişliği ve fayans yönünü ayarlayarak, sipariş vermeden önce estetik ve verimlilik açısından en iyi döşemeyi oluşturabilirsiniz.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Hızlı Kaplama Referans Tablosu',
155
+ icon: 'mdi:table',
156
+ badge: 'Referans',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → m² başına 11 fayans</li><li><strong>45 x 45 cm</strong> → m² başına 5 fayans</li><li><strong>60 x 60 cm</strong> → m² başına 3 fayans</li><li><strong>60 x 120 cm</strong> → m² başına 1,5 fayans</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Fireyi En Aza İndirmek için Profesyonel İpuçları',
162
+ items: [
163
+ 'Düz döşeme için %10, çapraz veya balıksırtı için %15 fazla sipariş verin.',
164
+ 'Renk tutarlılığını sağlamak için tüm kolileri aynı üretim partisinden saklayın.',
165
+ 'Sıraları planlamadan önce odanın kareliğini kontrol etmek için çapraz ölçüm yapın.',
166
+ 'Aşırı kesimden kaçınmak için büyük format fayansları yalnızca fayans uzunluğundan geniş odalarda kullanın.',
167
+ 'Koli sayısını her zaman yukarı yuvarlayın; ikinci bir teslimattan daha ucuzdur.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Oda Yapılandırması',
173
+ labelRoomWidth: 'Oda genişliği',
174
+ labelRoomLength: 'Oda uzunluğu',
175
+ labelTileWidth: 'Fayans genişliği',
176
+ labelTileLength: 'Fayans uzunluğu',
177
+ labelGrout: 'Derz genişliği',
178
+ labelWaste: 'Fire payı',
179
+ labelTilesPerBox: 'Koli başına fayans',
180
+ labelPrice: 'Koli başına fiyat',
181
+ labelPattern: 'Döşeme deseni',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'ad',
190
+ unitPrice: '/koli',
191
+ resultBadge: 'Canlı döşeme önizlemesi',
192
+ labelArea: 'Zemin alanı',
193
+ labelTiles: 'Toplam fayans',
194
+ labelBoxes: 'Gerekli koliler',
195
+ labelCost: 'Toplam maliyet',
196
+ labelWasteCount: 'Fire fayansları',
197
+ labelCuts: 'Kısmi kesimler',
198
+ currency: 'TRY',
199
+ btnMetric: 'Metrik',
200
+ btnImperial: 'Emperyal',
201
+ btnPatternStraight: 'Düz',
202
+ btnPatternBrick: 'Rastıklı',
203
+ btnPatternDiagonal: 'Çapraz',
204
+ badgeOptimal: 'En uygun döşeme',
205
+ badgeWarning: 'Yüksek fire uyarısı',
206
+ visualTitle: 'Döşeme önizlemesi',
207
+ },
208
+ };
@@ -0,0 +1,208 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TileLayoutCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'tile-layout-calculator';
7
+ const title = '瓷砖布局与损耗计算器';
8
+ const description =
9
+ '精准规划房间地板。计算所需瓷砖的确切数量、箱数、总成本,并通过交互式网格预览实时可视化布局。';
10
+
11
+ const faqData = [
12
+ {
13
+ question: '如何计算房间需要多少瓷砖?',
14
+ answer:
15
+ '测量房间的宽度和长度,选择瓷砖尺寸,并输入填缝宽度。计算器将房间尺寸除以瓷砖加填缝尺寸,得出每行和每列所需瓷砖的确切数量。',
16
+ },
17
+ {
18
+ question: '购买瓷砖时应增加多少损耗百分比?',
19
+ answer:
20
+ '标准矩形房间增加10%损耗。对于角落多、对角线铺设或复杂切割的房间,增加到15%。这可以覆盖破损和切割失误。',
21
+ },
22
+ {
23
+ question: '填缝厚度真的会影响瓷砖数量吗?',
24
+ answer:
25
+ '是的。更宽的填缝会减少每块瓷砖的有效覆盖面积,略微增加所需总数。计算器会自动将其计入每一行和每一列。',
26
+ },
27
+ {
28
+ question: '除了损耗百分比外,我应该多买几箱吗?',
29
+ answer:
30
+ '如果还有货,多买一箱是明智的。不同生产批次的瓷砖可能会有色差,拥有匹配的备件可以让未来维修更无缝。',
31
+ },
32
+ {
33
+ question: '如何给不规则形状的房间铺砖?',
34
+ answer:
35
+ '将房间分成若干小矩形。分别计算每个区域并汇总总数。部分箱数务必向上取整,以确保完全覆盖。',
36
+ },
37
+ {
38
+ question: '陶瓷和瓷砖的损耗有什么区别?',
39
+ answer:
40
+ '瓷砖更致密、更难切割,与标准陶瓷相比,切割损耗可能增加2%至3%。两种材料都应遵循相同的测量流程。',
41
+ },
42
+ {
43
+ question: '未使用的瓷砖可以退货吗?',
44
+ answer:
45
+ '大多数零售商在30天内接受未开封的退货。务必保留收据,在全部铺设完成前不要拆开多余的箱子。',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: '测量房间',
52
+ text: '用您喜欢的单位系统记录地面的宽度和长度。',
53
+ },
54
+ {
55
+ name: '选择瓷砖和填缝',
56
+ text: '选择瓷砖尺寸和期望的填缝宽度。',
57
+ },
58
+ {
59
+ name: '计算并可视化',
60
+ text: '将数值输入计算器,调整损耗余量,并查看实时布局预览。',
61
+ },
62
+ ];
63
+
64
+ const faqSchema: WithContext<FAQPage> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'FAQPage',
67
+ mainEntity: faqData.map((item) => ({
68
+ '@type': 'Question',
69
+ name: item.question,
70
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
71
+ })),
72
+ };
73
+
74
+ const howToSchema: WithContext<HowTo> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'HowTo',
77
+ name: title,
78
+ description,
79
+ step: howToData.map((step) => ({
80
+ '@type': 'HowToStep',
81
+ name: step.name,
82
+ text: step.text,
83
+ })),
84
+ };
85
+
86
+ const appSchema: WithContext<SoftwareApplication> = {
87
+ '@context': 'https://schema.org',
88
+ '@type': 'SoftwareApplication',
89
+ name: title,
90
+ description,
91
+ applicationCategory: 'UtilityApplication',
92
+ operatingSystem: 'All',
93
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
94
+ inLanguage: 'zh',
95
+ };
96
+
97
+ export const content: ToolLocaleContent<TileLayoutCalculatorUI> = {
98
+ slug,
99
+ title,
100
+ description,
101
+ faq: faqData,
102
+ bibliography,
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: '地板瓷砖规划与损耗控制的完整指南',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: '成功的铺砖项目在涂抹第一块粘合剂之前就已经开始了。精确的测量、智能的布局规划以及准确的损耗估算决定了您的翻新是否能按预算和进度完成。<strong>我们的交互式瓷砖布局计算器</strong>将原始尺寸转化为可视平面图,准确显示每行能铺多少块瓷砖、需要购买多少箱以及您的资金去向。',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: '标准损耗', icon: 'mdi:alert-circle' },
119
+ { value: '30+ 年', label: '瓷砖寿命', icon: 'mdi:clock-outline' },
120
+ { value: '48小时', label: '平均安装', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: '大规格瓷砖',
129
+ description: '超过60厘米的瓷砖能营造无缝现代感,但需要完全平整的基层,在小房间中会产生更高的切割损耗。',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['更少的填缝线', '高端视觉效果', '小空间切割损耗更高'],
132
+ },
133
+ {
134
+ title: '小马赛克瓷砖',
135
+ description: '非常适合浴室和复杂图案。能适应不规则形状,但需要更多填缝和施工时间。',
136
+ icon: 'mdi:apps',
137
+ points: ['可灵活避开障碍物', '需要更多填缝', '安装时间更长'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: '为什么布局可视化很重要',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: '在购买前看到瓷砖网格可以避免代价高昂的尴尬。实时预览可以揭示您选择的瓷砖尺寸是否会在边缘留下不美观的窄条,或者是否能创造出平衡、对称的地面。在计算器中调整填缝宽度和瓷砖方向,您可以在下单前从美学和效率两方面优化布局。',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: '快速参考覆盖表',
155
+ icon: 'mdi:table',
156
+ badge: '参考',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 厘米</strong> → 每平方米11块</li><li><strong>45 x 45 厘米</strong> → 每平方米5块</li><li><strong>60 x 60 厘米</strong> → 每平方米3块</li><li><strong>60 x 120 厘米</strong> → 每平方米1.5块</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: '最小化损耗的专业技巧',
162
+ items: [
163
+ '直线布局多订10%,对角线或人字形布局多订15%。',
164
+ '保留同一生产批次的所有瓷砖箱,以确保颜色一致。',
165
+ '在规划行数前,对角测量房间以检查方正度。',
166
+ '仅在房间宽度大于瓷砖长度时使用大规格瓷砖,以避免过度切割。',
167
+ '箱数务必向上取整,这比二次送货更划算。',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: '房间配置',
173
+ labelRoomWidth: '房间宽度',
174
+ labelRoomLength: '房间长度',
175
+ labelTileWidth: '瓷砖宽度',
176
+ labelTileLength: '瓷砖长度',
177
+ labelGrout: '填缝宽度',
178
+ labelWaste: '损耗余量',
179
+ labelTilesPerBox: '每箱瓷砖数',
180
+ labelPrice: '每箱价格',
181
+ labelPattern: '铺贴方式',
182
+ unitMetricRoom: '米',
183
+ unitImperialRoom: '英尺',
184
+ unitMetricTile: '厘米',
185
+ unitImperialTile: '英寸',
186
+ unitGroutMetric: '毫米',
187
+ unitGroutImperial: '英寸',
188
+ unitPercent: '%',
189
+ unitBoxes: '块',
190
+ unitPrice: '/箱',
191
+ resultBadge: '实时布局预览',
192
+ labelArea: '地面面积',
193
+ labelTiles: '瓷砖总数',
194
+ labelBoxes: '所需箱数',
195
+ labelCost: '总成本',
196
+ labelWasteCount: '损耗瓷砖',
197
+ labelCuts: '部分切割',
198
+ currency: 'CNY',
199
+ btnMetric: '公制',
200
+ btnImperial: '英制',
201
+ btnPatternStraight: '直铺',
202
+ btnPatternBrick: '工字铺',
203
+ btnPatternDiagonal: '对角铺',
204
+ badgeOptimal: '最佳布局',
205
+ badgeWarning: '高损耗警告',
206
+ visualTitle: '布局预览',
207
+ },
208
+ };
@@ -0,0 +1,9 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { tileLayoutCalculator } from './entry';
3
+ export * from './entry';
4
+ export const TILE_LAYOUT_CALCULATOR_TOOL: ToolDefinition = {
5
+ entry: tileLayoutCalculator,
6
+ Component: () => import('./component.astro'),
7
+ SEOComponent: () => import('./seo.astro'),
8
+ BibliographyComponent: () => import('./bibliography.astro'),
9
+ };