| | |
| | | ## garbage-classfication |
| | | |
| | | 公众号页面-垃圾分类 |
| | | |
| New file |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"> |
| | | <rect width="48" height="48" rx="10" fill="#0071BC"/> |
| | | <path d="M14 32V18h4l6 10 6-10h4v14h-3.5V23l-5.5 9h-2l-5.5-9v9H14z" fill="#fff"/> |
| | | <circle cx="36" cy="14" r="4" fill="#8B4513"/> |
| | | <circle cx="12" cy="14" r="4" fill="#E60012"/> |
| | | </svg> |
| New file |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none"> |
| | | <rect x="8" y="10" width="16" height="16" rx="2" stroke="#fff" stroke-width="2" fill="none"/> |
| | | <path d="M8 16h16" stroke="#fff" stroke-width="1.5"/> |
| | | <path d="M14 10V8M18 10V8" stroke="#fff" stroke-width="2"/> |
| | | </svg> |
| New file |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none"> |
| | | <rect x="10" y="6" width="12" height="20" rx="2" stroke="#fff" stroke-width="2" fill="none"/> |
| | | <path d="M14 6V4h4v2" stroke="#fff" stroke-width="2"/> |
| | | <path d="M13 14h6M13 18h6M13 22h4" stroke="#fff" stroke-width="1.5"/> |
| | | <circle cx="16" cy="12" r="2" fill="#fff"/> |
| | | </svg> |
| New file |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none"> |
| | | <path d="M8 28V12l8-6 8 6v16H8z" stroke="#fff" stroke-width="2" fill="none"/> |
| | | <path d="M13 20h6v8h-6z" fill="#fff" opacity="0.8"/> |
| | | <path d="M4 28h24" stroke="#fff" stroke-width="2"/> |
| | | </svg> |
| New file |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none"> |
| | | <ellipse cx="16" cy="20" rx="10" ry="6" stroke="#fff" stroke-width="2" fill="none"/> |
| | | <path d="M10 14c0-4 2.5-8 6-8s6 4 6 8" stroke="#fff" stroke-width="2" fill="none"/> |
| | | <path d="M12 22c2 2 6 2 8 0" stroke="#fff" stroke-width="1.5"/> |
| | | </svg> |
| New file |
| | |
| | | [ |
| | | { |
| | | "id": "recyclable", |
| | | "color": "#104883", |
| | | "icon": "assets/tabs/recyclable.png", |
| | | "iconInactive": "assets/tabs/recyclable-gray.png", |
| | | "nameKey": "cat.recyclable", |
| | | "descKey": "cat.recyclable.desc", |
| | | "standardKey": "cat.recyclable.standard", |
| | | "disposalTemplate": { |
| | | "suggestKey": "disposal.suggest.recyclable", |
| | | "line1Key": "disposal.line1.recyclable", |
| | | "line2Key": "disposal.line2.recyclable", |
| | | "tipsKeys": [ |
| | | "disposal.tip1.recyclable", |
| | | "disposal.tip2.recyclable", |
| | | "disposal.tip3.recyclable", |
| | | "disposal.tip4.recyclable" |
| | | ] |
| | | } |
| | | }, |
| | | { |
| | | "id": "hazardous", |
| | | "color": "#e53122", |
| | | "icon": "assets/tabs/hazardous.png", |
| | | "iconInactive": "assets/tabs/hazardous-gray.png", |
| | | "nameKey": "cat.hazardous", |
| | | "descKey": "cat.hazardous.desc", |
| | | "standardKey": "cat.hazardous.standard", |
| | | "disposalTemplate": { |
| | | "suggestKey": "disposal.suggest.hazardous", |
| | | "line1Key": "disposal.line1.hazardous", |
| | | "line2Key": "disposal.line2.hazardous", |
| | | "tipsKeys": [ |
| | | "disposal.tip1.hazardous", |
| | | "disposal.tip2.hazardous", |
| | | "disposal.tip3.hazardous", |
| | | "disposal.tip4.hazardous" |
| | | ] |
| | | } |
| | | }, |
| | | { |
| | | "id": "wet", |
| | | "color": "#694539", |
| | | "icon": "assets/tabs/wet.png", |
| | | "iconInactive": "assets/tabs/wet-gray.png", |
| | | "nameKey": "cat.wet", |
| | | "descKey": "cat.wet.desc", |
| | | "standardKey": "cat.wet.standard", |
| | | "disposalTemplate": { |
| | | "suggestKey": "disposal.suggest.wet", |
| | | "line1Key": "disposal.line1.wet", |
| | | "line2Key": "disposal.line2.wet", |
| | | "tipsKeys": [ |
| | | "disposal.tip1.wet", |
| | | "disposal.tip2.wet", |
| | | "disposal.tip3.wet", |
| | | "disposal.tip4.wet" |
| | | ] |
| | | } |
| | | }, |
| | | { |
| | | "id": "dry", |
| | | "color": "#312d2a", |
| | | "icon": "assets/tabs/dry.png", |
| | | "iconInactive": "assets/tabs/dry-gray.png", |
| | | "nameKey": "cat.dry", |
| | | "descKey": "cat.dry.desc", |
| | | "standardKey": "cat.dry.standard", |
| | | "disposalTemplate": { |
| | | "suggestKey": "disposal.suggest.dry", |
| | | "line1Key": "disposal.line1.dry", |
| | | "line2Key": "disposal.line2.dry", |
| | | "tipsKeys": [ |
| | | "disposal.tip1.dry", |
| | | "disposal.tip2.dry", |
| | | "disposal.tip3.dry", |
| | | "disposal.tip4.dry" |
| | | ] |
| | | } |
| | | } |
| | | ] |
| New file |
| | |
| | | { |
| | | "page.title": "Shanghai Waste Sorting Guide", |
| | | "header.title": "How to Sort Daily Waste in Shanghai?", |
| | | "btn.home": "Home", |
| | | "btn.query": "Search", |
| | | "btn.voice": "Hold to Speak", |
| | | "btn.standard": "Disposal Rules", |
| | | "btn.home.short": "Home", |
| | | "search.placeholder": "Enter waste name", |
| | | "search.notFoundHint": "I couldn't find an exact match. How about these?", |
| | | "search.referenceHint": "Please refer to the following categories.", |
| | | "search.noResults": "No results found. Please try another keyword.", |
| | | "lang.zh": "Chinese", |
| | | "lang.en": "English", |
| | | "lang.ko": "Korean", |
| | | "footer.copyright": "Shanghai Jingshen Copyright © 2026", |
| | | "welcome.title": "Friendly Reminder", |
| | | "welcome.p1": "1. Please enter the standard Chinese name of the waste (including material), such as glass bottle, disposable plastic cup, ceramic bowl, etc.", |
| | | "welcome.p2": "2. The specific classification standards for household waste sorting are refined and adjusted based on economic and social development, waste characteristics, and treatment methods.", |
| | | "welcome.p3": "3. This query system is for reference only. Please follow the requirements of local professional management authorities.", |
| | | "welcome.confirm": "Got it", |
| | | "disposal.suggestLabel": "Suggested disposal to:", |
| | | "disposal.tipsTitle": "Did You Know?", |
| | | "cat.recyclable": "Recyclables", |
| | | "cat.recyclable.desc": "Waste paper, waste plastic, waste glass products, waste metal, waste textiles and other household waste suitable for recycling and reuse.", |
| | | "cat.recyclable.standard": "1. Handle gently.\n2. Keep clean and dry to avoid contamination.\n3. Paper should be flat and dry.\n4. Plastic should be rinsed and dried.\n5. Empty and clean 3D packaging, then flatten.\n6. Wrap items with sharp edges.\n7. Metal should be rinsed and flattened.\n8. Textiles should be washed, dried, and folded.", |
| | | "cat.hazardous": "Hazardous Waste", |
| | | "cat.hazardous.desc": "Household waste that poses direct or potential harm to human health or the natural environment, including waste batteries, light tubes, medicine, paint and containers.", |
| | | "cat.hazardous.standard": "1. Handle hazardous waste gently; wrap fragile items.\n2. Keep batteries intact.\n3. Wrap light tubes to prevent breakage.\n4. Dispose medicine with packaging.\n5. Seal paint cans.\n6. Ensure safety, avoid leaks.\n7. Seal volatile items before disposal.", |
| | | "cat.wet": "Wet Waste", |
| | | "cat.wet.desc": "Perishable household waste including food scraps, leftovers, expired food, fruit peels, flowers, and herbal dregs.", |
| | | "cat.wet.standard": "1. Drain water before disposal.\n2. Pure liquids should go down the drain.\n3. Remove packaging from wet waste.\n4. Large bones and shells go in dry waste.\n5. Remove debris from kitchen waste.", |
| | | "cat.dry": "Dry Waste", |
| | | "cat.dry.desc": "Other household waste that is not recyclable, hazardous, or wet waste.", |
| | | "cat.dry.standard": "1. Drain water when possible.\n2. Hard-to-classify waste goes in dry waste.\n3. Break down large items.\n4. Disposable utensils and tissues are dry waste.\n5. Extinguish cigarette butts completely.", |
| | | "disposal.suggest.recyclable": "Recyclables", |
| | | "disposal.line1.recyclable": "Keep clean and dry to avoid contamination.", |
| | | "disposal.line2.recyclable": "Remove residue and flatten before disposal.", |
| | | "disposal.tip1.recyclable": "Recyclables can be processed into new products, saving resources.", |
| | | "disposal.tip2.recyclable": "Recycling one plastic bottle saves enough energy to power a 60W bulb for 3 hours.", |
| | | "disposal.tip3.recyclable": "Recycling one ton of paper saves 17 trees.", |
| | | "disposal.tip4.recyclable": "Every small act of sorting helps the circular economy.", |
| | | "disposal.suggest.hazardous": "Hazardous Waste", |
| | | "disposal.line1.hazardous": "Handle gently; wrap fragile items before disposal.", |
| | | "disposal.line2.hazardous": "Batteries and light tubes should remain intact.", |
| | | "disposal.tip1.hazardous": "Hazardous waste contains harmful substances requiring special treatment.", |
| | | "disposal.tip2.hazardous": "One discarded battery can contaminate 1 m² of land for 50 years.", |
| | | "disposal.tip3.hazardous": "Fluorescent tubes contain mercury; breakage pollutes air and soil.", |
| | | "disposal.tip4.hazardous": "Proper disposal protects our health and environment.", |
| | | "disposal.suggest.wet": "Wet Waste", |
| | | "disposal.line1.wet": "Drain water before disposal; pour pure liquids down the drain.", |
| | | "disposal.line2.wet": "Remove packaging from wet waste before sorting.", |
| | | "disposal.tip1.wet": "Wet waste can be composted into organic fertilizer.", |
| | | "disposal.tip2.wet": "Shanghai generates about 10,000 tons of wet waste daily.", |
| | | "disposal.tip3.wet": "Draining wet waste reduces leachate during processing.", |
| | | "disposal.tip4.wet": "Food scraps can become valuable resources through composting.", |
| | | "disposal.suggest.dry": "Dry Waste", |
| | | "disposal.line1.dry": "Drain water when possible before disposal.", |
| | | "disposal.line2.dry": "Hard-to-classify waste should go in dry waste.", |
| | | "disposal.tip1.dry": "Dry waste is mainly processed by incineration or landfill.", |
| | | "disposal.tip2.dry": "Reduce dry waste at the source through better sorting.", |
| | | "disposal.tip3.dry": "Tissues, cigarette butts, and disposable utensils are dry waste.", |
| | | "disposal.tip4.dry": "Better sorting makes our city more beautiful.", |
| | | "lang.ja": "日本語", |
| | | "item.milkBox": "Milk Carton", |
| | | "item.plastic": "Plastic", |
| | | "item.glassBottle": "Glass Bottle", |
| | | "item.glass": "Glass", |
| | | "item.paper": "Paper", |
| | | "item.clothes": "Clothes", |
| | | "item.brokenGlass": "Broken Glass", |
| | | "item.can": "Aluminum Can", |
| | | "item.plasticBox": "Plastic Box", |
| | | "item.foamBoard": "Foam Board", |
| | | "item.powerBank": "Power Bank", |
| | | "item.shoes": "Shoes", |
| | | "item.paperBox": "Paper Box", |
| | | "item.foamBox": "Foam Box", |
| | | "item.glassCup": "Glass Cup", |
| | | "item.newspaper": "Newspaper", |
| | | "item.plasticCup": "Plastic Cup", |
| | | "item.wire": "Electric Wire", |
| | | "item.dataCable": "Data Cable", |
| | | "item.waterBottle": "Water Bottle", |
| | | "item.pillow": "Pillow", |
| | | "item.blade": "Blade", |
| | | "item.screw": "Screw", |
| | | "item.foamPlastic": "Foam Plastic", |
| | | "item.yogurtTetraPak": "Yogurt Tetra Pak", |
| | | "item.paperBag": "Paper Bag", |
| | | "item.cosmeticPlasticBottle": "Empty Cosmetic Plastic Bottle", |
| | | "item.leatherShoes": "Leather Shoes", |
| | | "item.cosmeticGlassBottle": "Empty Cosmetic Glass Bottle", |
| | | "item.wineBottle": "Wine Bottle", |
| | | "item.chargingCable": "Charging Cable", |
| | | "item.flyer": "Flyer", |
| | | "item.wastePlastic": "Waste Plastic", |
| | | "item.cigaretteBox": "Cigarette Box", |
| | | "item.charger": "Charger", |
| | | "item.book": "Books", |
| | | "item.beerBottle": "Beer Bottle", |
| | | "item.cardboardBox": "Cardboard Box", |
| | | "item.woodChopsticks": "Wooden Chopsticks", |
| | | "item.plushToy": "Plush Toy", |
| | | "item.bedSheet": "Bed Sheet", |
| | | "item.scissors": "Scissors", |
| | | "item.drinkPlasticBottle": "Drink Plastic Bottle", |
| | | "item.fabric": "Fabric", |
| | | "item.dehumidifierBox": "Dehumidifier Box", |
| | | "item.magnet": "Magnet", |
| | | "item.plasticWrap": "Plastic Wrap", |
| | | "item.quilt": "Quilt", |
| | | "item.tetraPak": "Tetra Pak", |
| | | "item.basketball": "Basketball", |
| | | "item.aluminumFoil": "Aluminum Foil", |
| | | "item.socket": "Socket", |
| | | "item.iron": "Iron", |
| | | "item.key": "Key", |
| | | "item.printingPaper": "Printing Paper", |
| | | "item.metal": "Metal", |
| | | "item.whitePaper": "White Paper", |
| | | "item.packagingBox": "Packaging Paper Box", |
| | | "item.plasticLid": "Plastic Lid", |
| | | "item.envelope": "Envelope", |
| | | "item.medicinePackaging": "Medicine Packaging", |
| | | "item.medicineBottle": "Medicine Bottle", |
| | | "item.lightBulb": "Light Bulb", |
| | | "item.paintBucket": "Paint Bucket", |
| | | "item.medicine": "Medicine", |
| | | "item.expiredMedicine": "Expired Medicine", |
| | | "item.rechargeableBattery": "Rechargeable Battery", |
| | | "item.nailPolish": "Nail Polish", |
| | | "item.storageBattery": "Storage Battery", |
| | | "item.emptyMedicineBottle": "Empty Medicine Bottle", |
| | | "item.hazardousWaste": "Hazardous Waste", |
| | | "item.expiredMedicine2": "Expired Medicine", |
| | | "item.wasteMedicine": "Waste Medicine", |
| | | "item.lightTube": "Light Tube", |
| | | "item.fluorescentTube": "Fluorescent Tube", |
| | | "item.niCdBattery": "Ni-Cd Battery", |
| | | "item.photo": "Photo", |
| | | "item.fluorescentLamp": "Fluorescent Lamp", |
| | | "item.hairDyeShell": "Hair Dye Shell", |
| | | "item.eyeDrops": "Eye Drops", |
| | | "item.energySavingLamp": "Energy-saving Lamp", |
| | | "item.insecticide": "Insecticide", |
| | | "item.medicineTablet": "Medicine Tablet", |
| | | "item.medicineTabletBox": "Medicine Tablet Box", |
| | | "item.oralLiquidBottle": "Oral Liquid Medicine Bottle", |
| | | "item.wasteMedicineBottle": "Waste Medicine Bottle", |
| | | "item.paint": "Paint", |
| | | "item.buttonBattery": "Button Battery", |
| | | "item.contraceptive": "Contraceptive", |
| | | "item.eyeDropsBottle": "Eye Drops Bottle", |
| | | "item.film": "Film", |
| | | "item.capsule": "Capsule", |
| | | "item.mercuryThermometer": "Mercury Thermometer", |
| | | "item.ratPoison": "Rat Poison", |
| | | "item.capsuleBlister": "Capsule Blister Pack", |
| | | "item.hairDyeCan": "Hair Dye Can", |
| | | "item.energySavingBulb": "Energy-saving Bulb", |
| | | "item.allExpiredMedicine": "All Types of Expired Medicine", |
| | | "item.incandescentBulb": "Incandescent Bulb", |
| | | "item.phoneBattery": "Phone Battery", |
| | | "item.disinfectantBottle": "Disinfectant Bottle", |
| | | "item.expiredTablets": "Expired Tablets", |
| | | "item.coldMedicine": "Cold Medicine", |
| | | "item.disinfectant84Bottle": "Empty 84 Disinfectant Bottle", |
| | | "item.nailPolishBottle": "Nail Polish Bottle", |
| | | "item.sprayCan": "Spray Can", |
| | | "item.photoNegative": "Photo Negative", |
| | | "item.chinesePatentMedicine": "Chinese Patent Medicine", |
| | | "item.filmRoll": "Film Roll", |
| | | "item.medicineShell": "Medicine Shell", |
| | | "item.mercury": "Mercury", |
| | | "item.photo2": "Photo", |
| | | "item.wastePaintBucket": "Waste Paint Bucket", |
| | | "item.expiredDrug": "Expired Drug", |
| | | "item.medicineBlister": "Medicine Blister Pack", |
| | | "item.cockroachMedicine": "Cockroach Medicine", |
| | | "item.cockroachBall": "Cockroach Ball", |
| | | "item.capsuleTablet": "Capsule and Tablet", |
| | | "item.disinfectantTablet": "Disinfectant Tablet", |
| | | "item.energySavingTube": "Energy-saving Tube", |
| | | "item.melonSeedShell": "Melon Seed Shell", |
| | | "item.eggShell": "Egg Shell", |
| | | "item.cornCob": "Corn Cob", |
| | | "item.eggshell": "Eggshell", |
| | | "item.corn": "Corn", |
| | | "item.walnut": "Walnut", |
| | | "item.peanutShell": "Peanut Shell", |
| | | "item.tea": "Tea Leaves", |
| | | "item.lobsterShell": "Lobster Shell", |
| | | "item.crayfish": "Crayfish", |
| | | "item.crabShell": "Crab Shell", |
| | | "item.chickenBone": "Chicken Bone", |
| | | "item.melonSeed": "Melon Seed", |
| | | "item.crabShell2": "Crab Shell", |
| | | "item.cookedCornCob": "Cooked Corn Cob", |
| | | "item.pistachioShell": "Pistachio Shell", |
| | | "item.crayfishShell": "Crayfish Shell", |
| | | "item.edamameShell": "Edamame Shell", |
| | | "item.shrimpShell": "Shrimp Shell", |
| | | "item.bananaPeel": "Banana Peel", |
| | | "item.watermelonRind": "Watermelon Rind", |
| | | "item.chestnutShell": "Chestnut Shell", |
| | | "item.fishBone": "Fish Bone", |
| | | "item.lobster": "Lobster", |
| | | "item.cornCore": "Corn Core", |
| | | "item.melonSeedPiece": "Melon Seed Piece", |
| | | "item.flower": "Flower", |
| | | "item.coffeeGrounds": "Coffee Grounds", |
| | | "item.porkRibs": "Pork Ribs", |
| | | "item.zongzi": "Zongzi", |
| | | "item.herbalDregs": "Herbal Medicine Dregs", |
| | | "item.egg": "Egg", |
| | | "item.crab": "Crab", |
| | | "item.lycheeShell": "Lychee Shell", |
| | | "item.peach": "Peach", |
| | | "item.plumPit": "Preserved Plum Pit", |
| | | "item.jujubePit": "Jujube Pit", |
| | | "item.chickenBone2": "Chicken Bone", |
| | | "item.expiredFood": "Expired Food", |
| | | "item.fishBone2": "Fish Bone", |
| | | "item.apple": "Apple", |
| | | "item.lycheePit": "Lychee Pit", |
| | | "item.bayberry": "Bayberry", |
| | | "item.watermelonSeed": "Watermelon Seed", |
| | | "item.chestnutShell2": "Chestnut Shell", |
| | | "item.cockroach2": "Cockroach", |
| | | "item.fruitPeel": "Fruit Peel", |
| | | "item.mangoPit": "Mango Pit", |
| | | "item.peanut": "Peanut", |
| | | "item.driedPeanutShell": "Dried Peanut Shell", |
| | | "item.biscuit": "Biscuit", |
| | | "item.watermelon": "Watermelon", |
| | | "item.freshFlower": "Fresh Flower", |
| | | "item.redJujubePit": "Red Jujube Pit", |
| | | "item.lusuji": "Sorghum", |
| | | "item.appleCore": "Apple Core", |
| | | "item.waterBambooPeel": "Water Bamboo Peel", |
| | | "item.bread": "Bread", |
| | | "item.banana": "Banana", |
| | | "item.teaResidue": "Tea Residue", |
| | | "item.plasticBag": "Plastic Bag", |
| | | "item.zongziLeaf": "Zongzi Leaf", |
| | | "item.walnutShell": "Walnut Shell", |
| | | "item.hair": "Hair", |
| | | "item.shell": "Shell", |
| | | "item.sanitaryPad": "Sanitary Pad", |
| | | "item.condom": "Condom", |
| | | "item.chewingGum": "Chewing Gum", |
| | | "item.lighter": "Lighter", |
| | | "item.coconutShell": "Coconut Shell", |
| | | "item.catLitter": "Cat Litter", |
| | | "item.faceMask": "Face Mask", |
| | | "item.tissue": "Tissue Paper", |
| | | "item.bigBone": "Big Bone", |
| | | "item.milkTeaCup": "Milk Tea Cup", |
| | | "item.paperTowel": "Paper Towel", |
| | | "item.clamShell": "Clam Shell", |
| | | "item.zongziLeaf2": "Zongzi Leaf", |
| | | "item.cornHusk": "Corn Husk", |
| | | "item.straw": "Straw", |
| | | "item.teaBag": "Tea Bag", |
| | | "item.sugarcanePeel": "Sugarcane Peel", |
| | | "item.desiccant": "Desiccant", |
| | | "item.disposableChopsticks": "Disposable Chopsticks", |
| | | "item.cornShell": "Corn Shell", |
| | | "item.cigarette": "Cigarette Butt", |
| | | "item.wetWipe": "Wet Wipe", |
| | | "item.durianShell": "Durian Shell", |
| | | "item.toiletPaper": "Toilet Paper", |
| | | "item.bigWalnutShell": "Big Walnut Shell", |
| | | "item.nail": "Nail", |
| | | "item.packagingBag": "Packaging Bag", |
| | | "item.lipstick": "Lipstick", |
| | | "item.disposableCup": "Disposable Cup", |
| | | "item.snailShell": "Snail Shell", |
| | | "item.toothbrush": "Toothbrush", |
| | | "item.takeoutBox": "Takeout Box", |
| | | "item.durian": "Durian", |
| | | "item.diaper": "Diaper", |
| | | "item.trashBag": "Trash Bag", |
| | | "item.toothpasteTube": "Toothpaste Tube", |
| | | "item.icePack": "Ice Pack", |
| | | "item.sock": "Sock", |
| | | "item.pen": "Pen", |
| | | "item.diaper2": "Diaper", |
| | | "item.durianPit": "Durian Pit", |
| | | "item.disposableLunchBox": "Disposable Lunch Box", |
| | | "item.teaBag2": "Tea Bag", |
| | | "item.mask": "Mask", |
| | | "item.underwear": "Underwear", |
| | | "item.towel": "Towel", |
| | | "item.diaper3": "Diaper", |
| | | "item.ceramicBowl": "Ceramic Bowl", |
| | | "item.penRefill": "Pen Refill", |
| | | "item.dirtyPlasticBag": "Dirty Plastic Bag", |
| | | "item.paperClip": "Paper Clip", |
| | | "item.toothpick": "Toothpick", |
| | | "item.foodPackagingBag": "Food Packaging Bag", |
| | | "item.watercolorPen": "Watercolor Pen", |
| | | "item.cottonSwab": "Cotton Swab" |
| | | } |
| New file |
| | |
| | | { |
| | | "page.title": "上海市ゴミ分別ガイド", |
| | | "header.title": "上海市の生活ゴミはどう分別する?", |
| | | "btn.home": "ホーム", |
| | | "btn.query": "検索", |
| | | "btn.voice": "長押し音声", |
| | | "btn.standard": "排出基準", |
| | | "btn.home.short": "ホーム", |
| | | "search.placeholder": "ゴミの名前を入力", |
| | | "search.notFoundHint": "お探しの項目が見つかりませんでした。以下はいかがですか?", |
| | | "search.referenceHint": "以下の分類情報をご参照ください。", |
| | | "search.noResults": "関連する項目が見つかりません。別のキーワードをお試しください。", |
| | | "lang.zh": "中国語", |
| | | "lang.en": "英語", |
| | | "lang.ko": "韓国語", |
| | | "footer.copyright": "上海京申 Copyright © 2026", |
| | | "welcome.title": "ご案内", |
| | | "welcome.p1": "1. ゴミの正式な中国語名称(材質を含む)を入力してください。例:ガラス瓶、使い捨てプラスチックカップ、陶器の碗など。", |
| | | "welcome.p2": "2. 生活ゴミ分類の具体的基準は、経済社会発展水準、生活ゴミの特性、処理・利用方法に基づいて細分化・調整されます。", |
| | | "welcome.p3": "3. 本検索システムは参考用です。具体的な分類要件は管轄の専門管理部門の基準に従ってください。", |
| | | "welcome.confirm": "了解", |
| | | "disposal.suggestLabel": "排出先:", |
| | | "disposal.tipsTitle": "豆知識", |
| | | "cat.recyclable": "資源ごみ", |
| | | "cat.recyclable.desc": "廃紙、廃プラスチック、廃ガラス製品、廃金属、廃繊維など、リサイクル・再利用に適した生活廃棄物を指します。", |
| | | "cat.recyclable.standard": "1. 軽く入れてください。\n2. 清潔で乾燥した状態を保ち、汚染を避けてください。\n3. 紙類はできるだけ平らに、乾燥させてください。\n4. プラスチック類は残置物を取り除き、洗って乾かしてください。\n5. 立体包装は中身を空にし、清掃後に潰して排出してください。\n6. 鋭い角があるものは包んで排出してください。\n7. 金属類は残置物を取り除き、潰して排出してください。\n8. 繊維類は洗って乾かし、たたんで排出してください。", |
| | | "cat.hazardous": "有害ごみ", |
| | | "cat.hazardous.desc": "人体の健康や自然環境に直接的または潜在的な危害を及ぼす生活廃棄物。廃電池、廃灯管、廃薬品、廃ペンキとその容器などが含まれます。", |
| | | "cat.hazardous.standard": "1. 有害ごみは軽く入れ、壊れやすいものは包んで排出してください。\n2. 廃電池は分解せず、完全な状態を保ってください。\n3. 廃灯管は割れないよう紙で包んで排出してください。\n4. 廃薬品は包装と一緒に排出してください。\n5. 廃ペンキ缶は密封してください。\n6. 安全に注意し、漏れを避けてください。\n7. 揮発性のものは密封して排出してください。", |
| | | "cat.wet": "湿ったごみ", |
| | | "cat.wet.desc": "腐りやすい生活物質・生活廃棄物。食材くず、残り物、期限切れ食品、果物の皮・核、花、漢方薬のかすなどが含まれます。", |
| | | "cat.wet.standard": "1. 水切りしてから排出してください。\n2. 純粋な液体は排水口に流してください。\n3. 包装がある湿ったごみは包装を外してください。\n4. 大きな骨、貝殻類は乾いたごみとして排出してください。\n5. 厨余ごみは異物を取り除いて排出してください。", |
| | | "cat.dry": "乾いたごみ", |
| | | "cat.dry.desc": "資源ごみ、有害ごみ、湿ったごみ以外のその他の生活廃棄物。", |
| | | "cat.dry.standard": "1. できるだけ水切りしてください。\n2. 分類が難しい生活ごみは乾いたごみ容器に入れてください。\n3. 体積の大きいごみは適切に分解してください。\n4. 使い捨て食器、ティッシュは乾いたごみです。\n5. 吸い殻は完全に消してから排出してください。", |
| | | "disposal.suggest.recyclable": "資源ごみ", |
| | | "disposal.line1.recyclable": "清潔で乾燥した状態を保ち、汚染を避けてください。", |
| | | "disposal.line2.recyclable": "排出前に残置物を取り除き、潰して容積を減らしてください。", |
| | | "disposal.tip1.recyclable": "資源ごみはリサイクル処理により新しい製品に再生され、資源を節約します。", |
| | | "disposal.tip2.recyclable": "プラスチックボトル1本のリサイクルで60W電球を3時間点灯できる電力を節約できます。", |
| | | "disposal.tip3.recyclable": "紙1トンのリサイクルで17本の木を節約できます。", |
| | | "disposal.tip4.recyclable": "ゴミ分別は小さな実践から。資源の循環利用につなげましょう。", |
| | | "disposal.suggest.hazardous": "有害ごみ", |
| | | "disposal.line1.hazardous": "軽く入れ、壊れやすいものは包んで排出してください。", |
| | | "disposal.line2.hazardous": "廃電池、廃灯管などは分解せず、完全な状態を保ってください。", |
| | | "disposal.tip1.hazardous": "有害ごみには健康や環境に有害な物質が含まれ、特別な処理が必要です。", |
| | | "disposal.tip2.hazardous": "廃電池1個を無造作に捨てると1㎡の土地を50年間汚染する可能性があります。", |
| | | "disposal.tip3.hazardous": "廃蛍光灯管には水銀が含まれ、割れると空気と土壌を汚染します。", |
| | | "disposal.tip4.hazardous": "有害ごみを正しく排出することで、健康と環境を守ります。", |
| | | "disposal.suggest.wet": "湿ったごみ", |
| | | "disposal.line1.wet": "水切りしてから排出し、純粋な液体は排水口に流してください。", |
| | | "disposal.line2.wet": "包装がある湿ったごみは包装を外してから分別してください。", |
| | | "disposal.tip1.wet": "湿ったごみは生化学処理により有機肥料に転換できます。", |
| | | "disposal.tip2.wet": "上海では毎日約1万トンの湿ったごみが発生します。正しい分別が重要です。", |
| | | "disposal.tip3.wet": "排出前に水切りを十分に行うと、浸出液の発生を減らせます。", |
| | | "disposal.tip4.wet": "残り物も資源循環の貴重な材料になります。", |
| | | "disposal.suggest.dry": "乾いたごみ", |
| | | "disposal.line1.dry": "できるだけ水切りしてから排出してください。", |
| | | "disposal.line2.dry": "分類が難しい生活ごみは乾いたごみに入れてください。", |
| | | "disposal.tip1.dry": "乾いたごみは主に焼却または埋立で処理されます。", |
| | | "disposal.tip2.dry": "乾いたごみを減らすには、分別を生活化することが重要です。", |
| | | "disposal.tip3.dry": "ティッシュ、吸い殻、使い捨て食器などは乾いたごみです。", |
| | | "disposal.tip4.dry": "ゴミ分別で、より美しい都市を作りましょう。", |
| | | "lang.ja": "日本語", |
| | | "item.milkBox": "牛乳パック", |
| | | "item.plastic": "プラスチック", |
| | | "item.glassBottle": "ガラス瓶", |
| | | "item.glass": "ガラス", |
| | | "item.paper": "紙", |
| | | "item.clothes": "衣類", |
| | | "item.brokenGlass": "割れたガラス", |
| | | "item.can": "アルミ缶", |
| | | "item.plasticBox": "プラスチック箱", |
| | | "item.foamBoard": "発泡ボード", |
| | | "item.powerBank": "モバイルバッテリー", |
| | | "item.shoes": "靴", |
| | | "item.paperBox": "紙箱", |
| | | "item.foamBox": "発泡スチロール箱", |
| | | "item.glassCup": "ガラスコップ", |
| | | "item.newspaper": "新聞紙", |
| | | "item.plasticCup": "プラスチックカップ", |
| | | "item.wire": "電線", |
| | | "item.dataCable": "データケーブル", |
| | | "item.waterBottle": "ミネラルウォーターボトル", |
| | | "item.pillow": "枕", |
| | | "item.blade": "刃物", |
| | | "item.screw": "ネジ", |
| | | "item.foamPlastic": "発泡プラスチック", |
| | | "item.yogurtTetraPak": "ヨーグルトテトラパック", |
| | | "item.paperBag": "紙袋", |
| | | "item.cosmeticPlasticBottle": "化粧品プラスチック空瓶", |
| | | "item.leatherShoes": "革靴", |
| | | "item.cosmeticGlassBottle": "化粧品ガラス空瓶", |
| | | "item.wineBottle": "酒瓶", |
| | | "item.chargingCable": "充電ケーブル", |
| | | "item.flyer": "チラシ", |
| | | "item.wastePlastic": "廃プラスチック", |
| | | "item.cigaretteBox": "タバコの箱", |
| | | "item.charger": "充電器", |
| | | "item.book": "書籍", |
| | | "item.beerBottle": "ビール瓶", |
| | | "item.cardboardBox": "段ボール箱", |
| | | "item.woodChopsticks": "木製箸", |
| | | "item.plushToy": "ぬいぐるみ", |
| | | "item.bedSheet": "シーツ", |
| | | "item.scissors": "はさみ", |
| | | "item.drinkPlasticBottle": "飲料プラスチックボトル", |
| | | "item.fabric": "布", |
| | | "item.dehumidifierBox": "除湿剤ボックス", |
| | | "item.magnet": "磁石", |
| | | "item.plasticWrap": "プラスチック包装紙", |
| | | "item.quilt": "布団", |
| | | "item.tetraPak": "テトラパック", |
| | | "item.basketball": "バスケットボール", |
| | | "item.aluminumFoil": "アルミホイル", |
| | | "item.socket": "コンセント", |
| | | "item.iron": "鉄", |
| | | "item.key": "鍵", |
| | | "item.printingPaper": "印刷用紙", |
| | | "item.metal": "金属", |
| | | "item.whitePaper": "白紙", |
| | | "item.packagingBox": "包装紙箱", |
| | | "item.plasticLid": "プラスチック蓋", |
| | | "item.envelope": "封筒", |
| | | "item.medicinePackaging": "薬の包装", |
| | | "item.medicineBottle": "薬瓶", |
| | | "item.lightBulb": "電球", |
| | | "item.paintBucket": "ペンキ缶", |
| | | "item.medicine": "薬品", |
| | | "item.expiredMedicine": "期限切れの薬", |
| | | "item.rechargeableBattery": "充電式電池", |
| | | "item.nailPolish": "マニキュア", |
| | | "item.storageBattery": "蓄電池", |
| | | "item.emptyMedicineBottle": "空の薬瓶", |
| | | "item.hazardousWaste": "有害ごみ", |
| | | "item.expiredMedicine2": "期限切れ医薬品", |
| | | "item.wasteMedicine": "廃薬品", |
| | | "item.lightTube": "蛍光灯管", |
| | | "item.fluorescentTube": "蛍光管", |
| | | "item.niCdBattery": "ニッケルカドミウム電池", |
| | | "item.photo": "写真", |
| | | "item.fluorescentLamp": "蛍光灯", |
| | | "item.hairDyeShell": "ヘアカラー容器", |
| | | "item.eyeDrops": "目薬", |
| | | "item.energySavingLamp": "省エネランプ", |
| | | "item.insecticide": "殺虫剤", |
| | | "item.medicineTablet": "錠剤", |
| | | "item.medicineTabletBox": "錠剤の箱", |
| | | "item.oralLiquidBottle": "内服液薬瓶", |
| | | "item.wasteMedicineBottle": "廃薬瓶", |
| | | "item.paint": "ペンキ", |
| | | "item.buttonBattery": "ボタン電池", |
| | | "item.contraceptive": "避妊薬", |
| | | "item.eyeDropsBottle": "目薬瓶", |
| | | "item.film": "フィルム", |
| | | "item.capsule": "カプセル", |
| | | "item.mercuryThermometer": "水銀体温計", |
| | | "item.ratPoison": "ネズミ薬", |
| | | "item.capsuleBlister": "カプセル・錠剤シート", |
| | | "item.hairDyeCan": "ヘアカラー缶", |
| | | "item.energySavingBulb": "省エネ電球", |
| | | "item.allExpiredMedicine": "各種期限切れ医薬品", |
| | | "item.incandescentBulb": "白熱電球", |
| | | "item.phoneBattery": "携帯電話バッテリー", |
| | | "item.disinfectantBottle": "消毒液瓶", |
| | | "item.expiredTablets": "期限切れ錠剤", |
| | | "item.coldMedicine": "風邪薬", |
| | | "item.disinfectant84Bottle": "84消毒液空瓶", |
| | | "item.nailPolishBottle": "マニキュア瓶", |
| | | "item.sprayCan": "殺虫スプレー缶", |
| | | "item.photoNegative": "写真フィルム", |
| | | "item.chinesePatentMedicine": "中成薬", |
| | | "item.filmRoll": "フィルムロール", |
| | | "item.medicineShell": "薬の包装殻", |
| | | "item.mercury": "水銀", |
| | | "item.photo2": "写真", |
| | | "item.wastePaintBucket": "廃ペンキ缶", |
| | | "item.expiredDrug": "期限切れ薬物", |
| | | "item.medicineBlister": "薬のアルミプラスチック板", |
| | | "item.cockroachMedicine": "ゴキブリ薬", |
| | | "item.cockroachBall": "ゴキブリ丸", |
| | | "item.capsuleTablet": "カプセル・錠剤", |
| | | "item.disinfectantTablet": "消毒錠", |
| | | "item.energySavingTube": "省エネ蛍光管", |
| | | "item.melonSeedShell": "瓜子の殻", |
| | | "item.eggShell": "卵の殻", |
| | | "item.cornCob": "とうもろこしの芯", |
| | | "item.eggshell": "卵殻", |
| | | "item.corn": "とうもろこし", |
| | | "item.walnut": "クルミ", |
| | | "item.peanutShell": "ピーナッツの殻", |
| | | "item.tea": "茶葉", |
| | | "item.lobsterShell": "ロブスターの殻", |
| | | "item.crayfish": "ザリガニ", |
| | | "item.crabShell": "カニの殻", |
| | | "item.chickenBone": "鶏の骨", |
| | | "item.melonSeed": "瓜子", |
| | | "item.crabShell2": "カニの殻", |
| | | "item.cookedCornCob": "茹でたとうもろこしの芯", |
| | | "item.pistachioShell": "ピスタチオの殻", |
| | | "item.crayfishShell": "ザリガニの殻", |
| | | "item.edamameShell": "枝豆の殻", |
| | | "item.shrimpShell": "エビの殻", |
| | | "item.bananaPeel": "バナナの皮", |
| | | "item.watermelonRind": "スイカの皮", |
| | | "item.chestnutShell": "栗の殻", |
| | | "item.fishBone": "魚の骨", |
| | | "item.lobster": "ロブスター", |
| | | "item.cornCore": "とうもろこし芯", |
| | | "item.melonSeedPiece": "瓜子の破片", |
| | | "item.flower": "花", |
| | | "item.coffeeGrounds": "コーヒーかす", |
| | | "item.porkRibs": "スペアリブ", |
| | | "item.zongzi": "ちまき", |
| | | "item.herbalDregs": "漢方薬のかす", |
| | | "item.egg": "卵", |
| | | "item.crab": "カニ", |
| | | "item.lycheeShell": "ライチの殻", |
| | | "item.peach": "桃", |
| | | "item.plumPit": "梅干しの核", |
| | | "item.jujubePit": "ナツメの核", |
| | | "item.chickenBone2": "鶏骨", |
| | | "item.expiredFood": "期限切れ食品", |
| | | "item.fishBone2": "魚骨", |
| | | "item.apple": "りんご", |
| | | "item.lycheePit": "ライチの核", |
| | | "item.bayberry": "ヤマモモ", |
| | | "item.watermelonSeed": "スイカの種", |
| | | "item.chestnutShell2": "栗の殻", |
| | | "item.cockroach2": "ゴキブリ", |
| | | "item.fruitPeel": "果物の皮", |
| | | "item.mangoPit": "マンゴーの核", |
| | | "item.peanut": "ピーナッツ", |
| | | "item.driedPeanutShell": "干したピーナッツの殻", |
| | | "item.biscuit": "ビスケット", |
| | | "item.watermelon": "スイカ", |
| | | "item.freshFlower": "生花", |
| | | "item.redJujubePit": "赤ナツメの核", |
| | | "item.lusuji": "芦稷", |
| | | "item.appleCore": "りんごの芯", |
| | | "item.waterBambooPeel": "ザーサイの皮", |
| | | "item.bread": "パン", |
| | | "item.banana": "バナナ", |
| | | "item.teaResidue": "茶葉かす", |
| | | "item.plasticBag": "ビニール袋", |
| | | "item.zongziLeaf": "ちまきの葉", |
| | | "item.walnutShell": "クルミの殻", |
| | | "item.hair": "髪の毛", |
| | | "item.shell": "貝殻", |
| | | "item.sanitaryPad": "生理用ナプキン", |
| | | "item.condom": "コンドーム", |
| | | "item.chewingGum": "ガム", |
| | | "item.lighter": "ライター", |
| | | "item.coconutShell": "ココナッツの殻", |
| | | "item.catLitter": "猫砂", |
| | | "item.faceMask": "フェイスマスク", |
| | | "item.tissue": "ナプキン", |
| | | "item.bigBone": "大きな骨", |
| | | "item.milkTeaCup": "タピオカティーカップ", |
| | | "item.paperTowel": "ティッシュ", |
| | | "item.clamShell": "アサリの殻", |
| | | "item.zongziLeaf2": "ちまきの葉", |
| | | "item.cornHusk": "とうもろこしの皮", |
| | | "item.straw": "ストロー", |
| | | "item.teaBag": "ティーバッグ", |
| | | "item.sugarcanePeel": "サトウキビの皮", |
| | | "item.desiccant": "乾燥剤", |
| | | "item.disposableChopsticks": "使い捨て箸", |
| | | "item.cornShell": "とうもろこしの殻", |
| | | "item.cigarette": "吸い殻", |
| | | "item.wetWipe": "ウェットティッシュ", |
| | | "item.durianShell": "ドリアンの殻", |
| | | "item.toiletPaper": "トイレットペーパー", |
| | | "item.bigWalnutShell": "大きなクルミの殻", |
| | | "item.nail": "爪", |
| | | "item.packagingBag": "包装袋", |
| | | "item.lipstick": "口紅", |
| | | "item.disposableCup": "使い捨てカップ", |
| | | "item.snailShell": "巻き貝の殻", |
| | | "item.toothbrush": "歯ブラシ", |
| | | "item.takeoutBox": "テイクアウト容器", |
| | | "item.durian": "ドリアン", |
| | | "item.diaper": "おむつ", |
| | | "item.trashBag": "ゴミ袋", |
| | | "item.toothpasteTube": "歯磨きチューブ", |
| | | "item.icePack": "保冷剤", |
| | | "item.sock": "靴下", |
| | | "item.pen": "ペン", |
| | | "item.diaper2": "紙おむつ", |
| | | "item.durianPit": "ドリアンの種", |
| | | "item.disposableLunchBox": "使い捨て弁当箱", |
| | | "item.teaBag2": "茶葉パック", |
| | | "item.mask": "マスク", |
| | | "item.underwear": "下着", |
| | | "item.towel": "タオル", |
| | | "item.diaper3": "おむつ", |
| | | "item.ceramicBowl": "陶器の碗", |
| | | "item.penRefill": "ペン芯", |
| | | "item.dirtyPlasticBag": "汚れたビニール袋", |
| | | "item.paperClip": "クリップ", |
| | | "item.toothpick": "爪楊枝", |
| | | "item.foodPackagingBag": "食品包装袋", |
| | | "item.watercolorPen": "水彩ペン", |
| | | "item.cottonSwab": "綿棒" |
| | | } |
| New file |
| | |
| | | { |
| | | "page.title": "상하이 쓰레기 분류 조회", |
| | | "header.title": "상하이 생활 쓰레기, 어떻게 분류할까요?", |
| | | "btn.home": "홈", |
| | | "btn.query": "조회", |
| | | "btn.voice": "길게 눌러 음성", |
| | | "btn.standard": "배출 기준", |
| | | "btn.home.short": "홈", |
| | | "search.placeholder": "쓰레기 이름 입력", |
| | | "search.notFoundHint": "원하시는 항목을 찾지 못했습니다. 아래 항목은 어떠세요?", |
| | | "search.referenceHint": "아래 분류 정보를 참고해 주세요.", |
| | | "search.noResults": "관련 항목을 찾을 수 없습니다. 다른 키워드를 시도해 보세요.", |
| | | "lang.zh": "중국어", |
| | | "lang.en": "영어", |
| | | "lang.ko": "한국어", |
| | | "footer.copyright": "상하이 징션 Copyright © 2026", |
| | | "welcome.title": "안내 말씀", |
| | | "welcome.p1": "1. 쓰레기의 정상적인 중국어 이름(재질 포함)을 입력하세요. 예: 유리병, 일회용 플라스틱 컵, 도자기 그릇 등.", |
| | | "welcome.p2": "2. 생활 쓰레기 분류의 구체적인 기준은 경제·사회 발전 수준, 생활 쓰레기 특성 및 처리·이용 방법에 따라 세분화·조정됩니다.", |
| | | "welcome.p3": "3. 본 조회 시스템은 참고용이며, 구체적인 분류 요건은 관할 전문 관리 부서 기준을 따릅니다.", |
| | | "welcome.confirm": "알겠습니다", |
| | | "disposal.suggestLabel": "배출 권장:", |
| | | "disposal.tipsTitle": "알아두세요", |
| | | "cat.recyclable": "재활용품", |
| | | "cat.recyclable.desc": "폐지, 폐플라스틱, 폐유리 제품, 폐금속, 폐직물 등 재활용 및 순환 이용이 가능한 생활 폐기물을 말합니다.", |
| | | "cat.recyclable.standard": "1. 가볍게 넣으세요.\n2. 깨끗하고 건조하게, 오염을 피하세요.\n3. 종이는 평평하게, 건조하게 유지하세요.\n4. 플라스틱은 잔여물을 제거하고 헹구어 말리세요.\n5. 입체 포장은 내용물을 비우고 청소 후 눌러서 배출하세요.\n6. 날카로운 모서리는 감싸서 배출하세요.\n7. 금속은 잔여물을 제거하고 눌러서 배출하세요.\n8. 직물은 세탁 후 말리고 접어서 배출하세요.", |
| | | "cat.hazardous": "유해 쓰레기", |
| | | "cat.hazardous.desc": "인체 건강이나 자연 환경에 직접 또는 잠재적 위해를 줄 수 있는 생활 폐기물. 폐배터리, 폐등관, 폐의약품, 폐페인트 및 용기 등이 포함됩니다.", |
| | | "cat.hazardous.standard": "1. 유해 쓰레기는 가볍게, 깨지기 쉬운 것은 감싸서 배출하세요.\n2. 폐배터리는 분해하지 말고 온전하게 유지하세요.\n3. 폐등관은 깨지지 않도록 종이로 감싸세요.\n4. 폐의약품은 포장과 함께 배출하세요.\n5. 폐페인트 통은 밀봉하세요.\n6. 안전에 유의하고 누출을 피하세요.\n7. 휘발성 물질은 밀봉 후 배출하세요.", |
| | | "cat.wet": "습식 쓰레기", |
| | | "cat.wet.desc": "부패하기 쉬운 생활 물질 및 폐기물. 식재료 찌꺼기, 남은 음식, 유통기한 지난 식품, 과일 껍질·씨, 화초, 한약 찌꺼기 등이 포함됩니다.", |
| | | "cat.wet.standard": "1. 물기를 제거한 후 배출하세요.\n2. 순수 액체는 하수구에 버리세요.\n3. 포장이 있는 습식 쓰레기는 포장을 제거하세요.\n4. 큰 뼈, 조개껍질은 건식 쓰레기로 배출하세요.\n5. 음식물 쓰레기는 이물질을 제거하세요.", |
| | | "cat.dry": "건식 쓰레기", |
| | | "cat.dry.desc": "재활용품, 유해 쓰레기, 습식 쓰레기 외의 기타 생활 폐기물.", |
| | | "cat.dry.standard": "1. 가능하면 물기를 제거하세요.\n2. 분류가 어려운 생활 쓰레기는 건식 쓰레기에 배출하세요.\n3. 부피가 큰 쓰레기는 분해하세요.\n4. 일회용 식기, 휴지는 건식 쓰레기입니다.\n5. 담배꽁초는 완전히 끈 후 배출하세요.", |
| | | "disposal.suggest.recyclable": "재활용품", |
| | | "disposal.line1.recyclable": "깨끗하고 건조한 상태로 오염을 피해 주세요.", |
| | | "disposal.line2.recyclable": "배출 전 잔여물을 제거하고 눌러 부피를 줄여 주세요.", |
| | | "disposal.tip1.recyclable": "재활용품은 재처리되어 새로운 제품으로 만들어져 자원을 절약합니다.", |
| | | "disposal.tip2.recyclable": "플라스틱병 1개를 재활용하면 60W 전구를 3시간 켤 수 있는 전력을 절약합니다.", |
| | | "disposal.tip3.recyclable": "종이 1톤을 재활용하면 나무 17그루를 절약할 수 있습니다.", |
| | | "disposal.tip4.recyclable": "작은 분류 실천이 자원 순환에 큰 도움이 됩니다.", |
| | | "disposal.suggest.hazardous": "유해 쓰레기", |
| | | "disposal.line1.hazardous": "가볍게 넣고, 깨지기 쉬운 것은 감싸서 배출하세요.", |
| | | "disposal.line2.hazardous": "폐배터리, 폐등관 등은 분해하지 말고 온전하게 유지하세요.", |
| | | "disposal.tip1.hazardous": "유해 쓰레기에는 건강과 환경에 해로운 물질이 포함되어 특별 처리가 필요합니다.", |
| | | "disposal.tip2.hazardous": "폐배터리 1개를 무작위로 버리면 1㎡ 토양을 50년간 오염시킬 수 있습니다.", |
| | | "disposal.tip3.hazardous": "폐형광등에는 수은이 들어 있어 깨지면 공기와 토양을 오염시킵니다.", |
| | | "disposal.tip4.hazardous": "올바른 유해 쓰레기 배출은 건강과 환경을 보호합니다.", |
| | | "disposal.suggest.wet": "습식 쓰레기", |
| | | "disposal.line1.wet": "물기를 제거한 후 배출하고, 순수 액체는 하수구에 버리세요.", |
| | | "disposal.line2.wet": "포장이 있는 습식 쓰레기는 포장을 제거한 후 분류하세요.", |
| | | "disposal.tip1.wet": "습식 쓰레기는 생화학 처리를 통해 유기 비료로 전환될 수 있습니다.", |
| | | "disposal.tip2.wet": "상하이는 하루 약 1만 톤의 습식 쓰레기를 배출합니다. 올바른 분류가 중요합니다.", |
| | | "disposal.tip3.wet": "배출 전 물기를 충분히 제거하면 침출수 발생을 줄일 수 있습니다.", |
| | | "disposal.tip4.wet": "음식 찌꺼기도 자원 순환의 소중한 재료가 될 수 있습니다.", |
| | | "disposal.suggest.dry": "건식 쓰레기", |
| | | "disposal.line1.dry": "가능하면 물기를 제거한 후 배출하세요.", |
| | | "disposal.line2.dry": "분류가 어려운 생활 쓰레기는 건식 쓰레기에 배출하세요.", |
| | | "disposal.tip1.dry": "건식 쓰레기는 주로 소각 또는 매립으로 처리됩니다.", |
| | | "disposal.tip2.dry": "건식 쓰레기를 줄이려면 분류를 생활화하는 것이 중요합니다.", |
| | | "disposal.tip3.dry": "휴지, 담배꽁초, 일회용 식기 등은 건식 쓰레기입니다.", |
| | | "disposal.tip4.dry": "쓰레기 분류로 더 아름다운 도시를 만들어 갑시다.", |
| | | "lang.ja": "日本語", |
| | | "item.milkBox": "우유팩", |
| | | "item.plastic": "플라스틱", |
| | | "item.glassBottle": "유리병", |
| | | "item.glass": "유리", |
| | | "item.paper": "종이", |
| | | "item.clothes": "옷", |
| | | "item.brokenGlass": "깨진 유리", |
| | | "item.can": "알루미늄 캔", |
| | | "item.plasticBox": "플라스틱 상자", |
| | | "item.foamBoard": "스티로폼 판", |
| | | "item.powerBank": "보조배터리", |
| | | "item.shoes": "신발", |
| | | "item.paperBox": "종이상자", |
| | | "item.foamBox": "스티로폼 상자", |
| | | "item.glassCup": "유리컵", |
| | | "item.newspaper": "신문", |
| | | "item.plasticCup": "플라스틱 컵", |
| | | "item.wire": "전선", |
| | | "item.dataCable": "데이터 케이블", |
| | | "item.waterBottle": "생수병", |
| | | "item.pillow": "베개", |
| | | "item.blade": "칼날", |
| | | "item.screw": "나사", |
| | | "item.foamPlastic": "발포 플라스틱", |
| | | "item.yogurtTetraPak": "요구르트 테트라팩", |
| | | "item.paperBag": "종이봉투", |
| | | "item.cosmeticPlasticBottle": "화장품 플라스틱 빈병", |
| | | "item.leatherShoes": "가죽신", |
| | | "item.cosmeticGlassBottle": "화장품 유리 빈병", |
| | | "item.wineBottle": "술병", |
| | | "item.chargingCable": "충전 케이블", |
| | | "item.flyer": "광고 전단", |
| | | "item.wastePlastic": "폐플라스틱", |
| | | "item.cigaretteBox": "담배갑", |
| | | "item.charger": "충전기", |
| | | "item.book": "책", |
| | | "item.beerBottle": "맥주병", |
| | | "item.cardboardBox": "골판지 상자", |
| | | "item.woodChopsticks": "나무 젓가락", |
| | | "item.plushToy": "봉제 인형", |
| | | "item.bedSheet": "침대 시트", |
| | | "item.scissors": "가위", |
| | | "item.drinkPlasticBottle": "음료 플라스틱병", |
| | | "item.fabric": "천", |
| | | "item.dehumidifierBox": "제습제 상자", |
| | | "item.magnet": "자석", |
| | | "item.plasticWrap": "플라스틱 포장지", |
| | | "item.quilt": "이불", |
| | | "item.tetraPak": "테트라팩", |
| | | "item.basketball": "농구공", |
| | | "item.aluminumFoil": "알루미늄 호일", |
| | | "item.socket": "콘센트", |
| | | "item.iron": "철", |
| | | "item.key": "열쇠", |
| | | "item.printingPaper": "인쇄용지", |
| | | "item.metal": "금속", |
| | | "item.whitePaper": "흰 종이", |
| | | "item.packagingBox": "포장 종이상자", |
| | | "item.plasticLid": "플라스틱 뚜껑", |
| | | "item.envelope": "봉투", |
| | | "item.medicinePackaging": "약 포장", |
| | | "item.medicineBottle": "약병", |
| | | "item.lightBulb": "전구", |
| | | "item.paintBucket": "페인트 통", |
| | | "item.medicine": "약품", |
| | | "item.expiredMedicine": "유통기한 지난 약", |
| | | "item.rechargeableBattery": "충전 배터리", |
| | | "item.nailPolish": "매니큐어", |
| | | "item.storageBattery": "축전지", |
| | | "item.emptyMedicineBottle": "빈 약병", |
| | | "item.hazardousWaste": "유해 쓰레기", |
| | | "item.expiredMedicine2": "유통기한 지난 의약품", |
| | | "item.wasteMedicine": "폐의약품", |
| | | "item.lightTube": "형광등", |
| | | "item.fluorescentTube": "형광등관", |
| | | "item.niCdBattery": "니켈카드뮴 배터리", |
| | | "item.photo": "사진", |
| | | "item.fluorescentLamp": "형광등", |
| | | "item.hairDyeShell": "염색제 용기", |
| | | "item.eyeDrops": "안약", |
| | | "item.energySavingLamp": "절전등", |
| | | "item.insecticide": "살충제", |
| | | "item.medicineTablet": "약정", |
| | | "item.medicineTabletBox": "약정 상자", |
| | | "item.oralLiquidBottle": "시럽 약병", |
| | | "item.wasteMedicineBottle": "폐약병", |
| | | "item.paint": "페인트", |
| | | "item.buttonBattery": "단추전지", |
| | | "item.contraceptive": "피임약", |
| | | "item.eyeDropsBottle": "안약병", |
| | | "item.film": "필름", |
| | | "item.capsule": "캡슐", |
| | | "item.mercuryThermometer": "수은 온도계", |
| | | "item.ratPoison": "쥐약", |
| | | "item.capsuleBlister": "캡슐 알약 팩", |
| | | "item.hairDyeCan": "염색제 캔", |
| | | "item.energySavingBulb": "절전 전구", |
| | | "item.allExpiredMedicine": "각종 유통기한 지난 의약품", |
| | | "item.incandescentBulb": "백열전구", |
| | | "item.phoneBattery": "휴대폰 배터리", |
| | | "item.disinfectantBottle": "소독액병", |
| | | "item.expiredTablets": "유통기한 지난 약정", |
| | | "item.coldMedicine": "감기약", |
| | | "item.disinfectant84Bottle": "84 소독액 빈병", |
| | | "item.nailPolishBottle": "매니큐어 병", |
| | | "item.sprayCan": "살충 스프레이 캔", |
| | | "item.photoNegative": "사진 필름", |
| | | "item.chinesePatentMedicine": "중성 한약", |
| | | "item.filmRoll": "필름 롤", |
| | | "item.medicineShell": "약 포장 껍데기", |
| | | "item.mercury": "수은", |
| | | "item.photo2": "사진", |
| | | "item.wastePaintBucket": "폐페인트 통", |
| | | "item.expiredDrug": "유통기한 지난 약물", |
| | | "item.medicineBlister": "약 알루미늄 팩", |
| | | "item.cockroachMedicine": "바퀴벌레 약", |
| | | "item.cockroachBall": "바퀴벌레 알약", |
| | | "item.capsuleTablet": "캡슐 알약", |
| | | "item.disinfectantTablet": "소독 정제", |
| | | "item.energySavingTube": "절전 형광등관", |
| | | "item.melonSeedShell": "해바라기씨 껍질", |
| | | "item.eggShell": "달걀껍질", |
| | | "item.cornCob": "옥수수대", |
| | | "item.eggshell": "계란 껍질", |
| | | "item.corn": "옥수수", |
| | | "item.walnut": "호두", |
| | | "item.peanutShell": "땅콩 껍질", |
| | | "item.tea": "찻잎", |
| | | "item.lobsterShell": "랍스터 껍질", |
| | | "item.crayfish": "가재", |
| | | "item.crabShell": "게 껍질", |
| | | "item.chickenBone": "닭뼈", |
| | | "item.melonSeed": "해바라기씨", |
| | | "item.crabShell2": "게 껍데기", |
| | | "item.cookedCornCob": "익힌 옥수수대", |
| | | "item.pistachioShell": "피스타치오 껍질", |
| | | "item.crayfishShell": "가재 껍질", |
| | | "item.edamameShell": "완두콩 껍질", |
| | | "item.shrimpShell": "새우 껍질", |
| | | "item.bananaPeel": "바나나 껍질", |
| | | "item.watermelonRind": "수박 껍질", |
| | | "item.chestnutShell": "밤 껍질", |
| | | "item.fishBone": "생선 뼈", |
| | | "item.lobster": "랍스터", |
| | | "item.cornCore": "옥수수 심", |
| | | "item.melonSeedPiece": "해바라기씨 조각", |
| | | "item.flower": "꽃", |
| | | "item.coffeeGrounds": "커피 찌꺼기", |
| | | "item.porkRibs": "갈비", |
| | | "item.zongzi": "종자", |
| | | "item.herbalDregs": "한약 찌꺼기", |
| | | "item.egg": "달걀", |
| | | "item.crab": "게", |
| | | "item.lycheeShell": "리치 껍질", |
| | | "item.peach": "복숭아", |
| | | "item.plumPit": "화매 씨", |
| | | "item.jujubePit": "대추 씨", |
| | | "item.chickenBone2": "닭뼈", |
| | | "item.expiredFood": "유통기한 지난 식품", |
| | | "item.fishBone2": "생선 가시", |
| | | "item.apple": "사과", |
| | | "item.lycheePit": "리치 씨", |
| | | "item.bayberry": "양매", |
| | | "item.watermelonSeed": "수박씨", |
| | | "item.chestnutShell2": "밤 껍질", |
| | | "item.cockroach2": "바퀴벌레", |
| | | "item.fruitPeel": "과일 껍질", |
| | | "item.mangoPit": "망고 씨", |
| | | "item.peanut": "땅콩", |
| | | "item.driedPeanutShell": "말린 땅콩 껍질", |
| | | "item.biscuit": "비스킷", |
| | | "item.watermelon": "수박", |
| | | "item.freshFlower": "생화", |
| | | "item.redJujubePit": "대추 씨", |
| | | "item.lusuji": "수수", |
| | | "item.appleCore": "사과 씨", |
| | | "item.waterBambooPeel": "교백피", |
| | | "item.bread": "빵", |
| | | "item.banana": "바나나", |
| | | "item.teaResidue": "찻잎 찌꺼기", |
| | | "item.plasticBag": "비닐봉지", |
| | | "item.zongziLeaf": "종자 잎", |
| | | "item.walnutShell": "호두 껍질", |
| | | "item.hair": "머리카락", |
| | | "item.shell": "조개껍질", |
| | | "item.sanitaryPad": "생리대", |
| | | "item.condom": "콘돔", |
| | | "item.chewingGum": "껌", |
| | | "item.lighter": "라이터", |
| | | "item.coconutShell": "코코넛 껍질", |
| | | "item.catLitter": "고양이 모래", |
| | | "item.faceMask": "마스크팩", |
| | | "item.tissue": "냅킨", |
| | | "item.bigBone": "큰 뼈", |
| | | "item.milkTeaCup": "밀크티 컵", |
| | | "item.paperTowel": "휴지", |
| | | "item.clamShell": "조개 껍질", |
| | | "item.zongziLeaf2": "종자 잎", |
| | | "item.cornHusk": "옥수수 껍질", |
| | | "item.straw": "빨대", |
| | | "item.teaBag": "티백", |
| | | "item.sugarcanePeel": "사탕수수 껍질", |
| | | "item.desiccant": "건조제", |
| | | "item.disposableChopsticks": "일회용 젓가락", |
| | | "item.cornShell": "옥수수 껍데기", |
| | | "item.cigarette": "담배꽁초", |
| | | "item.wetWipe": "물티슈", |
| | | "item.durianShell": "두리안 껍질", |
| | | "item.toiletPaper": "화장지", |
| | | "item.bigWalnutShell": "큰 호두 껍질", |
| | | "item.nail": "손톱", |
| | | "item.packagingBag": "포장봉지", |
| | | "item.lipstick": "립스틱", |
| | | "item.disposableCup": "일회용 컵", |
| | | "item.snailShell": "골뱅이 껍질", |
| | | "item.toothbrush": "칫솔", |
| | | "item.takeoutBox": "배달 용기", |
| | | "item.durian": "두리안", |
| | | "item.diaper": "기저귀", |
| | | "item.trashBag": "쓰레기봉지", |
| | | "item.toothpasteTube": "치약 튜브", |
| | | "item.icePack": "아이스팩", |
| | | "item.sock": "양말", |
| | | "item.pen": "펜", |
| | | "item.diaper2": "기저귀", |
| | | "item.durianPit": "두리안 씨", |
| | | "item.disposableLunchBox": "일회용 도시락통", |
| | | "item.teaBag2": "찻잎 티백", |
| | | "item.mask": "마스크", |
| | | "item.underwear": "속옷", |
| | | "item.towel": "수건", |
| | | "item.diaper3": "기저귀", |
| | | "item.ceramicBowl": "도자기 그릇", |
| | | "item.penRefill": "펜심", |
| | | "item.dirtyPlasticBag": "더러운 비닐봉지", |
| | | "item.paperClip": "클립", |
| | | "item.toothpick": "이쑤시개", |
| | | "item.foodPackagingBag": "식품 포장봉지", |
| | | "item.watercolorPen": "물감펜", |
| | | "item.cottonSwab": "면봉" |
| | | } |
| New file |
| | |
| | | { |
| | | "page.title": "上海市垃圾分类查询", |
| | | "header.title": "上海市日常生活垃圾怎么分?", |
| | | "btn.home": "首页", |
| | | "btn.query": "查询", |
| | | "btn.voice": "长按语音", |
| | | "btn.standard": "投放标准", |
| | | "btn.home.short": "首页", |
| | | "search.placeholder": "输入垃圾名称", |
| | | "search.notFoundHint": "我找不到你想要的,看看下面这些可以吗?", |
| | | "search.referenceHint": "请参考以下分类信息。", |
| | | "search.noResults": "未找到相关垃圾,请尝试其他关键词。", |
| | | "lang.zh": "中文", |
| | | "lang.en": "English", |
| | | "lang.ko": "한국어", |
| | | "footer.copyright": "上海京申 Copyright © 2026", |
| | | "welcome.title": "温馨提示", |
| | | "welcome.p1": "1、请输入垃圾正常的中文名称(包含材质),如玻璃瓶,一次性塑料杯、陶瓷碗等。", |
| | | "welcome.p2": "2、生活垃圾分类的具体分类标准:是根据经济社会发展水平、生活垃圾特性和处理利用方法予以细化调整的。", |
| | | "welcome.p3": "3、本查询系统仅供参考,具体分类要求以属地专业管理部门为准。", |
| | | "welcome.confirm": "知道了", |
| | | "disposal.suggestLabel": "建议投放至:", |
| | | "disposal.tipsTitle": "小科普", |
| | | "cat.recyclable": "可回收物", |
| | | "cat.recyclable.desc": "是指废纸张、废塑料、废玻璃制品、废金属、废织物等适宜回收、可循环利用的生活废弃物。", |
| | | "cat.recyclable.standard": "1. 轻投轻放\n2. 清洁干燥,避免污染。\n3. 废纸类尽量平整,保持干燥。\n4. 塑料类应去除残留物,洗净晾干。\n5. 立体包装物请清空内容物,清洁后压扁投放 \n6. 有尖锐边角的,应包裹后投放。\n7. 金属类应去除残留物,压扁后投放。\n8. 织物类应洗净晾干,折叠整齐。", |
| | | "cat.hazardous": "有害垃圾", |
| | | "cat.hazardous.desc": "对人体健康或自然环境造成直接或潜在危害的生活废弃物。主要包括:废电池、废灯管、废药品、废油漆及其容器等。", |
| | | "cat.hazardous.standard": "1. 有害垃圾应轻放,易破损的应包裹后投放\n2. 废电池应保持完整,不要拆解\n3. 废灯管应防止破碎,用纸张包裹后投放\n4. 废药品应连同包装一起投放\n5. 废油漆桶应密封后投放\n6. 投放时应注意安全,避免泄漏\n7. 如易挥发,请密封后投放", |
| | | "cat.wet": "湿垃圾", |
| | | "cat.wet.desc": "即易腐垃圾、易腐的生活物质和生活废弃物。主要包括:食材废料、剩菜剩饭、过期食品、瓜皮果核、花卉绿植、中药药渣等。", |
| | | "cat.wet.standard": "1. 湿垃圾应沥干水分后投放\n2. 纯流质的食物垃圾,如牛奶等,应直接倒入下水口\n3. 有包装物的湿垃圾应将包装物去除后分类投放\n4. 大骨头、贝壳类应作为干垃圾投放\n5. 餐厨垃圾应去除杂物后投放", |
| | | "cat.dry": "干垃圾", |
| | | "cat.dry.desc": "除可回收物、有害垃圾、湿垃圾以外的其他生活废弃物。", |
| | | "cat.dry.standard": "1. 尽量沥干水分后投放\n2. 难以辨识类别的生活垃圾应投入干垃圾容器\n3. 体积较大的垃圾应适当分解后投放\n4. 一次性餐具、纸巾等应作为干垃圾投放\n5. 烟蒂应完全熄灭后投放", |
| | | "disposal.suggest.recyclable": "可回收物", |
| | | "disposal.line1.recyclable": "请保持清洁干燥,避免污染。", |
| | | "disposal.line2.recyclable": "投放前请去除残留物,压扁减容。", |
| | | "disposal.tip1.recyclable": "可回收物经回收处理后,可重新制成新的产品,节约资源。", |
| | | "disposal.tip2.recyclable": "1个塑料瓶回收后可节省足够点亮60瓦灯泡3小时的电能。", |
| | | "disposal.tip3.recyclable": "回收1吨废纸可节省17棵树。", |
| | | "disposal.tip4.recyclable": "垃圾分类从点滴做起,让资源循环利用。", |
| | | "disposal.suggest.hazardous": "有害垃圾", |
| | | "disposal.line1.hazardous": "请轻放,易破损的应包裹后投放。", |
| | | "disposal.line2.hazardous": "废电池、废灯管等应保持完整,不要拆解。", |
| | | "disposal.tip1.hazardous": "有害垃圾含有对人体健康或环境有害的物质,需特殊处理。", |
| | | "disposal.tip2.hazardous": "1节废电池随意丢弃,可能污染1平方米土地50年。", |
| | | "disposal.tip3.hazardous": "废荧光灯管含有汞,破碎后会污染空气和土壤。", |
| | | "disposal.tip4.hazardous": "正确投放有害垃圾,保护我们的健康与环境。", |
| | | "disposal.suggest.wet": "湿垃圾", |
| | | "disposal.line1.wet": "请沥干水分后投放,纯流质应倒入下水口。", |
| | | "disposal.line2.wet": "有包装物的湿垃圾应去除包装后分类投放。", |
| | | "disposal.tip1.wet": "湿垃圾经生化处理后可转化为有机肥料。", |
| | | "disposal.tip2.wet": "上海每天产生的湿垃圾约1万吨,正确分类意义重大。", |
| | | "disposal.tip3.wet": "湿垃圾投放前应尽量沥干,减少渗滤液产生。", |
| | | "disposal.tip4.wet": "剩菜剩饭变废为宝,助力资源循环利用。", |
| | | "disposal.suggest.dry": "干垃圾", |
| | | "disposal.line1.dry": "请尽量沥干水分后投放。", |
| | | "disposal.line2.dry": "难以辨识类别的生活垃圾应投入干垃圾。", |
| | | "disposal.tip1.dry": "干垃圾主要通过焚烧或填埋方式处理。", |
| | | "disposal.tip2.dry": "减少干垃圾产生,从源头做好垃圾分类。", |
| | | "disposal.tip3.dry": "纸巾、烟蒂、一次性餐具等都属于干垃圾。", |
| | | "disposal.tip4.dry": "垃圾分类,让城市更美丽。", |
| | | "lang.ja": "日本語", |
| | | "item.milkBox": "牛奶盒", |
| | | "item.plastic": "塑料", |
| | | "item.glassBottle": "玻璃瓶", |
| | | "item.glass": "玻璃", |
| | | "item.paper": "纸", |
| | | "item.clothes": "衣服", |
| | | "item.brokenGlass": "碎玻璃", |
| | | "item.can": "易拉罐", |
| | | "item.plasticBox": "塑料盒", |
| | | "item.foamBoard": "泡沫板", |
| | | "item.powerBank": "充电宝", |
| | | "item.shoes": "鞋子", |
| | | "item.paperBox": "纸盒", |
| | | "item.foamBox": "泡沫箱", |
| | | "item.glassCup": "玻璃杯", |
| | | "item.newspaper": "报纸", |
| | | "item.plasticCup": "塑料杯", |
| | | "item.wire": "电线", |
| | | "item.dataCable": "数据线", |
| | | "item.waterBottle": "矿泉水瓶", |
| | | "item.pillow": "枕头", |
| | | "item.blade": "刀片", |
| | | "item.screw": "螺丝", |
| | | "item.foamPlastic": "泡沫塑料", |
| | | "item.yogurtTetraPak": "酸奶利乐包装盒", |
| | | "item.paperBag": "纸袋", |
| | | "item.cosmeticPlasticBottle": "化妆品塑料空瓶", |
| | | "item.leatherShoes": "皮鞋", |
| | | "item.cosmeticGlassBottle": "化妆品玻璃空瓶", |
| | | "item.wineBottle": "酒瓶", |
| | | "item.chargingCable": "充电线", |
| | | "item.flyer": "广告单", |
| | | "item.wastePlastic": "废塑料", |
| | | "item.cigaretteBox": "烟盒", |
| | | "item.charger": "充电器", |
| | | "item.book": "书本", |
| | | "item.beerBottle": "啤酒瓶", |
| | | "item.cardboardBox": "纸板箱", |
| | | "item.woodChopsticks": "木筷子", |
| | | "item.plushToy": "毛绒玩具", |
| | | "item.bedSheet": "被单", |
| | | "item.scissors": "剪刀", |
| | | "item.drinkPlasticBottle": "饮料塑料瓶", |
| | | "item.fabric": "布", |
| | | "item.dehumidifierBox": "除湿盒", |
| | | "item.magnet": "吸铁石", |
| | | "item.plasticWrap": "塑料包装纸", |
| | | "item.quilt": "被子", |
| | | "item.tetraPak": "利乐包装", |
| | | "item.basketball": "篮球", |
| | | "item.aluminumFoil": "铝箔", |
| | | "item.socket": "插座", |
| | | "item.iron": "铁", |
| | | "item.key": "钥匙", |
| | | "item.printingPaper": "打印纸", |
| | | "item.metal": "金属", |
| | | "item.whitePaper": "白纸", |
| | | "item.packagingBox": "包装纸盒", |
| | | "item.plasticLid": "塑料盖", |
| | | "item.envelope": "信封", |
| | | "item.medicinePackaging": "药品包装", |
| | | "item.medicineBottle": "药瓶", |
| | | "item.lightBulb": "灯泡", |
| | | "item.paintBucket": "油漆桶", |
| | | "item.medicine": "药品", |
| | | "item.expiredMedicine": "过期药", |
| | | "item.rechargeableBattery": "充电电池", |
| | | "item.nailPolish": "指甲油", |
| | | "item.storageBattery": "蓄电池", |
| | | "item.emptyMedicineBottle": "空药瓶", |
| | | "item.hazardousWaste": "有害垃圾", |
| | | "item.expiredMedicine2": "过期药品", |
| | | "item.wasteMedicine": "废药品", |
| | | "item.lightTube": "灯管", |
| | | "item.fluorescentTube": "荧光灯管", |
| | | "item.niCdBattery": "镍镉电池", |
| | | "item.photo": "照片", |
| | | "item.fluorescentLamp": "荧光灯", |
| | | "item.hairDyeShell": "染发剂壳", |
| | | "item.eyeDrops": "眼药水", |
| | | "item.energySavingLamp": "节能灯", |
| | | "item.insecticide": "杀虫剂", |
| | | "item.medicineTablet": "药片", |
| | | "item.medicineTabletBox": "药片盒", |
| | | "item.oralLiquidBottle": "口服液药瓶", |
| | | "item.wasteMedicineBottle": "废药瓶", |
| | | "item.paint": "油漆", |
| | | "item.buttonBattery": "纽扣电池", |
| | | "item.contraceptive": "避孕药", |
| | | "item.eyeDropsBottle": "眼药水瓶", |
| | | "item.film": "胶片", |
| | | "item.capsule": "胶囊", |
| | | "item.mercuryThermometer": "水银温度计", |
| | | "item.ratPoison": "老鼠药", |
| | | "item.capsuleBlister": "胶囊药片底板", |
| | | "item.hairDyeCan": "染发剂罐", |
| | | "item.energySavingBulb": "节能灯泡", |
| | | "item.allExpiredMedicine": "各类过期药品", |
| | | "item.incandescentBulb": "白炽灯泡", |
| | | "item.phoneBattery": "手机电池", |
| | | "item.disinfectantBottle": "消毒液瓶", |
| | | "item.expiredTablets": "过期药片", |
| | | "item.coldMedicine": "感冒药", |
| | | "item.disinfectant84Bottle": "84消毒液空瓶", |
| | | "item.nailPolishBottle": "指甲油瓶", |
| | | "item.sprayCan": "杀毒喷雾罐", |
| | | "item.photoNegative": "相片底片", |
| | | "item.chinesePatentMedicine": "中成药", |
| | | "item.filmRoll": "胶卷", |
| | | "item.medicineShell": "药品壳子", |
| | | "item.mercury": "水银", |
| | | "item.photo2": "相片", |
| | | "item.wastePaintBucket": "废油漆桶", |
| | | "item.expiredDrug": "过期药物", |
| | | "item.medicineBlister": "药品铝塑板", |
| | | "item.cockroachMedicine": "蟑螂药", |
| | | "item.cockroachBall": "蟑螂丸", |
| | | "item.capsuleTablet": "胶囊药片", |
| | | "item.disinfectantTablet": "消毒药片", |
| | | "item.energySavingTube": "节能灯管", |
| | | "item.melonSeedShell": "瓜子壳", |
| | | "item.eggShell": "鸡蛋壳", |
| | | "item.cornCob": "玉米棒", |
| | | "item.eggshell": "蛋壳", |
| | | "item.corn": "玉米", |
| | | "item.walnut": "核桃", |
| | | "item.peanutShell": "花生壳", |
| | | "item.tea": "茶叶", |
| | | "item.lobsterShell": "龙虾壳", |
| | | "item.crayfish": "小龙虾", |
| | | "item.crabShell": "蟹壳", |
| | | "item.chickenBone": "鸡骨头", |
| | | "item.melonSeed": "瓜子", |
| | | "item.crabShell2": "螃蟹壳", |
| | | "item.cookedCornCob": "熟玉米棒", |
| | | "item.pistachioShell": "开心果壳", |
| | | "item.crayfishShell": "小龙虾壳", |
| | | "item.edamameShell": "毛豆壳", |
| | | "item.shrimpShell": "霞壳", |
| | | "item.bananaPeel": "香蕉皮", |
| | | "item.watermelonRind": "西瓜皮", |
| | | "item.chestnutShell": "栗子壳", |
| | | "item.fishBone": "鱼骨头", |
| | | "item.lobster": "龙虾", |
| | | "item.cornCore": "玉米芯", |
| | | "item.melonSeedPiece": "瓜子片", |
| | | "item.flower": "花", |
| | | "item.coffeeGrounds": "咖啡渣", |
| | | "item.porkRibs": "排骨", |
| | | "item.zongzi": "粽子", |
| | | "item.herbalDregs": "中药渣", |
| | | "item.egg": "鸡蛋", |
| | | "item.crab": "螃蟹", |
| | | "item.lycheeShell": "荔枝壳", |
| | | "item.peach": "桃子", |
| | | "item.plumPit": "话梅核", |
| | | "item.jujubePit": "枣核", |
| | | "item.chickenBone2": "鸡骨", |
| | | "item.expiredFood": "过期食品", |
| | | "item.fishBone2": "鱼骨", |
| | | "item.apple": "苹果", |
| | | "item.lycheePit": "荔枝核", |
| | | "item.bayberry": "杨梅", |
| | | "item.watermelonSeed": "西瓜籽", |
| | | "item.chestnutShell2": "板栗壳", |
| | | "item.cockroach2": "蟑螂", |
| | | "item.fruitPeel": "果皮", |
| | | "item.mangoPit": "芒果核", |
| | | "item.peanut": "花生", |
| | | "item.driedPeanutShell": "干花生壳", |
| | | "item.biscuit": "饼干", |
| | | "item.watermelon": "西瓜", |
| | | "item.freshFlower": "鲜花", |
| | | "item.redJujubePit": "红枣核", |
| | | "item.lusuji": "芦稷", |
| | | "item.appleCore": "苹果核", |
| | | "item.waterBambooPeel": "茭白皮", |
| | | "item.bread": "面包", |
| | | "item.banana": "香蕉", |
| | | "item.teaResidue": "茶叶渣", |
| | | "item.plasticBag": "塑料袋", |
| | | "item.zongziLeaf": "粽叶", |
| | | "item.walnutShell": "核桃壳", |
| | | "item.hair": "头发", |
| | | "item.shell": "贝壳", |
| | | "item.sanitaryPad": "卫生巾", |
| | | "item.condom": "避孕套", |
| | | "item.chewingGum": "口香糖", |
| | | "item.lighter": "打火机", |
| | | "item.coconutShell": "椰子壳", |
| | | "item.catLitter": "猫砂", |
| | | "item.faceMask": "面膜", |
| | | "item.tissue": "餐巾纸", |
| | | "item.bigBone": "大骨头", |
| | | "item.milkTeaCup": "奶茶杯", |
| | | "item.paperTowel": "纸巾", |
| | | "item.clamShell": "蛤蜊壳", |
| | | "item.zongziLeaf2": "粽子叶", |
| | | "item.cornHusk": "玉米皮", |
| | | "item.straw": "吸管", |
| | | "item.teaBag": "茶包", |
| | | "item.sugarcanePeel": "甘蔗皮", |
| | | "item.desiccant": "干燥剂", |
| | | "item.disposableChopsticks": "一次性筷子", |
| | | "item.cornShell": "玉米壳", |
| | | "item.cigarette": "烟蒂", |
| | | "item.wetWipe": "湿纸巾", |
| | | "item.durianShell": "榴莲壳", |
| | | "item.toiletPaper": "卫生纸", |
| | | "item.bigWalnutShell": "大核桃壳", |
| | | "item.nail": "指甲", |
| | | "item.packagingBag": "包装袋", |
| | | "item.lipstick": "口红", |
| | | "item.disposableCup": "一次性杯子", |
| | | "item.snailShell": "螺蛳壳", |
| | | "item.toothbrush": "牙刷", |
| | | "item.takeoutBox": "外卖餐盒", |
| | | "item.durian": "榴莲", |
| | | "item.diaper": "尿不湿", |
| | | "item.trashBag": "垃圾袋", |
| | | "item.toothpasteTube": "牙膏皮", |
| | | "item.icePack": "冰袋", |
| | | "item.sock": "袜子", |
| | | "item.pen": "笔", |
| | | "item.diaper2": "纸尿裤", |
| | | "item.durianPit": "榴莲核", |
| | | "item.disposableLunchBox": "一次性餐盒", |
| | | "item.teaBag2": "茶叶包", |
| | | "item.mask": "口罩", |
| | | "item.underwear": "内裤", |
| | | "item.towel": "毛巾", |
| | | "item.diaper3": "尿布", |
| | | "item.ceramicBowl": "陶瓷碗", |
| | | "item.penRefill": "笔芯", |
| | | "item.dirtyPlasticBag": "肮脏塑料袋", |
| | | "item.paperClip": "回形针", |
| | | "item.toothpick": "牙签", |
| | | "item.foodPackagingBag": "食品包装袋", |
| | | "item.watercolorPen": "水彩笔", |
| | | "item.cottonSwab": "棉签" |
| | | } |
| New file |
| | |
| | | [ |
| | | { |
| | | "id": "milk-box", |
| | | "nameKey": "item.milkBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "plastic", |
| | | "nameKey": "item.plastic", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "glass-bottle", |
| | | "nameKey": "item.glassBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "glass", |
| | | "nameKey": "item.glass", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "paper", |
| | | "nameKey": "item.paper", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "clothes", |
| | | "nameKey": "item.clothes", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "broken-glass", |
| | | "nameKey": "item.brokenGlass", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "can", |
| | | "nameKey": "item.can", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "plastic-box", |
| | | "nameKey": "item.plasticBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "foam-board", |
| | | "nameKey": "item.foamBoard", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "power-bank", |
| | | "nameKey": "item.powerBank", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "shoes", |
| | | "nameKey": "item.shoes", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "paper-box", |
| | | "nameKey": "item.paperBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "foam-box", |
| | | "nameKey": "item.foamBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "glass-cup", |
| | | "nameKey": "item.glassCup", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "newspaper", |
| | | "nameKey": "item.newspaper", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "plastic-cup", |
| | | "nameKey": "item.plasticCup", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "wire", |
| | | "nameKey": "item.wire", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "data-cable", |
| | | "nameKey": "item.dataCable", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "water-bottle", |
| | | "nameKey": "item.waterBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "pillow", |
| | | "nameKey": "item.pillow", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "blade", |
| | | "nameKey": "item.blade", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "screw", |
| | | "nameKey": "item.screw", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "foam-plastic", |
| | | "nameKey": "item.foamPlastic", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "yogurt-tetra-pak", |
| | | "nameKey": "item.yogurtTetraPak", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "paper-bag", |
| | | "nameKey": "item.paperBag", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "cosmetic-plastic-bottle", |
| | | "nameKey": "item.cosmeticPlasticBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "leather-shoes", |
| | | "nameKey": "item.leatherShoes", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "cosmetic-glass-bottle", |
| | | "nameKey": "item.cosmeticGlassBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "wine-bottle", |
| | | "nameKey": "item.wineBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "charging-cable", |
| | | "nameKey": "item.chargingCable", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "flyer", |
| | | "nameKey": "item.flyer", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "waste-plastic", |
| | | "nameKey": "item.wastePlastic", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "cigarette-box", |
| | | "nameKey": "item.cigaretteBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "charger", |
| | | "nameKey": "item.charger", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "book", |
| | | "nameKey": "item.book", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "beer-bottle", |
| | | "nameKey": "item.beerBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "cardboard-box", |
| | | "nameKey": "item.cardboardBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "wood-chopsticks", |
| | | "nameKey": "item.woodChopsticks", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "plush-toy", |
| | | "nameKey": "item.plushToy", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "bed-sheet", |
| | | "nameKey": "item.bedSheet", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "scissors", |
| | | "nameKey": "item.scissors", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "drink-plastic-bottle", |
| | | "nameKey": "item.drinkPlasticBottle", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "fabric", |
| | | "nameKey": "item.fabric", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "dehumidifier-box", |
| | | "nameKey": "item.dehumidifierBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "magnet", |
| | | "nameKey": "item.magnet", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "plastic-wrap", |
| | | "nameKey": "item.plasticWrap", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "quilt", |
| | | "nameKey": "item.quilt", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "tetra-pak", |
| | | "nameKey": "item.tetraPak", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "basketball", |
| | | "nameKey": "item.basketball", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "aluminum-foil", |
| | | "nameKey": "item.aluminumFoil", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "socket", |
| | | "nameKey": "item.socket", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "iron", |
| | | "nameKey": "item.iron", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "key", |
| | | "nameKey": "item.key", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "printing-paper", |
| | | "nameKey": "item.printingPaper", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "metal", |
| | | "nameKey": "item.metal", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "white-paper", |
| | | "nameKey": "item.whitePaper", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "packaging-box", |
| | | "nameKey": "item.packagingBox", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "plastic-lid", |
| | | "nameKey": "item.plasticLid", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "envelope", |
| | | "nameKey": "item.envelope", |
| | | "categoryId": "recyclable" |
| | | }, |
| | | { |
| | | "id": "medicine-packaging", |
| | | "nameKey": "item.medicinePackaging", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "medicine-bottle", |
| | | "nameKey": "item.medicineBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "light-bulb", |
| | | "nameKey": "item.lightBulb", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "paint-bucket", |
| | | "nameKey": "item.paintBucket", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "medicine", |
| | | "nameKey": "item.medicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "expired-medicine", |
| | | "nameKey": "item.expiredMedicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "rechargeable-battery", |
| | | "nameKey": "item.rechargeableBattery", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "nail-polish", |
| | | "nameKey": "item.nailPolish", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "storage-battery", |
| | | "nameKey": "item.storageBattery", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "empty-medicine-bottle", |
| | | "nameKey": "item.emptyMedicineBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "hazardous-waste", |
| | | "nameKey": "item.hazardousWaste", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "expired-medicine2", |
| | | "nameKey": "item.expiredMedicine2", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "waste-medicine", |
| | | "nameKey": "item.wasteMedicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "light-tube", |
| | | "nameKey": "item.lightTube", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "fluorescent-tube", |
| | | "nameKey": "item.fluorescentTube", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "ni-cd-battery", |
| | | "nameKey": "item.niCdBattery", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "photo", |
| | | "nameKey": "item.photo", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "fluorescent-lamp", |
| | | "nameKey": "item.fluorescentLamp", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "hair-dye-shell", |
| | | "nameKey": "item.hairDyeShell", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "eye-drops", |
| | | "nameKey": "item.eyeDrops", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "energy-saving-lamp", |
| | | "nameKey": "item.energySavingLamp", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "insecticide", |
| | | "nameKey": "item.insecticide", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "medicine-tablet", |
| | | "nameKey": "item.medicineTablet", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "medicine-tablet-box", |
| | | "nameKey": "item.medicineTabletBox", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "oral-liquid-bottle", |
| | | "nameKey": "item.oralLiquidBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "waste-medicine-bottle", |
| | | "nameKey": "item.wasteMedicineBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "paint", |
| | | "nameKey": "item.paint", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "button-battery", |
| | | "nameKey": "item.buttonBattery", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "contraceptive", |
| | | "nameKey": "item.contraceptive", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "eye-drops-bottle", |
| | | "nameKey": "item.eyeDropsBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "film", |
| | | "nameKey": "item.film", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "capsule", |
| | | "nameKey": "item.capsule", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "mercury-thermometer", |
| | | "nameKey": "item.mercuryThermometer", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "rat-poison", |
| | | "nameKey": "item.ratPoison", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "capsule-blister", |
| | | "nameKey": "item.capsuleBlister", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "hair-dye-can", |
| | | "nameKey": "item.hairDyeCan", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "energy-saving-bulb", |
| | | "nameKey": "item.energySavingBulb", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "all-expired-medicine", |
| | | "nameKey": "item.allExpiredMedicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "incandescent-bulb", |
| | | "nameKey": "item.incandescentBulb", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "phone-battery", |
| | | "nameKey": "item.phoneBattery", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "disinfectant-bottle", |
| | | "nameKey": "item.disinfectantBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "expired-tablets", |
| | | "nameKey": "item.expiredTablets", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "cold-medicine", |
| | | "nameKey": "item.coldMedicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "disinfectant84-bottle", |
| | | "nameKey": "item.disinfectant84Bottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "nail-polish-bottle", |
| | | "nameKey": "item.nailPolishBottle", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "spray-can", |
| | | "nameKey": "item.sprayCan", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "photo-negative", |
| | | "nameKey": "item.photoNegative", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "chinese-patent-medicine", |
| | | "nameKey": "item.chinesePatentMedicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "film-roll", |
| | | "nameKey": "item.filmRoll", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "medicine-shell", |
| | | "nameKey": "item.medicineShell", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "mercury", |
| | | "nameKey": "item.mercury", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "photo2", |
| | | "nameKey": "item.photo2", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "waste-paint-bucket", |
| | | "nameKey": "item.wastePaintBucket", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "expired-drug", |
| | | "nameKey": "item.expiredDrug", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "medicine-blister", |
| | | "nameKey": "item.medicineBlister", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "cockroach-medicine", |
| | | "nameKey": "item.cockroachMedicine", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "cockroach-ball", |
| | | "nameKey": "item.cockroachBall", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "capsule-tablet", |
| | | "nameKey": "item.capsuleTablet", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "disinfectant-tablet", |
| | | "nameKey": "item.disinfectantTablet", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "energy-saving-tube", |
| | | "nameKey": "item.energySavingTube", |
| | | "categoryId": "hazardous" |
| | | }, |
| | | { |
| | | "id": "melon-seed-shell", |
| | | "nameKey": "item.melonSeedShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "egg-shell", |
| | | "nameKey": "item.eggShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "corn-cob", |
| | | "nameKey": "item.cornCob", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "eggshell", |
| | | "nameKey": "item.eggshell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "corn", |
| | | "nameKey": "item.corn", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "walnut", |
| | | "nameKey": "item.walnut", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "peanut-shell", |
| | | "nameKey": "item.peanutShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "tea", |
| | | "nameKey": "item.tea", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "lobster-shell", |
| | | "nameKey": "item.lobsterShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "crayfish", |
| | | "nameKey": "item.crayfish", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "crab-shell", |
| | | "nameKey": "item.crabShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "chicken-bone", |
| | | "nameKey": "item.chickenBone", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "melon-seed", |
| | | "nameKey": "item.melonSeed", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "crab-shell2", |
| | | "nameKey": "item.crabShell2", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "cooked-corn-cob", |
| | | "nameKey": "item.cookedCornCob", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "pistachio-shell", |
| | | "nameKey": "item.pistachioShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "crayfish-shell", |
| | | "nameKey": "item.crayfishShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "edamame-shell", |
| | | "nameKey": "item.edamameShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "shrimp-shell", |
| | | "nameKey": "item.shrimpShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "banana-peel", |
| | | "nameKey": "item.bananaPeel", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "watermelon-rind", |
| | | "nameKey": "item.watermelonRind", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "chestnut-shell", |
| | | "nameKey": "item.chestnutShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "fish-bone", |
| | | "nameKey": "item.fishBone", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "lobster", |
| | | "nameKey": "item.lobster", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "corn-core", |
| | | "nameKey": "item.cornCore", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "melon-seed-piece", |
| | | "nameKey": "item.melonSeedPiece", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "flower", |
| | | "nameKey": "item.flower", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "coffee-grounds", |
| | | "nameKey": "item.coffeeGrounds", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "pork-ribs", |
| | | "nameKey": "item.porkRibs", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "zongzi", |
| | | "nameKey": "item.zongzi", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "herbal-dregs", |
| | | "nameKey": "item.herbalDregs", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "egg", |
| | | "nameKey": "item.egg", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "crab", |
| | | "nameKey": "item.crab", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "lychee-shell", |
| | | "nameKey": "item.lycheeShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "peach", |
| | | "nameKey": "item.peach", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "plum-pit", |
| | | "nameKey": "item.plumPit", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "jujube-pit", |
| | | "nameKey": "item.jujubePit", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "chicken-bone2", |
| | | "nameKey": "item.chickenBone2", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "expired-food", |
| | | "nameKey": "item.expiredFood", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "fish-bone2", |
| | | "nameKey": "item.fishBone2", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "apple", |
| | | "nameKey": "item.apple", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "lychee-pit", |
| | | "nameKey": "item.lycheePit", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "bayberry", |
| | | "nameKey": "item.bayberry", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "watermelon-seed", |
| | | "nameKey": "item.watermelonSeed", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "chestnut-shell2", |
| | | "nameKey": "item.chestnutShell2", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "cockroach2", |
| | | "nameKey": "item.cockroach2", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "fruit-peel", |
| | | "nameKey": "item.fruitPeel", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "mango-pit", |
| | | "nameKey": "item.mangoPit", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "peanut", |
| | | "nameKey": "item.peanut", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "dried-peanut-shell", |
| | | "nameKey": "item.driedPeanutShell", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "biscuit", |
| | | "nameKey": "item.biscuit", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "watermelon", |
| | | "nameKey": "item.watermelon", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "fresh-flower", |
| | | "nameKey": "item.freshFlower", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "red-jujube-pit", |
| | | "nameKey": "item.redJujubePit", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "lusuji", |
| | | "nameKey": "item.lusuji", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "apple-core", |
| | | "nameKey": "item.appleCore", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "water-bamboo-peel", |
| | | "nameKey": "item.waterBambooPeel", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "bread", |
| | | "nameKey": "item.bread", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "banana", |
| | | "nameKey": "item.banana", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "tea-residue", |
| | | "nameKey": "item.teaResidue", |
| | | "categoryId": "wet" |
| | | }, |
| | | { |
| | | "id": "plastic-bag", |
| | | "nameKey": "item.plasticBag", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "zongzi-leaf", |
| | | "nameKey": "item.zongziLeaf", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "walnut-shell", |
| | | "nameKey": "item.walnutShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "hair", |
| | | "nameKey": "item.hair", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "shell", |
| | | "nameKey": "item.shell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "sanitary-pad", |
| | | "nameKey": "item.sanitaryPad", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "condom", |
| | | "nameKey": "item.condom", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "chewing-gum", |
| | | "nameKey": "item.chewingGum", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "lighter", |
| | | "nameKey": "item.lighter", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "coconut-shell", |
| | | "nameKey": "item.coconutShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "cat-litter", |
| | | "nameKey": "item.catLitter", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "face-mask", |
| | | "nameKey": "item.faceMask", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "tissue", |
| | | "nameKey": "item.tissue", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "big-bone", |
| | | "nameKey": "item.bigBone", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "milk-tea-cup", |
| | | "nameKey": "item.milkTeaCup", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "paper-towel", |
| | | "nameKey": "item.paperTowel", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "clam-shell", |
| | | "nameKey": "item.clamShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "zongzi-leaf2", |
| | | "nameKey": "item.zongziLeaf2", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "corn-husk", |
| | | "nameKey": "item.cornHusk", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "straw", |
| | | "nameKey": "item.straw", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "tea-bag", |
| | | "nameKey": "item.teaBag", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "sugarcane-peel", |
| | | "nameKey": "item.sugarcanePeel", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "desiccant", |
| | | "nameKey": "item.desiccant", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "disposable-chopsticks", |
| | | "nameKey": "item.disposableChopsticks", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "corn-shell", |
| | | "nameKey": "item.cornShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "cigarette", |
| | | "nameKey": "item.cigarette", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "wet-wipe", |
| | | "nameKey": "item.wetWipe", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "durian-shell", |
| | | "nameKey": "item.durianShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "toilet-paper", |
| | | "nameKey": "item.toiletPaper", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "big-walnut-shell", |
| | | "nameKey": "item.bigWalnutShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "nail", |
| | | "nameKey": "item.nail", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "packaging-bag", |
| | | "nameKey": "item.packagingBag", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "lipstick", |
| | | "nameKey": "item.lipstick", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "disposable-cup", |
| | | "nameKey": "item.disposableCup", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "snail-shell", |
| | | "nameKey": "item.snailShell", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "toothbrush", |
| | | "nameKey": "item.toothbrush", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "takeout-box", |
| | | "nameKey": "item.takeoutBox", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "durian", |
| | | "nameKey": "item.durian", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "diaper", |
| | | "nameKey": "item.diaper", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "trash-bag", |
| | | "nameKey": "item.trashBag", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "toothpaste-tube", |
| | | "nameKey": "item.toothpasteTube", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "ice-pack", |
| | | "nameKey": "item.icePack", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "sock", |
| | | "nameKey": "item.sock", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "pen", |
| | | "nameKey": "item.pen", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "diaper2", |
| | | "nameKey": "item.diaper2", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "durian-pit", |
| | | "nameKey": "item.durianPit", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "disposable-lunch-box", |
| | | "nameKey": "item.disposableLunchBox", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "tea-bag2", |
| | | "nameKey": "item.teaBag2", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "mask", |
| | | "nameKey": "item.mask", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "underwear", |
| | | "nameKey": "item.underwear", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "towel", |
| | | "nameKey": "item.towel", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "diaper3", |
| | | "nameKey": "item.diaper3", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "ceramic-bowl", |
| | | "nameKey": "item.ceramicBowl", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "pen-refill", |
| | | "nameKey": "item.penRefill", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "dirty-plastic-bag", |
| | | "nameKey": "item.dirtyPlasticBag", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "paper-clip", |
| | | "nameKey": "item.paperClip", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "toothpick", |
| | | "nameKey": "item.toothpick", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "food-packaging-bag", |
| | | "nameKey": "item.foodPackagingBag", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "watercolor-pen", |
| | | "nameKey": "item.watercolorPen", |
| | | "categoryId": "dry" |
| | | }, |
| | | { |
| | | "id": "cotton-swab", |
| | | "nameKey": "item.cottonSwab", |
| | | "categoryId": "dry" |
| | | } |
| | | ] |
| New file |
| | |
| | | :root { |
| | | --color-recyclable: #104883; |
| | | --color-hazardous: #e53122; |
| | | --color-wet: #694539; |
| | | --color-dry: #312d2a; |
| | | --color-tab-inactive: #eceff3; |
| | | --color-tab-inactive-text: #9aa3b2; |
| | | --color-gray-bg: #f0f4f8; |
| | | --color-gray-text: #8a94a6; |
| | | --color-border: #e8ecf1; |
| | | --color-surface: #ffffff; |
| | | --color-body: #eef2f7; |
| | | --color-row-even: #ffffff; |
| | | --color-row-odd: #f5f8fb; |
| | | --radius-sm: 10px; |
| | | --radius-md: 14px; |
| | | --radius-lg: 18px; |
| | | --radius-xl: 22px; |
| | | --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.06); |
| | | --shadow-md: 0 4px 16px rgba(15, 23, 42, 0.08); |
| | | --shadow-lg: 0 12px 40px rgba(15, 23, 42, 0.14); |
| | | } |
| | | |
| | | *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } |
| | | |
| | | body { |
| | | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; |
| | | background: var(--color-body); |
| | | color: #2d3748; |
| | | line-height: 1.6; |
| | | -webkit-tap-highlight-color: transparent; |
| | | } |
| | | |
| | | /* Layout utilities */ |
| | | .flex { display: flex; } |
| | | .flex-col { flex-direction: column; } |
| | | .flex-1 { flex: 1; } |
| | | .items-center { align-items: center; } |
| | | .items-start { align-items: flex-start; } |
| | | .justify-center { justify-content: center; } |
| | | .justify-between { justify-content: space-between; } |
| | | .justify-end { justify-content: flex-end; } |
| | | .gap-1 { gap: 0.25rem; } |
| | | .gap-2 { gap: 0.5rem; } |
| | | .gap-3 { gap: 0.75rem; } |
| | | .w-full { width: 100%; } |
| | | .h-full { height: 100%; } |
| | | .min-h-screen { min-height: 100vh; } |
| | | .max-w-md { max-width: 28rem; } |
| | | .mx-auto { margin-left: auto; margin-right: auto; } |
| | | .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; } |
| | | .px-4 { padding-left: 1rem; padding-right: 1rem; } |
| | | .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } |
| | | .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; } |
| | | .py-4 { padding-top: 1rem; padding-bottom: 1rem; } |
| | | .text-center { text-align: center; } |
| | | .text-left { text-align: left; } |
| | | .text-right { text-align: right; } |
| | | .text-sm { font-size: 0.875rem; } |
| | | .text-base { font-size: 1rem; } |
| | | .text-lg { font-size: 1.125rem; } |
| | | .font-bold { font-weight: 700; } |
| | | .font-medium { font-weight: 500; } |
| | | .rounded-lg { border-radius: var(--radius-md); } |
| | | .shadow { box-shadow: var(--shadow-sm); } |
| | | .shadow-lg { box-shadow: var(--shadow-lg); } |
| | | .overflow-hidden { overflow: hidden; } |
| | | .overflow-y-auto { overflow-y: auto; } |
| | | .relative { position: relative; } |
| | | .fixed { position: fixed; } |
| | | .inset-0 { top: 0; right: 0; bottom: 0; left: 0; } |
| | | .z-50 { z-index: 50; } |
| | | .hidden { display: none !important; } |
| | | .shrink-0 { flex-shrink: 0; } |
| | | .cursor-pointer { cursor: pointer; } |
| | | .select-none { user-select: none; } |
| | | |
| | | /* Category colors */ |
| | | .text-recyclable { color: var(--color-recyclable); } |
| | | .text-hazardous { color: var(--color-hazardous); } |
| | | .text-wet { color: var(--color-wet); } |
| | | .text-dry { color: var(--color-dry); } |
| | | .text-gray { color: var(--color-gray-text); } |
| | | .bg-gray-light { background-color: var(--color-gray-bg); } |
| | | |
| | | /* App shell */ |
| | | .app-container { |
| | | max-width: 28rem; |
| | | margin: 0 auto; |
| | | min-height: 100vh; |
| | | display: flex; |
| | | flex-direction: column; |
| | | background: #eef2f7; |
| | | box-shadow: none; |
| | | } |
| | | |
| | | /* Header */ |
| | | .header { |
| | | padding: 1.125rem 1.25rem 1rem; |
| | | background: #eef2f7; |
| | | border-bottom: none; |
| | | box-shadow: 0 1px 0 rgba(15, 23, 42, 0.05); |
| | | } |
| | | .header-top { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: flex-end; |
| | | margin-bottom: 0.875rem; |
| | | position: relative; |
| | | } |
| | | .header-actions { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 0.625rem; |
| | | } |
| | | .logo-icon { |
| | | /*width: 2.75rem; */ |
| | | height: 2.75rem; |
| | | flex-shrink: 0; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 50%; |
| | | transform: translateY(-50%); |
| | | border-radius: var(--radius-sm); |
| | | box-shadow: var(--shadow-sm); |
| | | } |
| | | .title-text { |
| | | font-size: 1.2rem; |
| | | font-weight: 700; |
| | | line-height: 1.45; |
| | | color: #1a202c; |
| | | letter-spacing: -0.01em; |
| | | } |
| | | |
| | | /* Buttons */ |
| | | .btn { |
| | | border: none; |
| | | cursor: pointer; |
| | | font-size: 0.875rem; |
| | | border-radius: var(--radius-sm); |
| | | transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease; |
| | | font-family: inherit; |
| | | } |
| | | .btn:active { transform: scale(0.97); opacity: 0.9; } |
| | | .btn-header { |
| | | padding: 0.5rem 0.875rem; |
| | | background: var(--color-gray-bg); |
| | | color: #4a5568; |
| | | font-weight: 500; |
| | | box-shadow: var(--shadow-sm); |
| | | } |
| | | .btn-query { |
| | | padding: 0.75rem 1.125rem; |
| | | background: linear-gradient(135deg, #1e5088 0%, #104883 100%); |
| | | color: #fff; |
| | | font-weight: 600; |
| | | white-space: nowrap; |
| | | box-shadow: 0 3px 10px rgba(23, 59, 107, 0.28); |
| | | border-radius: var(--radius-sm); |
| | | } |
| | | .btn-voice { |
| | | padding: 0.75rem 0.875rem; |
| | | background: var(--color-gray-bg); |
| | | color: #4a5568; |
| | | font-size: 0.75rem; |
| | | white-space: nowrap; |
| | | min-width: 4.75rem; |
| | | font-weight: 500; |
| | | box-shadow: var(--shadow-sm); |
| | | border-radius: var(--radius-sm); |
| | | } |
| | | .btn-voice.recording { |
| | | background: linear-gradient(135deg, #ff6b6b 0%, #ee4444 100%); |
| | | color: #fff; |
| | | animation: pulse 1.2s ease-in-out infinite; |
| | | box-shadow: 0 3px 12px rgba(238, 68, 68, 0.35); |
| | | } |
| | | .btn-standard { |
| | | padding: 0.375rem 0.875rem; |
| | | background: rgba(255, 255, 255, 0.92); |
| | | color: #2d3748; |
| | | font-size: 0.75rem; |
| | | font-weight: 600; |
| | | border-radius: 9999px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); |
| | | backdrop-filter: blur(4px); |
| | | } |
| | | .btn-confirm { |
| | | width: 100%; |
| | | padding: 1rem 1.25rem; |
| | | background: linear-gradient(135deg, #1e5088 0%, #104883 100%); |
| | | color: #fff; |
| | | font-size: 1.0625rem; |
| | | font-weight: 600; |
| | | border-radius: var(--radius-md); |
| | | margin-top: 1.75rem; |
| | | box-shadow: 0 4px 14px rgba(23, 59, 107, 0.3); |
| | | letter-spacing: 0.02em; |
| | | } |
| | | .btn-close { |
| | | background: var(--color-gray-bg); |
| | | border: none; |
| | | font-size: 1.25rem; |
| | | color: #718096; |
| | | cursor: pointer; |
| | | line-height: 1; |
| | | width: 2rem; |
| | | height: 2rem; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | transition: background 0.15s ease; |
| | | } |
| | | .btn-close:hover { background: #e2e8f0; } |
| | | .btn-close-transparent { |
| | | background: transparent; |
| | | border: none; |
| | | font-size: 1.75rem; |
| | | color: rgba(0, 0, 0, 0.22); |
| | | cursor: pointer; |
| | | line-height: 1; |
| | | padding: 0.625rem; |
| | | margin-top: 0.75rem; |
| | | border-radius: 50%; |
| | | transition: color 0.15s ease, background 0.15s ease; |
| | | } |
| | | .btn-close-transparent:hover { |
| | | color: rgba(0, 0, 0, 0.45); |
| | | background: var(--color-gray-bg); |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0%, 100% { opacity: 1; transform: scale(1); } |
| | | 50% { opacity: 0.85; transform: scale(0.98); } |
| | | } |
| | | |
| | | /* Search row */ |
| | | .search-row { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 0.625rem; |
| | | padding: 0.875rem 1.25rem 1rem; |
| | | background: #eef2f7; |
| | | } |
| | | .search-input { |
| | | flex: 1; |
| | | padding: 0.8125rem 1rem; |
| | | border: 1.5px solid var(--color-border); |
| | | border-radius: var(--radius-sm); |
| | | font-size: 1rem; |
| | | outline: none; |
| | | background: var(--color-gray-bg); |
| | | color: #2d3748; |
| | | transition: border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; |
| | | } |
| | | .search-input:focus { |
| | | border-color: var(--color-recyclable); |
| | | background: #fff; |
| | | box-shadow: 0 0 0 3px rgba(23, 59, 107, 0.12); |
| | | } |
| | | .search-input::placeholder { |
| | | color: #a0aec0; |
| | | } |
| | | |
| | | /* Language dropdown */ |
| | | .lang-dropdown { position: relative; } |
| | | .lang-menu { |
| | | position: absolute; |
| | | top: calc(100% + 6px); |
| | | right: 0; |
| | | background: #fff; |
| | | border: 1px solid var(--color-border); |
| | | border-radius: var(--radius-sm); |
| | | box-shadow: var(--shadow-lg); |
| | | min-width: 7rem; |
| | | z-index: 60; |
| | | overflow: hidden; |
| | | padding: 0.375rem; |
| | | } |
| | | .lang-menu-item { |
| | | padding: 0.625rem 0.875rem; |
| | | cursor: pointer; |
| | | font-size: 0.875rem; |
| | | border-radius: 8px; |
| | | color: #4a5568; |
| | | transition: background 0.15s ease; |
| | | } |
| | | .lang-menu-item:hover, |
| | | .lang-menu-item.active { |
| | | background: var(--color-gray-bg); |
| | | color: #1a202c; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* Browse section */ |
| | | .browse-section { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | padding: 0 1rem 1rem; |
| | | gap: 0; |
| | | } |
| | | |
| | | /* Tabs */ |
| | | .tabs-wrap { |
| | | border-radius: var(--radius-md); |
| | | overflow: hidden; |
| | | box-shadow: var(--shadow-sm); |
| | | } |
| | | .tabs { |
| | | display: flex; |
| | | gap: 0; |
| | | background: var(--color-tab-inactive); |
| | | padding: 0; |
| | | } |
| | | .tab { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: stretch; |
| | | padding: 0; |
| | | cursor: pointer; |
| | | transition: background-color 0.2s ease; |
| | | border-radius: 0; |
| | | border-bottom: none; |
| | | background: var(--color-tab-inactive); |
| | | overflow: hidden; |
| | | min-width: 0; |
| | | } |
| | | .tab-color-bar { |
| | | display: block; |
| | | width: 100%; |
| | | height: 4px; |
| | | flex-shrink: 0; |
| | | } |
| | | .tab.active { |
| | | position: relative; |
| | | z-index: 1; |
| | | margin-bottom: -1px; |
| | | } |
| | | .tab-icon { |
| | | display: block; |
| | | width: 100%; |
| | | max-width: 210px; |
| | | height: auto; |
| | | aspect-ratio: 1 / 1; |
| | | margin: 0 auto; |
| | | object-fit: contain; |
| | | object-position: center; |
| | | } |
| | | .tab.active .tab-icon { |
| | | filter: none; |
| | | } |
| | | |
| | | /* Tab detail */ |
| | | .tab-detail { |
| | | padding: 1rem 1.125rem 1.125rem; |
| | | color: #fff; |
| | | display: flex; |
| | | flex-direction: column; |
| | | min-height: 4.5rem; |
| | | border-radius: 0; |
| | | box-shadow: none; |
| | | margin-top: -1px; |
| | | } |
| | | .tab-desc { |
| | | font-size: 0.875rem; |
| | | line-height: 1.65; |
| | | opacity: 0.95; |
| | | } |
| | | .tab-standard-wrap { |
| | | align-self: flex-end; |
| | | margin-top: calc(1 * 1.65em); |
| | | } |
| | | |
| | | /* Search result hints */ |
| | | .search-hints { |
| | | padding: 1rem 1.25rem; |
| | | background: var(--color-gray-bg); |
| | | border-radius: var(--radius-md); |
| | | margin: 0 1rem 0.75rem; |
| | | } |
| | | .search-hint-main { |
| | | font-size: 0.9375rem; |
| | | font-weight: 600; |
| | | margin-bottom: 0.375rem; |
| | | color: #2d3748; |
| | | line-height: 1.5; |
| | | } |
| | | .search-hint-sub { |
| | | font-size: 0.8125rem; |
| | | color: var(--color-gray-text); |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | /* Item list */ |
| | | .item-list { |
| | | flex: 1; |
| | | overflow-y: auto; |
| | | -webkit-overflow-scrolling: touch; |
| | | } |
| | | .item-list-browse { |
| | | margin-top: 0.875rem; |
| | | border-radius: var(--radius-md); |
| | | overflow: hidden; |
| | | border: 1px solid var(--color-border); |
| | | box-shadow: var(--shadow-sm); |
| | | } |
| | | .item-list-search-wrap { |
| | | margin: 0 1rem 1rem; |
| | | border-radius: var(--radius-md); |
| | | overflow: hidden; |
| | | border: 1px solid var(--color-border); |
| | | box-shadow: var(--shadow-sm); |
| | | } |
| | | .list-item { |
| | | padding: 1rem 1.125rem; |
| | | text-align: center; |
| | | cursor: pointer; |
| | | font-size: 1rem; |
| | | color: #2d3748; |
| | | transition: background 0.15s ease; |
| | | letter-spacing: 0.01em; |
| | | } |
| | | .list-item-even { |
| | | background: var(--color-row-even); |
| | | } |
| | | .list-item-odd { |
| | | background: var(--color-row-odd); |
| | | } |
| | | .list-item:active { |
| | | background: #e8f0fe !important; |
| | | } |
| | | .list-item-search { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | text-align: left; |
| | | padding: 1rem 1.25rem; |
| | | } |
| | | .list-item-search .item-name { |
| | | flex: 1; |
| | | font-weight: 500; |
| | | } |
| | | .list-item-search .item-category { |
| | | font-size: 0.875rem; |
| | | font-weight: 600; |
| | | flex-shrink: 0; |
| | | margin-left: 0.75rem; |
| | | } |
| | | |
| | | /* Modals */ |
| | | .modal-overlay { |
| | | position: fixed; |
| | | inset: 0; |
| | | background: rgba(15, 23, 42, 0.45); |
| | | backdrop-filter: blur(4px); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | z-index: 50; |
| | | padding: 1.25rem; |
| | | animation: fadeIn 0.2s ease; |
| | | } |
| | | .modal-card { |
| | | background: #fff; |
| | | border-radius: var(--radius-xl); |
| | | padding: 1.75rem 1.625rem; |
| | | width: 100%; |
| | | max-width: 22rem; |
| | | max-height: 85vh; |
| | | overflow-y: auto; |
| | | position: relative; |
| | | box-shadow: var(--shadow-lg); |
| | | animation: slideUp 0.25s ease; |
| | | } |
| | | .modal-card-wide { |
| | | max-width: 24rem; |
| | | } |
| | | .modal-card-item { |
| | | color: #fff; |
| | | } |
| | | .modal-card-item .modal-title { |
| | | color: #fff; |
| | | } |
| | | .modal-card-item .modal-line { |
| | | color: #fff; |
| | | opacity: 0.95; |
| | | } |
| | | .modal-card-item .modal-divider { |
| | | border-top-color: rgba(255, 255, 255, 0.35); |
| | | } |
| | | .modal-card-item .modal-tips-title { |
| | | color: #fff; |
| | | } |
| | | .modal-card-item .modal-tips-list { |
| | | color: #fff; |
| | | opacity: 0.9; |
| | | } |
| | | .modal-card-item .modal-standard-body { |
| | | color: #fff; |
| | | opacity: 0.95; |
| | | } |
| | | .modal-card-item .btn-close-transparent { |
| | | color: rgba(255, 255, 255, 0.55); |
| | | } |
| | | .modal-card-item .btn-close-transparent:hover { |
| | | color: rgba(255, 255, 255, 0.9); |
| | | background: rgba(255, 255, 255, 0.12); |
| | | } |
| | | .modal-header { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | margin-bottom: 0.25rem; |
| | | } |
| | | .modal-title { |
| | | font-size: 1.3125rem; |
| | | font-weight: 700; |
| | | text-align: center; |
| | | margin-bottom: 1rem; |
| | | color: #1a202c; |
| | | line-height: 1.35; |
| | | } |
| | | .modal-suggest { |
| | | text-align: center; |
| | | color: #fff; |
| | | } |
| | | .modal-suggest-label { |
| | | font-size: 0.875rem; |
| | | color: #fff; |
| | | opacity: 0.95; |
| | | line-height: 1.65; |
| | | } |
| | | .modal-suggest-visual { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | .modal-suggest-icon { |
| | | display: block; |
| | | width: auto; |
| | | max-width: 210px; |
| | | height: auto; |
| | | aspect-ratio: 1 / 1; |
| | | object-fit: contain; |
| | | object-position: center; |
| | | } |
| | | .modal-line { |
| | | font-size: 0.875rem; |
| | | color: #4a5568; |
| | | margin-bottom: 0.5rem; |
| | | line-height: 1.65; |
| | | padding: 0 0.5rem; |
| | | } |
| | | .modal-divider { |
| | | border: none; |
| | | border-top: 1px solid var(--color-border); |
| | | margin: 1.25rem 0 1rem; |
| | | } |
| | | .modal-tips-title { |
| | | font-size: 0.875rem; |
| | | font-weight: 700; |
| | | margin-bottom: 0.625rem; |
| | | color: #2d3748; |
| | | } |
| | | .modal-tips-list { |
| | | font-size: 0.8125rem; |
| | | color: #718096; |
| | | line-height: 1.85; |
| | | padding-left: 0; |
| | | list-style: none; |
| | | } |
| | | .modal-tips-list li { |
| | | margin-bottom: 0.375rem; |
| | | padding-left: 0.25rem; |
| | | } |
| | | .modal-standard-body { |
| | | font-size: 0.875rem; |
| | | line-height: 1.75; |
| | | color: #4a5568; |
| | | white-space: pre-line; |
| | | padding: 0 0.25rem; |
| | | } |
| | | .welcome-title { |
| | | font-size: 1.375rem; |
| | | font-weight: 700; |
| | | text-align: center; |
| | | color: #1a202c; |
| | | line-height: 1.35; |
| | | margin-bottom: 1.25rem; |
| | | } |
| | | .welcome-text p { |
| | | font-size: 0.9375rem; |
| | | line-height: 1.75; |
| | | margin-bottom: 0.875rem; |
| | | text-align: left; |
| | | color: #4a5568; |
| | | } |
| | | .welcome-text p:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | @keyframes fadeIn { |
| | | from { opacity: 0; } |
| | | to { opacity: 1; } |
| | | } |
| | | @keyframes slideUp { |
| | | from { opacity: 0; transform: translateY(12px); } |
| | | to { opacity: 1; transform: translateY(0); } |
| | | } |
| | | |
| | | /* Main content area */ |
| | | .main-content { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | background: var(--color-body); |
| | | } |
| | | |
| | | #browse-view { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | #search-view { |
| | | padding-top: 0.75rem; |
| | | } |
| | | |
| | | .no-results { |
| | | padding: 2.5rem 1.5rem; |
| | | text-align: center; |
| | | color: var(--color-gray-text); |
| | | font-size: 0.9375rem; |
| | | line-height: 1.6; |
| | | } |
| | | |
| | | .app-footer { |
| | | padding: 1rem 1.25rem 1.25rem; |
| | | text-align: center; |
| | | background: #eef2f7; |
| | | border-top: 1px solid var(--color-border); |
| | | flex-shrink: 0; |
| | | } |
| | | .app-footer p { |
| | | font-size: 0.75rem; |
| | | color: var(--color-gray-text); |
| | | line-height: 1.5; |
| | | letter-spacing: 0.01em; |
| | | } |
| | | |
| | | @media (min-width: 768px) { |
| | | body { |
| | | padding: 1.5rem 0; |
| | | } |
| | | .app-container { |
| | | min-height: calc(100vh - 3rem); |
| | | border-radius: var(--radius-xl); |
| | | overflow: hidden; |
| | | } |
| | | .title-text { font-size: 1.375rem; } |
| | | .modal-card { max-width: 26rem; padding: 2rem 1.75rem; } |
| | | .list-item { padding: 1.0625rem 1.25rem; } |
| | | } |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh-CN"> |
| | | |
| | | <head> |
| | | <meta charset="UTF-8"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> |
| | | <title data-i18n="page.title"></title> |
| | | <link rel="stylesheet" href="css/styles.css"> |
| | | <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script> |
| | | <script>LA.init({ id: "3QXRnnbLfuoKqmdc", ck: "3QXRnnbLfuoKqmdc" })</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <div class="app-container"> |
| | | <!-- Header --> |
| | | <header class="header"> |
| | | <div class="header-top"> |
| | | <img src="assets/logo.png" alt="" class="logo-icon" id="logo"> |
| | | <div class="header-actions"> |
| | | <button type="button" class="btn btn-header hidden" id="btn-home" data-i18n="btn.home"></button> |
| | | <div class="lang-dropdown" id="lang-dropdown"> |
| | | <button type="button" class="btn btn-header" id="btn-lang"></button> |
| | | <div class="lang-menu hidden" id="lang-menu"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <h1 class="title-text" data-i18n="header.title"></h1> |
| | | </header> |
| | | |
| | | <!-- Search --> |
| | | <div class="search-row"> |
| | | <input type="text" class="search-input" id="search-input" data-i18n-placeholder="search.placeholder"> |
| | | <button type="button" class="btn btn-query" id="btn-query" data-i18n="btn.query"></button> |
| | | <button type="button" class="btn btn-voice" id="btn-voice" data-i18n="btn.voice"></button> |
| | | </div> |
| | | |
| | | <!-- Main content --> |
| | | <div class="main-content" id="main-content"> |
| | | <!-- Browse mode --> |
| | | <div id="browse-view"> |
| | | <div class="browse-section"> |
| | | <div class="tabs-wrap"> |
| | | <div class="tabs" id="tabs"></div> |
| | | <div class="tab-detail" id="tab-detail"> |
| | | <p class="tab-desc" id="tab-desc"></p> |
| | | <div class="tab-standard-wrap"> |
| | | <button type="button" class="btn btn-standard" id="btn-standard" data-i18n="btn.standard"></button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="item-list item-list-browse" id="item-list"></div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- Search fuzzy results --> |
| | | <div id="search-view" class="hidden flex flex-col h-full"> |
| | | <div class="search-hints"> |
| | | <p class="search-hint-main" data-i18n="search.notFoundHint"></p> |
| | | <p class="search-hint-sub" data-i18n="search.referenceHint"></p> |
| | | </div> |
| | | <div class="item-list flex-1" id="search-results"></div> |
| | | </div> |
| | | |
| | | <div class="no-results hidden" id="no-results" data-i18n="search.noResults"></div> |
| | | </div> |
| | | |
| | | <footer class="app-footer"> |
| | | <p data-i18n="footer.copyright"></p> |
| | | </footer> |
| | | </div> |
| | | |
| | | <!-- Welcome modal --> |
| | | <div class="modal-overlay hidden" id="welcome-modal"> |
| | | <div class="modal-card"> |
| | | <h2 class="welcome-title" data-i18n="welcome.title"></h2> |
| | | <div class="welcome-text"> |
| | | <p data-i18n="welcome.p1"></p> |
| | | <p data-i18n="welcome.p2"></p> |
| | | <p data-i18n="welcome.p3"></p> |
| | | </div> |
| | | <button type="button" class="btn btn-confirm" id="btn-welcome-confirm" data-i18n="welcome.confirm"></button> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- Standard modal --> |
| | | <div class="modal-overlay hidden" id="standard-modal"> |
| | | <div class="modal-card modal-card-wide modal-card-item" id="standard-modal-card"> |
| | | <h2 class="modal-title" id="standard-title"></h2> |
| | | <div class="modal-standard-body" id="standard-body"></div> |
| | | <div class="text-center"> |
| | | <button type="button" class="btn-close-transparent" id="btn-standard-close" aria-label="close">×</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- Item disposal modal --> |
| | | <div class="modal-overlay hidden" id="item-modal"> |
| | | <div class="modal-card modal-card-item" id="item-modal-card"> |
| | | <h2 class="modal-title" id="item-modal-name"></h2> |
| | | <div class="modal-suggest" id="item-modal-suggest"> |
| | | <p class="modal-suggest-label" data-i18n="disposal.suggestLabel"></p> |
| | | <div class="modal-suggest-visual"> |
| | | <img src="" alt="" class="modal-suggest-icon" id="item-modal-icon" width="180" height="180"> |
| | | </div> |
| | | </div> |
| | | <p class="modal-line" id="item-modal-line1"></p> |
| | | <p class="modal-line" id="item-modal-line2"></p> |
| | | <hr class="modal-divider"> |
| | | <p class="modal-tips-title" data-i18n="disposal.tipsTitle"></p> |
| | | <ol class="modal-tips-list" id="item-modal-tips"></ol> |
| | | <div class="text-center"> |
| | | <button type="button" class="btn-close-transparent" id="btn-item-close" aria-label="close">×</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <script src="js/storage.js"></script> |
| | | <script src="js/i18n.js"></script> |
| | | <script src="js/data.js"></script> |
| | | <script src="js/app.js"></script> |
| | | </body> |
| | | |
| | | </html> |
| New file |
| | |
| | | const App = { |
| | | state: 'home', |
| | | currentCategoryId: 'recyclable', |
| | | recognition: null, |
| | | isRecording: false, |
| | | longPressTimer: null, |
| | | longPressDelay: 300, |
| | | |
| | | els: {}, |
| | | |
| | | async init() { |
| | | this.cacheElements(); |
| | | await I18n.load('zh'); |
| | | await DataStore.load(); |
| | | I18n.applyToDOM(); |
| | | this.initLangDropdown(); |
| | | this.renderTabs(); |
| | | this.selectCategory('recyclable'); |
| | | this.bindEvents(); |
| | | this.initVoice(); |
| | | this.showWelcomeIfNeeded(); |
| | | history.replaceState({ view: 'home' }, ''); |
| | | }, |
| | | |
| | | cacheElements() { |
| | | this.els.searchInput = document.getElementById('search-input'); |
| | | this.els.btnQuery = document.getElementById('btn-query'); |
| | | this.els.btnVoice = document.getElementById('btn-voice'); |
| | | this.els.btnHome = document.getElementById('btn-home'); |
| | | this.els.btnLang = document.getElementById('btn-lang'); |
| | | this.els.langMenu = document.getElementById('lang-menu'); |
| | | this.els.langDropdown = document.getElementById('lang-dropdown'); |
| | | this.els.tabs = document.getElementById('tabs'); |
| | | this.els.tabDetail = document.getElementById('tab-detail'); |
| | | this.els.tabDesc = document.getElementById('tab-desc'); |
| | | this.els.btnStandard = document.getElementById('btn-standard'); |
| | | this.els.itemList = document.getElementById('item-list'); |
| | | this.els.browseView = document.getElementById('browse-view'); |
| | | this.els.searchView = document.getElementById('search-view'); |
| | | this.els.searchResults = document.getElementById('search-results'); |
| | | this.els.welcomeModal = document.getElementById('welcome-modal'); |
| | | this.els.btnWelcomeConfirm = document.getElementById('btn-welcome-confirm'); |
| | | this.els.standardModal = document.getElementById('standard-modal'); |
| | | this.els.standardModalCard = document.getElementById('standard-modal-card'); |
| | | this.els.btnStandardClose = document.getElementById('btn-standard-close'); |
| | | this.els.standardTitle = document.getElementById('standard-title'); |
| | | this.els.standardBody = document.getElementById('standard-body'); |
| | | this.els.itemModal = document.getElementById('item-modal'); |
| | | this.els.itemModalCard = document.getElementById('item-modal-card'); |
| | | this.els.itemModalSuggest = document.getElementById('item-modal-suggest'); |
| | | this.els.itemModalName = document.getElementById('item-modal-name'); |
| | | this.els.itemModalIcon = document.getElementById('item-modal-icon'); |
| | | this.els.itemModalLine1 = document.getElementById('item-modal-line1'); |
| | | this.els.itemModalLine2 = document.getElementById('item-modal-line2'); |
| | | this.els.itemModalTips = document.getElementById('item-modal-tips'); |
| | | this.els.btnItemClose = document.getElementById('btn-item-close'); |
| | | this.els.noResults = document.getElementById('no-results'); |
| | | }, |
| | | |
| | | initLangDropdown() { |
| | | const current = I18n.languages.find(l => l.code === I18n.currentLang); |
| | | this.els.btnLang.textContent = I18n.t(current.labelKey); |
| | | const onLangSelect = async (code) => { |
| | | await I18n.load(code); |
| | | I18n.applyToDOM(); |
| | | this.els.btnLang.textContent = I18n.t(I18n.languages.find(l => l.code === code).labelKey); |
| | | I18n.renderLangMenu(this.els.langMenu, onLangSelect); |
| | | this.els.langMenu.classList.add('hidden'); |
| | | this.renderTabs(); |
| | | this.selectCategory(this.currentCategoryId); |
| | | if (this.state === 'searchFuzzy') { |
| | | const q = this.els.searchInput.value.trim(); |
| | | if (q) this.search(q, false); |
| | | } |
| | | }; |
| | | I18n.renderLangMenu(this.els.langMenu, onLangSelect); |
| | | }, |
| | | |
| | | bindEvents() { |
| | | this.els.btnQuery.addEventListener('click', () => { |
| | | const q = this.els.searchInput.value.trim(); |
| | | if (q) this.search(q); |
| | | }); |
| | | this.els.searchInput.addEventListener('keydown', (e) => { |
| | | if (e.key === 'Enter') { |
| | | const q = this.els.searchInput.value.trim(); |
| | | if (q) this.search(q); |
| | | } |
| | | }); |
| | | this.els.btnHome.addEventListener('click', () => this.goHome()); |
| | | this.els.btnLang.addEventListener('click', (e) => { |
| | | e.stopPropagation(); |
| | | this.els.langMenu.classList.toggle('hidden'); |
| | | }); |
| | | document.addEventListener('click', () => { |
| | | this.els.langMenu.classList.add('hidden'); |
| | | }); |
| | | this.els.btnStandard.addEventListener('click', () => this.openStandardModal()); |
| | | this.els.btnStandardClose.addEventListener('click', () => this.closeStandardModal()); |
| | | this.els.standardModal.addEventListener('click', (e) => { |
| | | if (e.target === this.els.standardModal) this.closeStandardModal(); |
| | | }); |
| | | this.els.btnItemClose.addEventListener('click', () => this.closeItemModal()); |
| | | this.els.itemModal.addEventListener('click', (e) => { |
| | | if (e.target === this.els.itemModal) this.closeItemModal(); |
| | | }); |
| | | this.els.btnWelcomeConfirm.addEventListener('click', () => { |
| | | Storage.dismissWelcome(); |
| | | this.els.welcomeModal.classList.add('hidden'); |
| | | }); |
| | | window.addEventListener('popstate', (e) => { |
| | | if (!e.state || e.state.view === 'home') { |
| | | this.goHome(false); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | showWelcomeIfNeeded() { |
| | | if (!Storage.isWelcomeDismissed()) { |
| | | this.els.welcomeModal.classList.remove('hidden'); |
| | | } |
| | | }, |
| | | |
| | | renderTabs() { |
| | | this.els.tabs.innerHTML = ''; |
| | | DataStore.categories.forEach(cat => { |
| | | const tab = document.createElement('div'); |
| | | tab.className = 'tab'; |
| | | tab.dataset.categoryId = cat.id; |
| | | tab.innerHTML = |
| | | '<span class="tab-color-bar" style="background-color:' + cat.color + '"></span>' + |
| | | '<img src="' + (cat.iconInactive || cat.icon) + '" alt="" class="tab-icon" width="210" height="210">'; |
| | | tab.addEventListener('click', () => { |
| | | if (this.state === 'searchFuzzy') return; |
| | | this.selectCategory(cat.id); |
| | | }); |
| | | this.els.tabs.appendChild(tab); |
| | | }); |
| | | }, |
| | | |
| | | updateTabStates(categoryId) { |
| | | this.els.tabs.querySelectorAll('.tab').forEach(tab => { |
| | | const cat = DataStore.getCategory(tab.dataset.categoryId); |
| | | if (!cat) return; |
| | | const isActive = tab.dataset.categoryId === categoryId; |
| | | tab.classList.toggle('active', isActive); |
| | | tab.style.backgroundColor = isActive ? cat.color : ''; |
| | | const iconEl = tab.querySelector('.tab-icon'); |
| | | if (iconEl) { |
| | | iconEl.src = isActive ? cat.icon : (cat.iconInactive || cat.icon); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | selectCategory(categoryId) { |
| | | this.currentCategoryId = categoryId; |
| | | const cat = DataStore.getCategory(categoryId); |
| | | if (!cat) return; |
| | | |
| | | this.updateTabStates(categoryId); |
| | | this.els.tabDetail.style.backgroundColor = cat.color; |
| | | this.els.tabDesc.textContent = I18n.t(cat.descKey); |
| | | this.renderItemList(DataStore.getItemsByCategory(categoryId), this.els.itemList, false); |
| | | }, |
| | | |
| | | renderItemList(items, container, isSearch) { |
| | | container.innerHTML = ''; |
| | | container.classList.toggle('item-list-browse', !isSearch); |
| | | container.classList.toggle('item-list-search-wrap', isSearch); |
| | | items.forEach((item, index) => { |
| | | const row = document.createElement('div'); |
| | | if (isSearch) { |
| | | row.className = 'list-item list-item-search' + (index % 2 === 0 ? ' list-item-even' : ' list-item-odd'); |
| | | const cat = DataStore.getCategory(item.categoryId); |
| | | row.innerHTML = |
| | | '<span class="item-name">' + DataStore.getLocalizedName(item) + '</span>' + |
| | | '<span class="item-category ' + DataStore.getCategoryColorClass(item.categoryId) + '">' + |
| | | I18n.t(cat.nameKey) + '</span>'; |
| | | } else { |
| | | row.className = 'list-item' + (index % 2 === 0 ? ' list-item-even' : ' list-item-odd'); |
| | | row.textContent = DataStore.getLocalizedName(item); |
| | | } |
| | | row.addEventListener('click', () => this.openItemModal(item)); |
| | | container.appendChild(row); |
| | | }); |
| | | }, |
| | | |
| | | openStandardModal() { |
| | | const cat = DataStore.getCategory(this.currentCategoryId); |
| | | if (!cat) return; |
| | | this.els.standardModalCard.style.backgroundColor = cat.color; |
| | | this.els.standardTitle.textContent = I18n.t(cat.nameKey) + ' - ' + I18n.t('btn.standard'); |
| | | this.els.standardBody.textContent = I18n.t(cat.standardKey); |
| | | this.els.standardModal.classList.remove('hidden'); |
| | | }, |
| | | |
| | | closeStandardModal() { |
| | | this.els.standardModal.classList.add('hidden'); |
| | | }, |
| | | |
| | | openItemModal(item) { |
| | | const cat = DataStore.getCategory(item.categoryId); |
| | | if (!cat) return; |
| | | const tpl = cat.disposalTemplate; |
| | | |
| | | this.els.itemModalName.textContent = DataStore.getLocalizedName(item); |
| | | this.els.itemModalCard.style.backgroundColor = cat.color; |
| | | this.els.itemModalIcon.src = cat.icon; |
| | | this.els.itemModalLine1.textContent = I18n.t(tpl.line1Key); |
| | | this.els.itemModalLine2.textContent = I18n.t(tpl.line2Key); |
| | | |
| | | this.els.itemModalTips.innerHTML = ''; |
| | | tpl.tipsKeys.forEach((key, i) => { |
| | | const li = document.createElement('li'); |
| | | li.textContent = (i + 1) + '. ' + I18n.t(key); |
| | | this.els.itemModalTips.appendChild(li); |
| | | }); |
| | | |
| | | this.els.itemModal.classList.remove('hidden'); |
| | | }, |
| | | |
| | | closeItemModal() { |
| | | this.els.itemModal.classList.add('hidden'); |
| | | }, |
| | | |
| | | search(query, pushHistory) { |
| | | if (pushHistory === undefined) pushHistory = true; |
| | | const q = query.trim().toLowerCase(); |
| | | if (!q) return; |
| | | |
| | | this.els.noResults.classList.add('hidden'); |
| | | const allItems = DataStore.getAllItemsLocalized(); |
| | | const exact = allItems.filter(i => i.localName.toLowerCase() === q); |
| | | |
| | | if (exact.length === 1) { |
| | | this.state = 'searchExact'; |
| | | this.els.btnHome.classList.add('hidden'); |
| | | this.openItemModal(exact[0]); |
| | | return; |
| | | } |
| | | |
| | | const fuzzy = allItems.filter(i => i.localName.toLowerCase().includes(q)); |
| | | |
| | | if (fuzzy.length === 0) { |
| | | this.els.browseView.classList.remove('hidden'); |
| | | this.els.searchView.classList.add('hidden'); |
| | | this.els.btnHome.classList.add('hidden'); |
| | | this.els.noResults.classList.remove('hidden'); |
| | | this.state = 'home'; |
| | | return; |
| | | } |
| | | |
| | | this.state = 'searchFuzzy'; |
| | | this.els.browseView.classList.add('hidden'); |
| | | this.els.searchView.classList.remove('hidden'); |
| | | this.els.btnHome.classList.remove('hidden'); |
| | | this.renderItemList(fuzzy, this.els.searchResults, true); |
| | | |
| | | if (pushHistory) { |
| | | if (this.state === 'searchFuzzy') { |
| | | history.replaceState({ view: 'search' }, ''); |
| | | } else { |
| | | history.pushState({ view: 'search' }, ''); |
| | | } |
| | | } |
| | | }, |
| | | |
| | | goHome(fromHistory) { |
| | | if (fromHistory === undefined) fromHistory = true; |
| | | this.state = 'home'; |
| | | this.els.searchInput.value = ''; |
| | | this.els.browseView.classList.remove('hidden'); |
| | | this.els.searchView.classList.add('hidden'); |
| | | this.els.btnHome.classList.add('hidden'); |
| | | this.els.noResults.classList.add('hidden'); |
| | | this.closeItemModal(); |
| | | this.closeStandardModal(); |
| | | this.selectCategory('recyclable'); |
| | | if (fromHistory && history.state && history.state.view === 'search') { |
| | | history.back(); |
| | | } |
| | | }, |
| | | |
| | | initVoice() { |
| | | const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; |
| | | if (!SpeechRecognition) { |
| | | this.els.btnVoice.classList.add('hidden'); |
| | | return; |
| | | } |
| | | |
| | | this.recognition = new SpeechRecognition(); |
| | | this.recognition.lang = I18n.getLocale(); |
| | | this.recognition.interimResults = false; |
| | | this.recognition.maxAlternatives = 1; |
| | | |
| | | this.recognition.onresult = (event) => { |
| | | const transcript = event.results[0][0].transcript; |
| | | this.els.searchInput.value = transcript; |
| | | this.search(transcript); |
| | | }; |
| | | |
| | | this.recognition.onerror = () => { |
| | | this.stopRecording(); |
| | | }; |
| | | |
| | | this.recognition.onend = () => { |
| | | this.stopRecording(); |
| | | }; |
| | | |
| | | const startRecording = (e) => { |
| | | e.preventDefault(); |
| | | this.longPressTimer = setTimeout(() => { |
| | | this.startRecording(); |
| | | }, this.longPressDelay); |
| | | }; |
| | | |
| | | const cancelLongPress = () => { |
| | | if (this.longPressTimer) { |
| | | clearTimeout(this.longPressTimer); |
| | | this.longPressTimer = null; |
| | | } |
| | | if (this.isRecording) { |
| | | this.recognition.stop(); |
| | | } |
| | | }; |
| | | |
| | | this.els.btnVoice.addEventListener('mousedown', startRecording); |
| | | this.els.btnVoice.addEventListener('mouseup', cancelLongPress); |
| | | this.els.btnVoice.addEventListener('mouseleave', cancelLongPress); |
| | | this.els.btnVoice.addEventListener('touchstart', startRecording, { passive: false }); |
| | | this.els.btnVoice.addEventListener('touchend', cancelLongPress); |
| | | this.els.btnVoice.addEventListener('touchcancel', cancelLongPress); |
| | | }, |
| | | |
| | | startRecording() { |
| | | if (this.isRecording) return; |
| | | this.isRecording = true; |
| | | this.recognition.lang = I18n.getLocale(); |
| | | this.els.btnVoice.classList.add('recording'); |
| | | try { |
| | | this.recognition.start(); |
| | | } catch { |
| | | this.stopRecording(); |
| | | } |
| | | }, |
| | | |
| | | stopRecording() { |
| | | this.isRecording = false; |
| | | this.els.btnVoice.classList.remove('recording'); |
| | | } |
| | | }; |
| | | |
| | | document.addEventListener('DOMContentLoaded', () => App.init()); |
| New file |
| | |
| | | const DataStore = { |
| | | categories: [], |
| | | items: [], |
| | | categoryMap: {}, |
| | | |
| | | async load() { |
| | | const [catRes, itemRes] = await Promise.all([ |
| | | fetch('config/categories.json'), |
| | | fetch('config/items.json') |
| | | ]); |
| | | this.categories = await catRes.json(); |
| | | this.items = await itemRes.json(); |
| | | this.categoryMap = {}; |
| | | this.categories.forEach(c => { this.categoryMap[c.id] = c; }); |
| | | }, |
| | | |
| | | getCategory(id) { |
| | | return this.categoryMap[id]; |
| | | }, |
| | | |
| | | getItemsByCategory(categoryId) { |
| | | return this.items.filter(i => i.categoryId === categoryId); |
| | | }, |
| | | |
| | | getLocalizedName(item) { |
| | | return I18n.t(item.nameKey); |
| | | }, |
| | | |
| | | getAllItemsLocalized() { |
| | | return this.items.map(item => ({ |
| | | ...item, |
| | | localName: this.getLocalizedName(item), |
| | | category: this.getCategory(item.categoryId) |
| | | })); |
| | | }, |
| | | |
| | | getCategoryName(categoryId) { |
| | | const cat = this.getCategory(categoryId); |
| | | return cat ? I18n.t(cat.nameKey) : ''; |
| | | }, |
| | | |
| | | getCategoryColorClass(categoryId) { |
| | | const map = { |
| | | recyclable: 'text-recyclable', |
| | | hazardous: 'text-hazardous', |
| | | wet: 'text-wet', |
| | | dry: 'text-dry' |
| | | }; |
| | | return map[categoryId] || ''; |
| | | } |
| | | }; |
| New file |
| | |
| | | const I18n = { |
| | | currentLang: 'zh', |
| | | strings: {}, |
| | | languages: [ |
| | | { code: 'zh', labelKey: 'lang.zh', locale: 'zh-CN', file: 'config/i18n/zh.json' }, |
| | | { code: 'en', labelKey: 'lang.en', locale: 'en-US', file: 'config/i18n/en.json' }, |
| | | { code: 'ko', labelKey: 'lang.ko', locale: 'ko-KR', file: 'config/i18n/ko.json' }, |
| | | { code: 'ja', labelKey: 'lang.ja', locale: 'ja-JP', file: 'config/i18n/ja.json' } |
| | | ], |
| | | |
| | | async load(lang) { |
| | | const langConfig = this.languages.find(l => l.code === lang); |
| | | if (!langConfig) return; |
| | | const res = await fetch(langConfig.file); |
| | | this.strings = await res.json(); |
| | | this.currentLang = lang; |
| | | document.documentElement.lang = langConfig.locale; |
| | | }, |
| | | |
| | | t(key) { |
| | | return this.strings[key] || key; |
| | | }, |
| | | |
| | | getLocale() { |
| | | const langConfig = this.languages.find(l => l.code === this.currentLang); |
| | | return langConfig ? langConfig.locale : 'zh-CN'; |
| | | }, |
| | | |
| | | applyToDOM() { |
| | | document.querySelectorAll('[data-i18n]').forEach(el => { |
| | | const key = el.getAttribute('data-i18n'); |
| | | el.textContent = this.t(key); |
| | | }); |
| | | document.querySelectorAll('[data-i18n-placeholder]').forEach(el => { |
| | | const key = el.getAttribute('data-i18n-placeholder'); |
| | | el.placeholder = this.t(key); |
| | | }); |
| | | const titleEl = document.querySelector('title[data-i18n]'); |
| | | if (titleEl) { |
| | | document.title = this.t(titleEl.getAttribute('data-i18n')); |
| | | } |
| | | }, |
| | | |
| | | renderLangMenu(menuEl, onSelect) { |
| | | menuEl.innerHTML = ''; |
| | | this.languages.forEach(lang => { |
| | | const item = document.createElement('div'); |
| | | item.className = 'lang-menu-item' + (lang.code === this.currentLang ? ' active' : ''); |
| | | item.textContent = this.t(lang.labelKey); |
| | | item.addEventListener('click', () => onSelect(lang.code)); |
| | | menuEl.appendChild(item); |
| | | }); |
| | | } |
| | | }; |
| New file |
| | |
| | | const WELCOME_KEY = 'garbage_welcome_dismissed_at'; |
| | | const WELCOME_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000; |
| | | |
| | | const Storage = { |
| | | isWelcomeDismissed() { |
| | | try { |
| | | const dismissedAt = localStorage.getItem(WELCOME_KEY); |
| | | if (!dismissedAt) return false; |
| | | return Date.now() - parseInt(dismissedAt, 10) < WELCOME_COOLDOWN_MS; |
| | | } catch { |
| | | return false; |
| | | } |
| | | }, |
| | | |
| | | dismissWelcome() { |
| | | try { |
| | | localStorage.setItem(WELCOME_KEY, String(Date.now())); |
| | | } catch { |
| | | /* ignore */ |
| | | } |
| | | } |
| | | }; |
| New file |
| | |
| | | # -*- coding: utf-8 -*- |
| | | import json |
| | | import os |
| | | import re |
| | | |
| | | BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| | | |
| | | RECYCLABLE = "牛奶盒、塑料、玻璃瓶、玻璃、纸、衣服、碎玻璃、易拉罐、塑料盒、泡沫板、充电宝、鞋子、纸盒、泡沫箱、玻璃杯、报纸、塑料杯、电线、数据线、矿泉水瓶、枕头、刀片、螺丝、泡沫塑料、酸奶利乐包装盒、纸袋、化妆品塑料空瓶、皮鞋、化妆品玻璃空瓶、酒瓶、充电线、广告单、废塑料、烟盒、充电器、书本、啤酒瓶、纸板箱、木筷子、毛绒玩具、被单、剪刀、饮料塑料瓶、布、除湿盒、吸铁石、塑料包装纸、被子、利乐包装、篮球、铝箔、插座、铁、钥匙、打印纸、金属、白纸、包装纸盒、塑料盖、信封".split("、") |
| | | |
| | | HAZARDOUS = "药品包装、药瓶、灯泡、油漆桶、药品、过期药、充电电池、指甲油、蓄电池、空药瓶、有害垃圾、过期药品、废药品、灯管、荧光灯管、镍镉电池、照片、荧光灯、染发剂壳、眼药水、节能灯、杀虫剂、药片、药片盒、口服液药瓶、废药瓶、油漆、纽扣电池、避孕药、眼药水瓶、胶片、胶囊、水银温度计、老鼠药、胶囊药片底板、染发剂罐、节能灯泡、各类过期药品、白炽灯泡、手机电池、消毒液瓶、过期药片、感冒药、84消毒液空瓶、指甲油瓶、杀毒喷雾罐、相片底片、中成药、胶卷、药品壳子、水银、相片、废油漆桶、过期药物、药品铝塑板、蟑螂药、蟑螂丸、胶囊药片、消毒药片、节能灯管".split("、") |
| | | |
| | | WET = "瓜子壳、鸡蛋壳、玉米棒、蛋壳、玉米、核桃、花生壳、茶叶、龙虾壳、小龙虾、蟹壳、鸡骨头、瓜子、螃蟹壳、熟玉米棒、开心果壳、小龙虾壳、毛豆壳、霞壳、香蕉皮、西瓜皮、栗子壳、鱼骨头、龙虾、玉米芯、瓜子片、花、咖啡渣、排骨、粽子、中药渣、鸡蛋、螃蟹、荔枝壳、桃子、话梅核、枣核、鸡骨、过期食品、鱼骨、苹果、荔枝核、杨梅、西瓜籽、板栗壳、蟑螂、果皮、芒果核、花生、干花生壳、饼干、西瓜、鲜花、红枣核、芦稷、苹果核、茭白皮、面包、香蕉、茶叶渣".split("、") |
| | | |
| | | DRY = "塑料袋、粽叶、核桃壳、头发、贝壳、卫生巾、避孕套、口香糖、打火机、椰子壳、猫砂、面膜、餐巾纸、大骨头、奶茶杯、纸巾、蛤蜊壳、粽子叶、玉米皮、吸管、茶包、甘蔗皮、干燥剂、一次性筷子、玉米壳、烟蒂、湿纸巾、榴莲壳、卫生纸、大核桃壳、指甲、包装袋、口红、一次性杯子、螺蛳壳、牙刷、外卖餐盒、榴莲、尿不湿、垃圾袋、牙膏皮、冰袋、袜子、笔、纸尿裤、榴莲核、一次性餐盒、茶叶包、口罩、内裤、毛巾、尿布、陶瓷碗、笔芯、肮脏塑料袋、回形针、牙签、食品包装袋、水彩笔、棉签".split("、") |
| | | |
| | | # key_suffix -> (zh, en, ko, ja) |
| | | TRANSLATIONS = { |
| | | "milkBox": ("牛奶盒", "Milk Carton", "우유팩", "牛乳パック"), |
| | | "plastic": ("塑料", "Plastic", "플라스틱", "プラスチック"), |
| | | "glassBottle": ("玻璃瓶", "Glass Bottle", "유리병", "ガラス瓶"), |
| | | "glass": ("玻璃", "Glass", "유리", "ガラス"), |
| | | "paper": ("纸", "Paper", "종이", "紙"), |
| | | "clothes": ("衣服", "Clothes", "옷", "衣類"), |
| | | "brokenGlass": ("碎玻璃", "Broken Glass", "깨진 유리", "割れたガラス"), |
| | | "can": ("易拉罐", "Aluminum Can", "알루미늄 캔", "アルミ缶"), |
| | | "plasticBox": ("塑料盒", "Plastic Box", "플라스틱 상자", "プラスチック箱"), |
| | | "foamBoard": ("泡沫板", "Foam Board", "스티로폼 판", "発泡ボード"), |
| | | "powerBank": ("充电宝", "Power Bank", "보조배터리", "モバイルバッテリー"), |
| | | "shoes": ("鞋子", "Shoes", "신발", "靴"), |
| | | "paperBox": ("纸盒", "Paper Box", "종이상자", "紙箱"), |
| | | "foamBox": ("泡沫箱", "Foam Box", "스티로폼 상자", "発泡スチロール箱"), |
| | | "glassCup": ("玻璃杯", "Glass Cup", "유리컵", "ガラスコップ"), |
| | | "newspaper": ("报纸", "Newspaper", "신문", "新聞紙"), |
| | | "plasticCup": ("塑料杯", "Plastic Cup", "플라스틱 컵", "プラスチックカップ"), |
| | | "wire": ("电线", "Electric Wire", "전선", "電線"), |
| | | "dataCable": ("数据线", "Data Cable", "데이터 케이블", "データケーブル"), |
| | | "waterBottle": ("矿泉水瓶", "Water Bottle", "생수병", "ミネラルウォーターボトル"), |
| | | "pillow": ("枕头", "Pillow", "베개", "枕"), |
| | | "blade": ("刀片", "Blade", "칼날", "刃物"), |
| | | "screw": ("螺丝", "Screw", "나사", "ネジ"), |
| | | "foamPlastic": ("泡沫塑料", "Foam Plastic", "발포 플라스틱", "発泡プラスチック"), |
| | | "yogurtTetraPak": ("酸奶利乐包装盒", "Yogurt Tetra Pak", "요구르트 테트라팩", "ヨーグルトテトラパック"), |
| | | "paperBag": ("纸袋", "Paper Bag", "종이봉투", "紙袋"), |
| | | "cosmeticPlasticBottle": ("化妆品塑料空瓶", "Empty Cosmetic Plastic Bottle", "화장품 플라스틱 빈병", "化粧品プラスチック空瓶"), |
| | | "leatherShoes": ("皮鞋", "Leather Shoes", "가죽신", "革靴"), |
| | | "cosmeticGlassBottle": ("化妆品玻璃空瓶", "Empty Cosmetic Glass Bottle", "화장품 유리 빈병", "化粧品ガラス空瓶"), |
| | | "wineBottle": ("酒瓶", "Wine Bottle", "술병", "酒瓶"), |
| | | "chargingCable": ("充电线", "Charging Cable", "충전 케이블", "充電ケーブル"), |
| | | "flyer": ("广告单", "Flyer", "광고 전단", "チラシ"), |
| | | "wastePlastic": ("废塑料", "Waste Plastic", "폐플라스틱", "廃プラスチック"), |
| | | "cigaretteBox": ("烟盒", "Cigarette Box", "담배갑", "タバコの箱"), |
| | | "charger": ("充电器", "Charger", "충전기", "充電器"), |
| | | "book": ("书本", "Books", "책", "書籍"), |
| | | "beerBottle": ("啤酒瓶", "Beer Bottle", "맥주병", "ビール瓶"), |
| | | "cardboardBox": ("纸板箱", "Cardboard Box", "골판지 상자", "段ボール箱"), |
| | | "woodChopsticks": ("木筷子", "Wooden Chopsticks", "나무 젓가락", "木製箸"), |
| | | "plushToy": ("毛绒玩具", "Plush Toy", "봉제 인형", "ぬいぐるみ"), |
| | | "bedSheet": ("被单", "Bed Sheet", "침대 시트", "シーツ"), |
| | | "scissors": ("剪刀", "Scissors", "가위", "はさみ"), |
| | | "drinkPlasticBottle": ("饮料塑料瓶", "Drink Plastic Bottle", "음료 플라스틱병", "飲料プラスチックボトル"), |
| | | "fabric": ("布", "Fabric", "천", "布"), |
| | | "dehumidifierBox": ("除湿盒", "Dehumidifier Box", "제습제 상자", "除湿剤ボックス"), |
| | | "magnet": ("吸铁石", "Magnet", "자석", "磁石"), |
| | | "plasticWrap": ("塑料包装纸", "Plastic Wrap", "플라스틱 포장지", "プラスチック包装紙"), |
| | | "quilt": ("被子", "Quilt", "이불", "布団"), |
| | | "tetraPak": ("利乐包装", "Tetra Pak", "테트라팩", "テトラパック"), |
| | | "basketball": ("篮球", "Basketball", "농구공", "バスケットボール"), |
| | | "aluminumFoil": ("铝箔", "Aluminum Foil", "알루미늄 호일", "アルミホイル"), |
| | | "socket": ("插座", "Socket", "콘센트", "コンセント"), |
| | | "iron": ("铁", "Iron", "철", "鉄"), |
| | | "key": ("钥匙", "Key", "열쇠", "鍵"), |
| | | "printingPaper": ("打印纸", "Printing Paper", "인쇄용지", "印刷用紙"), |
| | | "metal": ("金属", "Metal", "금속", "金属"), |
| | | "whitePaper": ("白纸", "White Paper", "흰 종이", "白紙"), |
| | | "packagingBox": ("包装纸盒", "Packaging Paper Box", "포장 종이상자", "包装紙箱"), |
| | | "plasticLid": ("塑料盖", "Plastic Lid", "플라스틱 뚜껑", "プラスチック蓋"), |
| | | "envelope": ("信封", "Envelope", "봉투", "封筒"), |
| | | "medicinePackaging": ("药品包装", "Medicine Packaging", "약 포장", "薬の包装"), |
| | | "medicineBottle": ("药瓶", "Medicine Bottle", "약병", "薬瓶"), |
| | | "lightBulb": ("灯泡", "Light Bulb", "전구", "電球"), |
| | | "paintBucket": ("油漆桶", "Paint Bucket", "페인트 통", "ペンキ缶"), |
| | | "medicine": ("药品", "Medicine", "약품", "薬品"), |
| | | "expiredMedicine": ("过期药", "Expired Medicine", "유통기한 지난 약", "期限切れの薬"), |
| | | "rechargeableBattery": ("充电电池", "Rechargeable Battery", "충전 배터리", "充電式電池"), |
| | | "nailPolish": ("指甲油", "Nail Polish", "매니큐어", "マニキュア"), |
| | | "storageBattery": ("蓄电池", "Storage Battery", "축전지", "蓄電池"), |
| | | "emptyMedicineBottle": ("空药瓶", "Empty Medicine Bottle", "빈 약병", "空の薬瓶"), |
| | | "hazardousWaste": ("有害垃圾", "Hazardous Waste", "유해 쓰레기", "有害ごみ"), |
| | | "expiredMedicine2": ("过期药品", "Expired Medicine", "유통기한 지난 의약품", "期限切れ医薬品"), |
| | | "wasteMedicine": ("废药品", "Waste Medicine", "폐의약품", "廃薬品"), |
| | | "lightTube": ("灯管", "Light Tube", "형광등", "蛍光灯管"), |
| | | "fluorescentTube": ("荧光灯管", "Fluorescent Tube", "형광등관", "蛍光管"), |
| | | "niCdBattery": ("镍镉电池", "Ni-Cd Battery", "니켈카드뮴 배터리", "ニッケルカドミウム電池"), |
| | | "photo": ("照片", "Photo", "사진", "写真"), |
| | | "fluorescentLamp": ("荧光灯", "Fluorescent Lamp", "형광등", "蛍光灯"), |
| | | "hairDyeShell": ("染发剂壳", "Hair Dye Shell", "염색제 용기", "ヘアカラー容器"), |
| | | "eyeDrops": ("眼药水", "Eye Drops", "안약", "目薬"), |
| | | "energySavingLamp": ("节能灯", "Energy-saving Lamp", "절전등", "省エネランプ"), |
| | | "insecticide": ("杀虫剂", "Insecticide", "살충제", "殺虫剤"), |
| | | "medicineTablet": ("药片", "Medicine Tablet", "약정", "錠剤"), |
| | | "medicineTabletBox": ("药片盒", "Medicine Tablet Box", "약정 상자", "錠剤の箱"), |
| | | "oralLiquidBottle": ("口服液药瓶", "Oral Liquid Medicine Bottle", "시럽 약병", "内服液薬瓶"), |
| | | "wasteMedicineBottle": ("废药瓶", "Waste Medicine Bottle", "폐약병", "廃薬瓶"), |
| | | "paint": ("油漆", "Paint", "페인트", "ペンキ"), |
| | | "buttonBattery": ("纽扣电池", "Button Battery", "단추전지", "ボタン電池"), |
| | | "contraceptive": ("避孕药", "Contraceptive", "피임약", "避妊薬"), |
| | | "eyeDropsBottle": ("眼药水瓶", "Eye Drops Bottle", "안약병", "目薬瓶"), |
| | | "film": ("胶片", "Film", "필름", "フィルム"), |
| | | "capsule": ("胶囊", "Capsule", "캡슐", "カプセル"), |
| | | "mercuryThermometer": ("水银温度计", "Mercury Thermometer", "수은 온도계", "水銀体温計"), |
| | | "ratPoison": ("老鼠药", "Rat Poison", "쥐약", "ネズミ薬"), |
| | | "capsuleBlister": ("胶囊药片底板", "Capsule Blister Pack", "캡슐 알약 팩", "カプセル・錠剤シート"), |
| | | "hairDyeCan": ("染发剂罐", "Hair Dye Can", "염색제 캔", "ヘアカラー缶"), |
| | | "energySavingBulb": ("节能灯泡", "Energy-saving Bulb", "절전 전구", "省エネ電球"), |
| | | "allExpiredMedicine": ("各类过期药品", "All Types of Expired Medicine", "각종 유통기한 지난 의약품", "各種期限切れ医薬品"), |
| | | "incandescentBulb": ("白炽灯泡", "Incandescent Bulb", "백열전구", "白熱電球"), |
| | | "phoneBattery": ("手机电池", "Phone Battery", "휴대폰 배터리", "携帯電話バッテリー"), |
| | | "disinfectantBottle": ("消毒液瓶", "Disinfectant Bottle", "소독액병", "消毒液瓶"), |
| | | "expiredTablets": ("过期药片", "Expired Tablets", "유통기한 지난 약정", "期限切れ錠剤"), |
| | | "coldMedicine": ("感冒药", "Cold Medicine", "감기약", "風邪薬"), |
| | | "disinfectant84Bottle": ("84消毒液空瓶", "Empty 84 Disinfectant Bottle", "84 소독액 빈병", "84消毒液空瓶"), |
| | | "nailPolishBottle": ("指甲油瓶", "Nail Polish Bottle", "매니큐어 병", "マニキュア瓶"), |
| | | "sprayCan": ("杀毒喷雾罐", "Spray Can", "살충 스프레이 캔", "殺虫スプレー缶"), |
| | | "photoNegative": ("相片底片", "Photo Negative", "사진 필름", "写真フィルム"), |
| | | "chinesePatentMedicine": ("中成药", "Chinese Patent Medicine", "중성 한약", "中成薬"), |
| | | "filmRoll": ("胶卷", "Film Roll", "필름 롤", "フィルムロール"), |
| | | "medicineShell": ("药品壳子", "Medicine Shell", "약 포장 껍데기", "薬の包装殻"), |
| | | "mercury": ("水银", "Mercury", "수은", "水銀"), |
| | | "photo2": ("相片", "Photo", "사진", "写真"), |
| | | "wastePaintBucket": ("废油漆桶", "Waste Paint Bucket", "폐페인트 통", "廃ペンキ缶"), |
| | | "expiredDrug": ("过期药物", "Expired Drug", "유통기한 지난 약물", "期限切れ薬物"), |
| | | "medicineBlister": ("药品铝塑板", "Medicine Blister Pack", "약 알루미늄 팩", "薬のアルミプラスチック板"), |
| | | "cockroachMedicine": ("蟑螂药", "Cockroach Medicine", "바퀴벌레 약", "ゴキブリ薬"), |
| | | "cockroachBall": ("蟑螂丸", "Cockroach Ball", "바퀴벌레 알약", "ゴキブリ丸"), |
| | | "capsuleTablet": ("胶囊药片", "Capsule and Tablet", "캡슐 알약", "カプセル・錠剤"), |
| | | "disinfectantTablet": ("消毒药片", "Disinfectant Tablet", "소독 정제", "消毒錠"), |
| | | "energySavingTube": ("节能灯管", "Energy-saving Tube", "절전 형광등관", "省エネ蛍光管"), |
| | | "melonSeedShell": ("瓜子壳", "Melon Seed Shell", "해바라기씨 껍질", "瓜子の殻"), |
| | | "eggShell": ("鸡蛋壳", "Egg Shell", "달걀껍질", "卵の殻"), |
| | | "cornCob": ("玉米棒", "Corn Cob", "옥수수대", "とうもろこしの芯"), |
| | | "eggshell": ("蛋壳", "Eggshell", "계란 껍질", "卵殻"), |
| | | "corn": ("玉米", "Corn", "옥수수", "とうもろこし"), |
| | | "walnut": ("核桃", "Walnut", "호두", "クルミ"), |
| | | "peanutShell": ("花生壳", "Peanut Shell", "땅콩 껍질", "ピーナッツの殻"), |
| | | "tea": ("茶叶", "Tea Leaves", "찻잎", "茶葉"), |
| | | "lobsterShell": ("龙虾壳", "Lobster Shell", "랍스터 껍질", "ロブスターの殻"), |
| | | "crayfish": ("小龙虾", "Crayfish", "가재", "ザリガニ"), |
| | | "crabShell": ("蟹壳", "Crab Shell", "게 껍질", "カニの殻"), |
| | | "chickenBone": ("鸡骨头", "Chicken Bone", "닭뼈", "鶏の骨"), |
| | | "melonSeed": ("瓜子", "Melon Seed", "해바라기씨", "瓜子"), |
| | | "crabShell2": ("螃蟹壳", "Crab Shell", "게 껍데기", "カニの殻"), |
| | | "cookedCornCob": ("熟玉米棒", "Cooked Corn Cob", "익힌 옥수수대", "茹でたとうもろこしの芯"), |
| | | "pistachioShell": ("开心果壳", "Pistachio Shell", "피스타치오 껍질", "ピスタチオの殻"), |
| | | "crayfishShell": ("小龙虾壳", "Crayfish Shell", "가재 껍질", "ザリガニの殻"), |
| | | "edamameShell": ("毛豆壳", "Edamame Shell", "완두콩 껍질", "枝豆の殻"), |
| | | "shrimpShell": ("霞壳", "Shrimp Shell", "새우 껍질", "エビの殻"), |
| | | "bananaPeel": ("香蕉皮", "Banana Peel", "바나나 껍질", "バナナの皮"), |
| | | "watermelonRind": ("西瓜皮", "Watermelon Rind", "수박 껍질", "スイカの皮"), |
| | | "chestnutShell": ("栗子壳", "Chestnut Shell", "밤 껍질", "栗の殻"), |
| | | "fishBone": ("鱼骨头", "Fish Bone", "생선 뼈", "魚の骨"), |
| | | "lobster": ("龙虾", "Lobster", "랍스터", "ロブスター"), |
| | | "cornCore": ("玉米芯", "Corn Core", "옥수수 심", "とうもろこし芯"), |
| | | "melonSeedPiece": ("瓜子片", "Melon Seed Piece", "해바라기씨 조각", "瓜子の破片"), |
| | | "flower": ("花", "Flower", "꽃", "花"), |
| | | "coffeeGrounds": ("咖啡渣", "Coffee Grounds", "커피 찌꺼기", "コーヒーかす"), |
| | | "porkRibs": ("排骨", "Pork Ribs", "갈비", "スペアリブ"), |
| | | "zongzi": ("粽子", "Zongzi", "종자", "ちまき"), |
| | | "herbalDregs": ("中药渣", "Herbal Medicine Dregs", "한약 찌꺼기", "漢方薬のかす"), |
| | | "egg": ("鸡蛋", "Egg", "달걀", "卵"), |
| | | "crab": ("螃蟹", "Crab", "게", "カニ"), |
| | | "lycheeShell": ("荔枝壳", "Lychee Shell", "리치 껍질", "ライチの殻"), |
| | | "peach": ("桃子", "Peach", "복숭아", "桃"), |
| | | "plumPit": ("话梅核", "Preserved Plum Pit", "화매 씨", "梅干しの核"), |
| | | "jujubePit": ("枣核", "Jujube Pit", "대추 씨", "ナツメの核"), |
| | | "chickenBone2": ("鸡骨", "Chicken Bone", "닭뼈", "鶏骨"), |
| | | "expiredFood": ("过期食品", "Expired Food", "유통기한 지난 식품", "期限切れ食品"), |
| | | "fishBone2": ("鱼骨", "Fish Bone", "생선 가시", "魚骨"), |
| | | "apple": ("苹果", "Apple", "사과", "りんご"), |
| | | "lycheePit": ("荔枝核", "Lychee Pit", "리치 씨", "ライチの核"), |
| | | "bayberry": ("杨梅", "Bayberry", "양매", "ヤマモモ"), |
| | | "watermelonSeed": ("西瓜籽", "Watermelon Seed", "수박씨", "スイカの種"), |
| | | "chestnutShell2": ("板栗壳", "Chestnut Shell", "밤 껍질", "栗の殻"), |
| | | "cockroach2": ("蟑螂", "Cockroach", "바퀴벌레", "ゴキブリ"), |
| | | "fruitPeel": ("果皮", "Fruit Peel", "과일 껍질", "果物の皮"), |
| | | "mangoPit": ("芒果核", "Mango Pit", "망고 씨", "マンゴーの核"), |
| | | "peanut": ("花生", "Peanut", "땅콩", "ピーナッツ"), |
| | | "driedPeanutShell": ("干花生壳", "Dried Peanut Shell", "말린 땅콩 껍질", "干したピーナッツの殻"), |
| | | "biscuit": ("饼干", "Biscuit", "비스킷", "ビスケット"), |
| | | "watermelon": ("西瓜", "Watermelon", "수박", "スイカ"), |
| | | "freshFlower": ("鲜花", "Fresh Flower", "생화", "生花"), |
| | | "redJujubePit": ("红枣核", "Red Jujube Pit", "대추 씨", "赤ナツメの核"), |
| | | "lusuji": ("芦稷", "Sorghum", "수수", "芦稷"), |
| | | "appleCore": ("苹果核", "Apple Core", "사과 씨", "りんごの芯"), |
| | | "waterBambooPeel": ("茭白皮", "Water Bamboo Peel", "교백피", "ザーサイの皮"), |
| | | "bread": ("面包", "Bread", "빵", "パン"), |
| | | "banana": ("香蕉", "Banana", "바나나", "バナナ"), |
| | | "teaResidue": ("茶叶渣", "Tea Residue", "찻잎 찌꺼기", "茶葉かす"), |
| | | "plasticBag": ("塑料袋", "Plastic Bag", "비닐봉지", "ビニール袋"), |
| | | "zongziLeaf": ("粽叶", "Zongzi Leaf", "종자 잎", "ちまきの葉"), |
| | | "walnutShell": ("核桃壳", "Walnut Shell", "호두 껍질", "クルミの殻"), |
| | | "hair": ("头发", "Hair", "머리카락", "髪の毛"), |
| | | "shell": ("贝壳", "Shell", "조개껍질", "貝殻"), |
| | | "sanitaryPad": ("卫生巾", "Sanitary Pad", "생리대", "生理用ナプキン"), |
| | | "condom": ("避孕套", "Condom", "콘돔", "コンドーム"), |
| | | "chewingGum": ("口香糖", "Chewing Gum", "껌", "ガム"), |
| | | "lighter": ("打火机", "Lighter", "라이터", "ライター"), |
| | | "coconutShell": ("椰子壳", "Coconut Shell", "코코넛 껍질", "ココナッツの殻"), |
| | | "catLitter": ("猫砂", "Cat Litter", "고양이 모래", "猫砂"), |
| | | "faceMask": ("面膜", "Face Mask", "마스크팩", "フェイスマスク"), |
| | | "tissue": ("餐巾纸", "Tissue Paper", "냅킨", "ナプキン"), |
| | | "bigBone": ("大骨头", "Big Bone", "큰 뼈", "大きな骨"), |
| | | "milkTeaCup": ("奶茶杯", "Milk Tea Cup", "밀크티 컵", "タピオカティーカップ"), |
| | | "paperTowel": ("纸巾", "Paper Towel", "휴지", "ティッシュ"), |
| | | "clamShell": ("蛤蜊壳", "Clam Shell", "조개 껍질", "アサリの殻"), |
| | | "zongziLeaf2": ("粽子叶", "Zongzi Leaf", "종자 잎", "ちまきの葉"), |
| | | "cornHusk": ("玉米皮", "Corn Husk", "옥수수 껍질", "とうもろこしの皮"), |
| | | "straw": ("吸管", "Straw", "빨대", "ストロー"), |
| | | "teaBag": ("茶包", "Tea Bag", "티백", "ティーバッグ"), |
| | | "sugarcanePeel": ("甘蔗皮", "Sugarcane Peel", "사탕수수 껍질", "サトウキビの皮"), |
| | | "desiccant": ("干燥剂", "Desiccant", "건조제", "乾燥剤"), |
| | | "disposableChopsticks": ("一次性筷子", "Disposable Chopsticks", "일회용 젓가락", "使い捨て箸"), |
| | | "cornShell": ("玉米壳", "Corn Shell", "옥수수 껍데기", "とうもろこしの殻"), |
| | | "cigarette": ("烟蒂", "Cigarette Butt", "담배꽁초", "吸い殻"), |
| | | "wetWipe": ("湿纸巾", "Wet Wipe", "물티슈", "ウェットティッシュ"), |
| | | "durianShell": ("榴莲壳", "Durian Shell", "두리안 껍질", "ドリアンの殻"), |
| | | "toiletPaper": ("卫生纸", "Toilet Paper", "화장지", "トイレットペーパー"), |
| | | "bigWalnutShell": ("大核桃壳", "Big Walnut Shell", "큰 호두 껍질", "大きなクルミの殻"), |
| | | "nail": ("指甲", "Nail", "손톱", "爪"), |
| | | "packagingBag": ("包装袋", "Packaging Bag", "포장봉지", "包装袋"), |
| | | "lipstick": ("口红", "Lipstick", "립스틱", "口紅"), |
| | | "disposableCup": ("一次性杯子", "Disposable Cup", "일회용 컵", "使い捨てカップ"), |
| | | "snailShell": ("螺蛳壳", "Snail Shell", "골뱅이 껍질", "巻き貝の殻"), |
| | | "toothbrush": ("牙刷", "Toothbrush", "칫솔", "歯ブラシ"), |
| | | "takeoutBox": ("外卖餐盒", "Takeout Box", "배달 용기", "テイクアウト容器"), |
| | | "durian": ("榴莲", "Durian", "두리안", "ドリアン"), |
| | | "diaper": ("尿不湿", "Diaper", "기저귀", "おむつ"), |
| | | "trashBag": ("垃圾袋", "Trash Bag", "쓰레기봉지", "ゴミ袋"), |
| | | "toothpasteTube": ("牙膏皮", "Toothpaste Tube", "치약 튜브", "歯磨きチューブ"), |
| | | "icePack": ("冰袋", "Ice Pack", "아이스팩", "保冷剤"), |
| | | "sock": ("袜子", "Sock", "양말", "靴下"), |
| | | "pen": ("笔", "Pen", "펜", "ペン"), |
| | | "diaper2": ("纸尿裤", "Diaper", "기저귀", "紙おむつ"), |
| | | "durianPit": ("榴莲核", "Durian Pit", "두리안 씨", "ドリアンの種"), |
| | | "disposableLunchBox": ("一次性餐盒", "Disposable Lunch Box", "일회용 도시락통", "使い捨て弁当箱"), |
| | | "teaBag2": ("茶叶包", "Tea Bag", "찻잎 티백", "茶葉パック"), |
| | | "mask": ("口罩", "Mask", "마스크", "マスク"), |
| | | "underwear": ("内裤", "Underwear", "속옷", "下着"), |
| | | "towel": ("毛巾", "Towel", "수건", "タオル"), |
| | | "diaper3": ("尿布", "Diaper", "기저귀", "おむつ"), |
| | | "ceramicBowl": ("陶瓷碗", "Ceramic Bowl", "도자기 그릇", "陶器の碗"), |
| | | "penRefill": ("笔芯", "Pen Refill", "펜심", "ペン芯"), |
| | | "dirtyPlasticBag": ("肮脏塑料袋", "Dirty Plastic Bag", "더러운 비닐봉지", "汚れたビニール袋"), |
| | | "paperClip": ("回形针", "Paper Clip", "클립", "クリップ"), |
| | | "toothpick": ("牙签", "Toothpick", "이쑤시개", "爪楊枝"), |
| | | "foodPackagingBag": ("食品包装袋", "Food Packaging Bag", "식품 포장봉지", "食品包装袋"), |
| | | "watercolorPen": ("水彩笔", "Watercolor Pen", "물감펜", "水彩ペン"), |
| | | "cottonSwab": ("棉签", "Cotton Swab", "면봉", "綿棒"), |
| | | } |
| | | |
| | | # Map Chinese name -> key_suffix |
| | | ZH_TO_KEY = {v[0]: k for k, v in TRANSLATIONS.items()} |
| | | |
| | | def slug_from_zh(zh, category, index): |
| | | if zh in ZH_TO_KEY: |
| | | return ZH_TO_KEY[zh] |
| | | # fallback: category prefix + index |
| | | return f"{category}{index:03d}" |
| | | |
| | | def build_items(): |
| | | items = [] |
| | | for category_id, names in [ |
| | | ("recyclable", RECYCLABLE), |
| | | ("hazardous", HAZARDOUS), |
| | | ("wet", WET), |
| | | ("dry", DRY), |
| | | ]: |
| | | for i, zh in enumerate(names): |
| | | key_suffix = slug_from_zh(zh, category_id, i) |
| | | if key_suffix not in TRANSLATIONS: |
| | | TRANSLATIONS[key_suffix] = (zh, zh, zh, zh) # placeholder |
| | | key = f"item.{key_suffix}" |
| | | item_id = re.sub(r'(?<!^)(?=[A-Z])', '-', key_suffix).lower() |
| | | items.append({ |
| | | "id": item_id, |
| | | "nameKey": key, |
| | | "categoryId": category_id |
| | | }) |
| | | return items |
| | | |
| | | def load_zh_base(): |
| | | with open(os.path.join(BASE, "config", "i18n", "zh.json"), encoding="utf-8") as f: |
| | | return json.load(f) |
| | | |
| | | def build_lang_file(base_zh, lang_index): |
| | | result = {} |
| | | for k, v in base_zh.items(): |
| | | if k.startswith("item."): |
| | | suffix = k[5:] # strip "item." |
| | | if suffix in TRANSLATIONS: |
| | | result[k] = TRANSLATIONS[suffix][lang_index] |
| | | else: |
| | | result[k] = v |
| | | elif k == "lang.ja": |
| | | result[k] = ["", "日本語", "日本語", "日本語"][lang_index] |
| | | elif k == "lang.zh": |
| | | result[k] = ["中文", "Chinese", "중국어", "中国語"][lang_index] |
| | | elif k == "lang.en": |
| | | result[k] = ["English", "English", "영어", "英語"][lang_index] |
| | | elif k == "lang.ko": |
| | | result[k] = ["한국어", "Korean", "한국어", "韓国語"][lang_index] |
| | | else: |
| | | # UI strings - translate from updated zh.json |
| | | result[k] = translate_ui(k, v, lang_index) |
| | | return result |
| | | |
| | | def translate_ui(key, zh_val, lang_index): |
| | | UI = { |
| | | "page.title": ("上海市垃圾分类查询", "Shanghai Waste Sorting Guide", "상하이 쓰레기 분류 조회", "上海市ゴミ分別ガイド"), |
| | | "header.title": ("上海市日常生活垃圾怎么分?", "How to Sort Daily Waste in Shanghai?", "상하이 생활 쓰레기, 어떻게 분류할까요?", "上海市の生活ゴミはどう分別する?"), |
| | | "btn.home": ("首页", "Home", "홈", "ホーム"), |
| | | "btn.query": ("查询", "Search", "조회", "検索"), |
| | | "btn.voice": ("长按语音", "Hold to Speak", "길게 눌러 음성", "長押し音声"), |
| | | "btn.standard": ("投放标准", "Disposal Rules", "배출 기준", "排出基準"), |
| | | "btn.home.short": ("首页", "Home", "홈", "ホーム"), |
| | | "search.placeholder": ("输入垃圾名称", "Enter waste name", "쓰레기 이름 입력", "ゴミの名前を入力"), |
| | | "search.notFoundHint": ("我找不到你想要的,看看下面这些可以吗?", "I couldn't find an exact match. How about these?", "원하시는 항목을 찾지 못했습니다. 아래 항목은 어떠세요?", "お探しの項目が見つかりませんでした。以下はいかがですか?"), |
| | | "search.referenceHint": ("请参考以下分类信息。", "Please refer to the following categories.", "아래 분류 정보를 참고해 주세요.", "以下の分類情報をご参照ください。"), |
| | | "search.noResults": ("未找到相关垃圾,请尝试其他关键词。", "No results found. Please try another keyword.", "관련 항목을 찾을 수 없습니다. 다른 키워드를 시도해 보세요.", "関連する項目が見つかりません。別のキーワードをお試しください。"), |
| | | "footer.copyright": ("上海京申 Copyright © 2026", "Shanghai Jingshen Copyright © 2026", "상하이 징션 Copyright © 2026", "上海京申 Copyright © 2026"), |
| | | "welcome.title": ("温馨提示", "Friendly Reminder", "안내 말씀", "ご案内"), |
| | | "welcome.p1": ("1、请输入垃圾正常的中文名称(包含材质),如玻璃瓶,一次性塑料杯、陶瓷碗等。", "1. Please enter the standard Chinese name of the waste (including material), such as glass bottle, disposable plastic cup, ceramic bowl, etc.", "1. 쓰레기의 정상적인 중국어 이름(재질 포함)을 입력하세요. 예: 유리병, 일회용 플라스틱 컵, 도자기 그릇 등.", "1. ゴミの正式な中国語名称(材質を含む)を入力してください。例:ガラス瓶、使い捨てプラスチックカップ、陶器の碗など。"), |
| | | "welcome.p2": ("2、生活垃圾分类的具体分类标准:是根据经济社会发展水平、生活垃圾特性和处理利用方法予以细化调整的。", "2. The specific classification standards for household waste sorting are refined and adjusted based on economic and social development, waste characteristics, and treatment methods.", "2. 생활 쓰레기 분류의 구체적인 기준은 경제·사회 발전 수준, 생활 쓰레기 특성 및 처리·이용 방법에 따라 세분화·조정됩니다.", "2. 生活ゴミ分類の具体的基準は、経済社会発展水準、生活ゴミの特性、処理・利用方法に基づいて細分化・調整されます。"), |
| | | "welcome.p3": ("3、本查询系统仅供参考,具体分类要求以属地专业管理部门为准。", "3. This query system is for reference only. Please follow the requirements of local professional management authorities.", "3. 본 조회 시스템은 참고용이며, 구체적인 분류 요건은 관할 전문 관리 부서 기준을 따릅니다.", "3. 本検索システムは参考用です。具体的な分類要件は管轄の専門管理部門の基準に従ってください。"), |
| | | "welcome.confirm": ("知道了", "Got it", "알겠습니다", "了解"), |
| | | "disposal.suggestLabel": ("建议投放至:", "Suggested disposal to:", "배출 권장:", "排出先:"), |
| | | "disposal.tipsTitle": ("小科普", "Did You Know?", "알아두세요", "豆知識"), |
| | | "cat.recyclable": ("可回收物", "Recyclables", "재활용품", "資源ごみ"), |
| | | "cat.recyclable.desc": ("是指废纸张、废塑料、废玻璃制品、废金属、废织物等适宜回收、可循环利用的生活废弃物。", "Waste paper, waste plastic, waste glass products, waste metal, waste textiles and other household waste suitable for recycling and reuse.", "폐지, 폐플라스틱, 폐유리 제품, 폐금속, 폐직물 등 재활용 및 순환 이용이 가능한 생활 폐기물을 말합니다.", "廃紙、廃プラスチック、廃ガラス製品、廃金属、廃繊維など、リサイクル・再利用に適した生活廃棄物を指します。"), |
| | | "cat.recyclable.standard": ("1. 轻投轻放\n2. 清洁干燥,避免污染。\n3. 废纸类尽量平整,保持干燥。\n4. 塑料类应去除残留物,洗净晾干。\n5. 立体包装物请清空内容物,清洁后压扁投放 \n6. 有尖锐边角的,应包裹后投放。\n7. 金属类应去除残留物,压扁后投放。\n8. 织物类应洗净晾干,折叠整齐。", "1. Handle gently.\n2. Keep clean and dry to avoid contamination.\n3. Paper should be flat and dry.\n4. Plastic should be rinsed and dried.\n5. Empty and clean 3D packaging, then flatten.\n6. Wrap items with sharp edges.\n7. Metal should be rinsed and flattened.\n8. Textiles should be washed, dried, and folded.", "1. 가볍게 넣으세요.\n2. 깨끗하고 건조하게, 오염을 피하세요.\n3. 종이는 평평하게, 건조하게 유지하세요.\n4. 플라스틱은 잔여물을 제거하고 헹구어 말리세요.\n5. 입체 포장은 내용물을 비우고 청소 후 눌러서 배출하세요.\n6. 날카로운 모서리는 감싸서 배출하세요.\n7. 금속은 잔여물을 제거하고 눌러서 배출하세요.\n8. 직물은 세탁 후 말리고 접어서 배출하세요.", "1. 軽く入れてください。\n2. 清潔で乾燥した状態を保ち、汚染を避けてください。\n3. 紙類はできるだけ平らに、乾燥させてください。\n4. プラスチック類は残置物を取り除き、洗って乾かしてください。\n5. 立体包装は中身を空にし、清掃後に潰して排出してください。\n6. 鋭い角があるものは包んで排出してください。\n7. 金属類は残置物を取り除き、潰して排出してください。\n8. 繊維類は洗って乾かし、たたんで排出してください。"), |
| | | "cat.hazardous": ("有害垃圾", "Hazardous Waste", "유해 쓰레기", "有害ごみ"), |
| | | "cat.hazardous.desc": ("对人体健康或自然环境造成直接或潜在危害的生活废弃物。主要包括:废电池、废灯管、废药品、废油漆及其容器等。", "Household waste that poses direct or potential harm to human health or the natural environment, including waste batteries, light tubes, medicine, paint and containers.", "인체 건강이나 자연 환경에 직접 또는 잠재적 위해를 줄 수 있는 생활 폐기물. 폐배터리, 폐등관, 폐의약품, 폐페인트 및 용기 등이 포함됩니다.", "人体の健康や自然環境に直接的または潜在的な危害を及ぼす生活廃棄物。廃電池、廃灯管、廃薬品、廃ペンキとその容器などが含まれます。"), |
| | | "cat.hazardous.standard": ("1. 有害垃圾应轻放,易破损的应包裹后投放\n2. 废电池应保持完整,不要拆解\n3. 废灯管应防止破碎,用纸张包裹后投放\n4. 废药品应连同包装一起投放\n5. 废油漆桶应密封后投放\n6. 投放时应注意安全,避免泄漏\n7. 如易挥发,请密封后投放", "1. Handle hazardous waste gently; wrap fragile items.\n2. Keep batteries intact.\n3. Wrap light tubes to prevent breakage.\n4. Dispose medicine with packaging.\n5. Seal paint cans.\n6. Ensure safety, avoid leaks.\n7. Seal volatile items before disposal.", "1. 유해 쓰레기는 가볍게, 깨지기 쉬운 것은 감싸서 배출하세요.\n2. 폐배터리는 분해하지 말고 온전하게 유지하세요.\n3. 폐등관은 깨지지 않도록 종이로 감싸세요.\n4. 폐의약품은 포장과 함께 배출하세요.\n5. 폐페인트 통은 밀봉하세요.\n6. 안전에 유의하고 누출을 피하세요.\n7. 휘발성 물질은 밀봉 후 배출하세요.", "1. 有害ごみは軽く入れ、壊れやすいものは包んで排出してください。\n2. 廃電池は分解せず、完全な状態を保ってください。\n3. 廃灯管は割れないよう紙で包んで排出してください。\n4. 廃薬品は包装と一緒に排出してください。\n5. 廃ペンキ缶は密封してください。\n6. 安全に注意し、漏れを避けてください。\n7. 揮発性のものは密封して排出してください。"), |
| | | "cat.wet": ("湿垃圾", "Wet Waste", "습식 쓰레기", "湿ったごみ"), |
| | | "cat.wet.desc": ("即易腐垃圾、易腐的生活物质和生活废弃物。主要包括:食材废料、剩菜剩饭、过期食品、瓜皮果核、花卉绿植、中药药渣等。", "Perishable household waste including food scraps, leftovers, expired food, fruit peels, flowers, and herbal dregs.", "부패하기 쉬운 생활 물질 및 폐기물. 식재료 찌꺼기, 남은 음식, 유통기한 지난 식품, 과일 껍질·씨, 화초, 한약 찌꺼기 등이 포함됩니다.", "腐りやすい生活物質・生活廃棄物。食材くず、残り物、期限切れ食品、果物の皮・核、花、漢方薬のかすなどが含まれます。"), |
| | | "cat.wet.standard": ("1. 湿垃圾应沥干水分后投放\n2. 纯流质的食物垃圾,如牛奶等,应直接倒入下水口\n3. 有包装物的湿垃圾应将包装物去除后分类投放\n4. 大骨头、贝壳类应作为干垃圾投放\n5. 餐厨垃圾应去除杂物后投放", "1. Drain water before disposal.\n2. Pure liquids should go down the drain.\n3. Remove packaging from wet waste.\n4. Large bones and shells go in dry waste.\n5. Remove debris from kitchen waste.", "1. 물기를 제거한 후 배출하세요.\n2. 순수 액체는 하수구에 버리세요.\n3. 포장이 있는 습식 쓰레기는 포장을 제거하세요.\n4. 큰 뼈, 조개껍질은 건식 쓰레기로 배출하세요.\n5. 음식물 쓰레기는 이물질을 제거하세요.", "1. 水切りしてから排出してください。\n2. 純粋な液体は排水口に流してください。\n3. 包装がある湿ったごみは包装を外してください。\n4. 大きな骨、貝殻類は乾いたごみとして排出してください。\n5. 厨余ごみは異物を取り除いて排出してください。"), |
| | | "cat.dry": ("干垃圾", "Dry Waste", "건식 쓰레기", "乾いたごみ"), |
| | | "cat.dry.desc": ("除可回收物、有害垃圾、湿垃圾以外的其他生活废弃物。", "Other household waste that is not recyclable, hazardous, or wet waste.", "재활용품, 유해 쓰레기, 습식 쓰레기 외의 기타 생활 폐기물.", "資源ごみ、有害ごみ、湿ったごみ以外のその他の生活廃棄物。"), |
| | | "cat.dry.standard": ("1. 尽量沥干水分后投放\n2. 难以辨识类别的生活垃圾应投入干垃圾容器\n3. 体积较大的垃圾应适当分解后投放\n4. 一次性餐具、纸巾等应作为干垃圾投放\n5. 烟蒂应完全熄灭后投放", "1. Drain water when possible.\n2. Hard-to-classify waste goes in dry waste.\n3. Break down large items.\n4. Disposable utensils and tissues are dry waste.\n5. Extinguish cigarette butts completely.", "1. 가능하면 물기를 제거하세요.\n2. 분류가 어려운 생활 쓰레기는 건식 쓰레기에 배출하세요.\n3. 부피가 큰 쓰레기는 분해하세요.\n4. 일회용 식기, 휴지는 건식 쓰레기입니다.\n5. 담배꽁초는 완전히 끈 후 배출하세요.", "1. できるだけ水切りしてください。\n2. 分類が難しい生活ごみは乾いたごみ容器に入れてください。\n3. 体積の大きいごみは適切に分解してください。\n4. 使い捨て食器、ティッシュは乾いたごみです。\n5. 吸い殻は完全に消してから排出してください。"), |
| | | "disposal.suggest.recyclable": ("可回收物", "Recyclables", "재활용품", "資源ごみ"), |
| | | "disposal.line1.recyclable": ("请保持清洁干燥,避免污染。", "Keep clean and dry to avoid contamination.", "깨끗하고 건조한 상태로 오염을 피해 주세요.", "清潔で乾燥した状態を保ち、汚染を避けてください。"), |
| | | "disposal.line2.recyclable": ("投放前请去除残留物,压扁减容。", "Remove residue and flatten before disposal.", "배출 전 잔여물을 제거하고 눌러 부피를 줄여 주세요.", "排出前に残置物を取り除き、潰して容積を減らしてください。"), |
| | | "disposal.tip1.recyclable": ("可回收物经回收处理后,可重新制成新的产品,节约资源。", "Recyclables can be processed into new products, saving resources.", "재활용품은 재처리되어 새로운 제품으로 만들어져 자원을 절약합니다.", "資源ごみはリサイクル処理により新しい製品に再生され、資源を節約します。"), |
| | | "disposal.tip2.recyclable": ("1个塑料瓶回收后可节省足够点亮60瓦灯泡3小时的电能。", "Recycling one plastic bottle saves enough energy to power a 60W bulb for 3 hours.", "플라스틱병 1개를 재활용하면 60W 전구를 3시간 켤 수 있는 전력을 절약합니다.", "プラスチックボトル1本のリサイクルで60W電球を3時間点灯できる電力を節約できます。"), |
| | | "disposal.tip3.recyclable": ("回收1吨废纸可节省17棵树。", "Recycling one ton of paper saves 17 trees.", "종이 1톤을 재활용하면 나무 17그루를 절약할 수 있습니다.", "紙1トンのリサイクルで17本の木を節約できます。"), |
| | | "disposal.tip4.recyclable": ("垃圾分类从点滴做起,让资源循环利用。", "Every small act of sorting helps the circular economy.", "작은 분류 실천이 자원 순환에 큰 도움이 됩니다.", "ゴミ分別は小さな実践から。資源の循環利用につなげましょう。"), |
| | | "disposal.suggest.hazardous": ("有害垃圾", "Hazardous Waste", "유해 쓰레기", "有害ごみ"), |
| | | "disposal.line1.hazardous": ("请轻放,易破损的应包裹后投放。", "Handle gently; wrap fragile items before disposal.", "가볍게 넣고, 깨지기 쉬운 것은 감싸서 배출하세요.", "軽く入れ、壊れやすいものは包んで排出してください。"), |
| | | "disposal.line2.hazardous": ("废电池、废灯管等应保持完整,不要拆解。", "Batteries and light tubes should remain intact.", "폐배터리, 폐등관 등은 분해하지 말고 온전하게 유지하세요.", "廃電池、廃灯管などは分解せず、完全な状態を保ってください。"), |
| | | "disposal.tip1.hazardous": ("有害垃圾含有对人体健康或环境有害的物质,需特殊处理。", "Hazardous waste contains harmful substances requiring special treatment.", "유해 쓰레기에는 건강과 환경에 해로운 물질이 포함되어 특별 처리가 필요합니다.", "有害ごみには健康や環境に有害な物質が含まれ、特別な処理が必要です。"), |
| | | "disposal.tip2.hazardous": ("1节废电池随意丢弃,可能污染1平方米土地50年。", "One discarded battery can contaminate 1 m² of land for 50 years.", "폐배터리 1개를 무작위로 버리면 1㎡ 토양을 50년간 오염시킬 수 있습니다.", "廃電池1個を無造作に捨てると1㎡の土地を50年間汚染する可能性があります。"), |
| | | "disposal.tip3.hazardous": ("废荧光灯管含有汞,破碎后会污染空气和土壤。", "Fluorescent tubes contain mercury; breakage pollutes air and soil.", "폐형광등에는 수은이 들어 있어 깨지면 공기와 토양을 오염시킵니다.", "廃蛍光灯管には水銀が含まれ、割れると空気と土壌を汚染します。"), |
| | | "disposal.tip4.hazardous": ("正确投放有害垃圾,保护我们的健康与环境。", "Proper disposal protects our health and environment.", "올바른 유해 쓰레기 배출은 건강과 환경을 보호합니다.", "有害ごみを正しく排出することで、健康と環境を守ります。"), |
| | | "disposal.suggest.wet": ("湿垃圾", "Wet Waste", "습식 쓰레기", "湿ったごみ"), |
| | | "disposal.line1.wet": ("请沥干水分后投放,纯流质应倒入下水口。", "Drain water before disposal; pour pure liquids down the drain.", "물기를 제거한 후 배출하고, 순수 액체는 하수구에 버리세요.", "水切りしてから排出し、純粋な液体は排水口に流してください。"), |
| | | "disposal.line2.wet": ("有包装物的湿垃圾应去除包装后分类投放。", "Remove packaging from wet waste before sorting.", "포장이 있는 습식 쓰레기는 포장을 제거한 후 분류하세요.", "包装がある湿ったごみは包装を外してから分別してください。"), |
| | | "disposal.tip1.wet": ("湿垃圾经生化处理后可转化为有机肥料。", "Wet waste can be composted into organic fertilizer.", "습식 쓰레기는 생화학 처리를 통해 유기 비료로 전환될 수 있습니다.", "湿ったごみは生化学処理により有機肥料に転換できます。"), |
| | | "disposal.tip2.wet": ("上海每天产生的湿垃圾约1万吨,正确分类意义重大。", "Shanghai generates about 10,000 tons of wet waste daily.", "상하이는 하루 약 1만 톤의 습식 쓰레기를 배출합니다. 올바른 분류가 중요합니다.", "上海では毎日約1万トンの湿ったごみが発生します。正しい分別が重要です。"), |
| | | "disposal.tip3.wet": ("湿垃圾投放前应尽量沥干,减少渗滤液产生。", "Draining wet waste reduces leachate during processing.", "배출 전 물기를 충분히 제거하면 침출수 발생을 줄일 수 있습니다.", "排出前に水切りを十分に行うと、浸出液の発生を減らせます。"), |
| | | "disposal.tip4.wet": ("剩菜剩饭变废为宝,助力资源循环利用。", "Food scraps can become valuable resources through composting.", "음식 찌꺼기도 자원 순환의 소중한 재료가 될 수 있습니다.", "残り物も資源循環の貴重な材料になります。"), |
| | | "disposal.suggest.dry": ("干垃圾", "Dry Waste", "건식 쓰레기", "乾いたごみ"), |
| | | "disposal.line1.dry": ("请尽量沥干水分后投放。", "Drain water when possible before disposal.", "가능하면 물기를 제거한 후 배출하세요.", "できるだけ水切りしてから排出してください。"), |
| | | "disposal.line2.dry": ("难以辨识类别的生活垃圾应投入干垃圾。", "Hard-to-classify waste should go in dry waste.", "분류가 어려운 생활 쓰레기는 건식 쓰레기에 배출하세요.", "分類が難しい生活ごみは乾いたごみに入れてください。"), |
| | | "disposal.tip1.dry": ("干垃圾主要通过焚烧或填埋方式处理。", "Dry waste is mainly processed by incineration or landfill.", "건식 쓰레기는 주로 소각 또는 매립으로 처리됩니다.", "乾いたごみは主に焼却または埋立で処理されます。"), |
| | | "disposal.tip2.dry": ("减少干垃圾产生,从源头做好垃圾分类。", "Reduce dry waste at the source through better sorting.", "건식 쓰레기를 줄이려면 분류를 생활화하는 것이 중요합니다.", "乾いたごみを減らすには、分別を生活化することが重要です。"), |
| | | "disposal.tip3.dry": ("纸巾、烟蒂、一次性餐具等都属于干垃圾。", "Tissues, cigarette butts, and disposable utensils are dry waste.", "휴지, 담배꽁초, 일회용 식기 등은 건식 쓰레기입니다.", "ティッシュ、吸い殻、使い捨て食器などは乾いたごみです。"), |
| | | "disposal.tip4.dry": ("垃圾分类,让城市更美丽。", "Better sorting makes our city more beautiful.", "쓰레기 분류로 더 아름다운 도시를 만들어 갑시다.", "ゴミ分別で、より美しい都市を作りましょう。"), |
| | | } |
| | | if key in UI: |
| | | return UI[key][lang_index] |
| | | return zh_val |
| | | |
| | | def main(): |
| | | base_zh = load_zh_base() |
| | | items = build_items() |
| | | |
| | | # Update zh.json items |
| | | new_zh = {k: v for k, v in base_zh.items() if not k.startswith("item.")} |
| | | new_zh["lang.ja"] = "日本語" |
| | | for item in items: |
| | | suffix = item["nameKey"][5:] |
| | | new_zh[item["nameKey"]] = TRANSLATIONS[suffix][0] |
| | | |
| | | with open(os.path.join(BASE, "config", "items.json"), "w", encoding="utf-8") as f: |
| | | json.dump(items, f, ensure_ascii=False, indent=2) |
| | | f.write("\n") |
| | | |
| | | with open(os.path.join(BASE, "config", "i18n", "zh.json"), "w", encoding="utf-8") as f: |
| | | json.dump(new_zh, f, ensure_ascii=False, indent=2) |
| | | f.write("\n") |
| | | |
| | | for lang, idx, fname in [("en", 1, "en.json"), ("ko", 2, "ko.json"), ("ja", 3, "ja.json")]: |
| | | lang_data = build_lang_file(new_zh, idx) |
| | | with open(os.path.join(BASE, "config", "i18n", fname), "w", encoding="utf-8") as f: |
| | | json.dump(lang_data, f, ensure_ascii=False, indent=2) |
| | | f.write("\n") |
| | | |
| | | print(f"Generated {len(items)} items") |
| | | print(f"Recyclable: {len(RECYCLABLE)}, Hazardous: {len(HAZARDOUS)}, Wet: {len(WET)}, Dry: {len(DRY)}") |
| | | |
| | | # verify all names mapped |
| | | all_names = RECYCLABLE + HAZARDOUS + WET + DRY |
| | | missing = [n for n in all_names if n not in ZH_TO_KEY] |
| | | if missing: |
| | | print("WARNING missing translations:", missing) |
| | | |
| | | if __name__ == "__main__": |
| | | main() |