main
伟健 2 months ago
commit e7f61a6c6e

@ -0,0 +1,34 @@
FROM golang:1.20-alpine as build
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk --no-cache add tzdata \
&& apk --no-cache add ca-certificates \
&& update-ca-certificates
#设置 GO 环境变量
ENV CGO_ENABLED=0
ENV GO111MODULE=on
ENV GOPROXY=https://mirrors.aliyun.com/goproxy/
ENV GOPRIVATE=gits.branchcn.com/backend
WORKDIR /joybuywork
COPY . .
RUN go build -o joybuywork ./cmd/joybuywork/joybuywork.go
FROM scratch as final
# 设置时区为上海
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ=Asia/Shanghai
COPY --from=build /joybuywork/joybuywork /
COPY --from=build /joybuywork/asset/ /asset/
COPY --from=build /joybuywork/etc/ /etc/
COPY --from=build /joybuywork/tmp/ /tmp/
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT [ "/joybuywork", "-env" ]
CMD ["prod"]

@ -0,0 +1,24 @@
# 构建
FROM go_base_image:latest as build
# 设置工作目录
WORKDIR /joybuywork
COPY . .
RUN go build -o joybuywork ./cmd/joybuywork/joybuywork.go
FROM scratch as final
# 设置时区为上海
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ=Asia/Shanghai
COPY --from=build /joybuywork/joybuywork /
COPY --from=build /joybuywork/asset/ /asset/
COPY --from=build /joybuywork/etc/ /etc/
COPY --from=build /joybuywork/tmp/ /tmp/
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT [ "/joybuywork", "-env" ]
CMD ["prod"]

@ -0,0 +1,62 @@
gopath:=$(shell go env gopath)
.phony: all
all:
@echo "hello world!"
.phony: microg
microg:
go install gits.branchcn.com/backend/microcode/microg@upgrade
#启动环境
.phony: run
run:
@go run cmd/joybuywork/joybuywork.go -env=dev
#启动环境
.phony: build
build:
@go build -o main ./cmd/joybuywork/joybuywork.go
#启动环境
.phony: vet
vet:
@go vet cmd/joybuywork/joybuywork.go
.phony: docker-run
docker-run:
docker build -f dockerfile-local -t joybuywork/v1 . && docker run --name joybuywork -d joybuywork/v1
.phony: pkg
pkg:
@go get gits.branchcn.com/backend/microcode/plugins
.phony: deeplink
deeplink:
@go get gits.branchcn.com/backend/deeplink/proto/go_proto
.phony: ct
ct:
@go get gits.branchcn.com/backend/certified/proto/go_proto
.phony: bi
bi:
@echo go get gits.branchcn.com/backend/fissionbi/proto/go_proto
@go get gits.branchcn.com/backend/fissionbi/proto/go_proto
.phony: bq
bq:
@echo go run tools/bqueue/main.go -t=$(t) -k=$(k)
@go run tools/bqueue/main.go -t=$(t) -k=$(k)
.phony: op
op:
go get gits.branchcn.com/backend/oplatform/proto/go_proto
.phony: ai
ai:
@go get gits.branchcn.com/backend/deepai/proto/go_proto
.phony: tc
tc:
go get gits.branchcn.com/backend/taskcenter/proto/go_proto

@ -0,0 +1,3 @@
# joybuywork
系统业务工作服

@ -0,0 +1,892 @@
{
"accounts": {
"test": "ca-pub-2821871715805907",
"prod": "ca-pub-2821871715805907"
},
"webs": [
{
"host": "https://moads-test.allapp.link",
"uris": [
{
"uri": "/article/bloober-team-reveals-how-long-it-will-take-to-beat-silent-hill-2-remake"
},
{
"uri": "/article/dc-chronicles-black-canarys-toughest-battle-ever-in-best-of-the-best"
},
{
"uri": "/article/disney-tweets-then-deletes-video-featuring-first-looks-at-daredevil-red-hulk-ironheart-and-more"
},
{
"uri": "/article/exclusive-amazon-games-boss-says-lord-of-the-rings-mmo-still-early-calls-tomb-raider-a-huge-huge-task"
},
{
"uri": "/article/former-zelda-directorled-open-world-dress-up-rpg-infinity-nikki-hits-12-million-preregistrations"
},
{
"uri": "/article/george-rr-martin-asked-what-hed-change-about-game-of-thrones-books-id-have-them-finished"
},
{
"uri": "/article/guillermo-del-toro-is-livetweeting-his-beef-with-a-ghost-in-a-haunted-hotel-in-scotland"
},
{
"uri": "/article/how-datamining-has-changed-the-landscape-of-video-game-puzzle-and-secret-design"
},
{
"uri": "/article/how-teenage-mutant-ninja-turtles-x-naruto-combines-two-legendary-ninja-universes"
},
{
"uri": "/article/how-the-lord-of-the-rings-the-war-of-the-rohirrim-connects-to-the-other-movies"
},
{
"uri": "/article/how-to-follow-the-complete-dragon-age-timeline"
},
{
"uri": "/article/ign-plus-games-claim-a-free-weapon-of-choice-dx-steam-key"
},
{
"uri": "/article/in-black-myth-wukong-you-can-summon-one-boss-to-beat-another-boss-while-basically-doing-nothing"
},
{
"uri": "/article/jack-black-and-paul-rudd-in-talks-to-star-in-a-new-anaconda-movie-report"
},
{
"uri": "/article/joker-director-todd-phillips-says-hulk-hogan-biopic-with-chris-hemsworth-no-longer-happening"
},
{
"uri": "/article/legacy-of-kain-soul-reaver-the-dead-shall-rise-reveals-official-trailer"
},
{
"uri": "/article/microsoft-announces-october-release-date-for-alldigital-xbox-series-x"
},
{
"uri": "/article/microsoft-expands-on-xbox-adaptive-controller-with-new-joystick-peripheral"
},
{
"uri": "/article/new-tomb-raider-statue-captures-lara-croft-in-action"
},
{
"uri": "/article/power-rangers-prime-is-a-new-beginning-for-the-franchise"
},
{
"uri": "/article/sid-meiers-civilization-7-heres-what-comes-in-each-edition"
},
{
"uri": "/article/the-art-of-dragon-age-the-veilguard-revealed-by-dark-horse"
},
{
"uri": "/article/the-deathadder-v3-hyperspeed-proves-why-razers-flagship-mouse-still-rules"
},
{
"uri": "/article/the-golem-of-venice-beach-unites-superstar-comic-book-artists-for-explosive-finale"
},
{
"uri": "/article/the-lord-of-the-rings-the-war-of-the-rohirrim-animated-movie-reveals-first-trailer"
},
{
"uri": "/business/amazon-games-ceo-thinks-genai-can-help-make-better-ideas-for-games"
},
{
"uri": "/business/animal-crossing-pocket-camp-is-shutting-down-in-november-then-reopening-as-a-paid-game"
},
{
"uri": "/business/atari-ceo-wants-infogrames-to-become-the-ultimate-preservationist-publisher"
},
{
"uri": "/business/backyard-sports-is-back-after-an-extended-offseason-via-playground-productions"
},
{
"uri": "/business/behind-the-gdc-scenes-with-beth-elderkin-and-sam-warnke-game-developer-podcast-ep-43"
},
{
"uri": "/business/black-myth-wukong-has-sold-10-million-copies-worldwide"
},
{
"uri": "/business/black-myth-wukong-opens-to-22-million-steam-players"
},
{
"uri": "/business/cma-closes-yearslong-investigation-into-apples-inapp-payments"
},
{
"uri": "/business/call-of-duty-uncouples-warzone-from-annual-schedule-with-platform-overhaul"
},
{
"uri": "/business/cyberpunk-and-phantom-liberty-remain-big-drivers-behind-cd-projekts-revenue-growth"
},
{
"uri": "/business/embracer-appoints-thomas-kœgler-as-the-ceo-of-asmodee"
},
{
"uri": "/business/embracer-boss-says-volatile-pc-and-console-business-is-the-bad-guy"
},
{
"uri": "/business/helldivers-2-and-dead-island-2-support-studio-toadman-interactive-confirms-layoffs"
},
{
"uri": "/business/how-to-build-a-team-and-start-developing-a-game-by-being-a-simple-manager"
},
{
"uri": "/business/hunt-showdown-sees-new-concurrent-player-high-with-1896-update"
},
{
"uri": "/business/iron-galaxy-coceo-adam-boyes-to-exit-after-8year-stint"
},
{
"uri": "/business/kwalee-releases-arabic-version-of-mobile-game-platform-for-mena-devs"
},
{
"uri": "/business/mad-crusader-puts-30-million-toward-doublea-games-reopens-transmedia-incubation-program"
},
{
"uri": "/business/mental-health-in-games-charity-take-this-is-facing-extinction"
},
{
"uri": "/business/microsoft-really-wants-you-to-know-day-one-releases-no-longer-standard-on-xbox-game-pass"
},
{
"uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages"
},
{
"uri": "/business/nightmare-porting-process-drove-haak-developer-blingame-to-cancel-xbox-version"
},
{
"uri": "/business/nintendo-ends-new-3ds-repair-support-after-draining-parts-supply"
},
{
"uri": "/business/north-beach-games-opens-prague-studio-to-support-itself-and-smaller-devs"
},
{
"uri": "/business/obituary-atsuko-tanaka-game-and-anime-voice-actor-dies-at-age-61"
},
{
"uri": "/business/pantaloon-helps-out-indie-devs-with-free-resource-hub"
},
{
"uri": "/business/patch-notes-1-dispatches-from-amaze-sheffield"
},
{
"uri": "/business/patch-notes-2-how-does-the-game-industry-survive-beyond-2025"
},
{
"uri": "/business/phil-spencer-indiana-jones-ps5-jump-good-for-xboxs-health"
},
{
"uri": "/business/physical-games-can-help-drive-digital-sales-says-maximum-entertainment-ceo"
},
{
"uri": "/business/playstation-launches-incubator-project-for-mena-developers"
},
{
"uri": "/business/quantic-dream-writer-adam-williams-departs-to-start-up-his-own-studio"
},
{
"uri": "/business/randy-pitchford-borderlands-4s-steam-release-isnt-the-end-of-the-pc-store-wars"
},
{
"uri": "/business/reforged-studios-does-a-double-acquisition-buys-ground-shatter-and-extra-mile"
},
{
"uri": "/business/reikon-games-ruiner-to-receive-film-adaptation-by-universal-pictures"
},
{
"uri": "/business/remedy-partners-with-annapurna-to-finance-control-2-and-develop-transmedia-projects"
},
{
"uri": "/business/report-bungie-fired-veteran-director-after-misconduct-allegations"
},
{
"uri": "/business/report-netease-cutting-jobs-at-ouka-studios-ahead-of-potential-closure"
},
{
"uri": "/business/report-until-dawn-remake-developer-ballistic-moon-is-making-layoffs"
},
{
"uri": "/business/roblox-will-let-creators-list-item-bundles-to-grow-their-earnings"
},
{
"uri": "/business/rogue-snail-decouples-freetoplay-mechanics-from-relic-hunters-legend-after-gearbox-split"
},
{
"uri": "/business/square-enix-eyes-bigger-xbox-focus-after-pretty-good-final-fantasy-xiv-response"
},
{
"uri": "/business/steam-reviews-now-reflect-if-a-game-was-played-on-steam-deck"
},
{
"uri": "/business/survey-spotty-preservation-efforts-risk-significant-loss-for-australian-game-industry"
},
{
"uri": "/business/survey-reveals-devs-consider-genai-doubleedged-sword-in-game-development"
},
{
"uri": "/business/the-epic-games-store-debuts-on-altstore-android-and-ios-devices"
},
{
"uri": "/business/turns-out-dying-light-the-beast-started-out-as-leaked-dying-light-2-dlc"
},
{
"uri": "/business/ubisoft-cuts-45-jobs-across-cary-and-san-francisco-teams"
},
{
"uri": "/business/virtuos-acquires-codeveloper-third-kind-studios"
},
{
"uri": "/business/visual-concepts-lays-off-staff-at-lego-2k-drive-south-studio"
},
{
"uri": "/design/a-rising-tide-floats-all-boats-xbox-on-the-universal-benefits-of-accessible-design"
},
{
"uri": "/design/astro-bot-makes-the-tech-demo-mascot-into-leading-bot-material"
},
{
"uri": "/design/better-together-making-sense-of-the-frenetic-floating-fleets-in-flock"
},
{
"uri": "/design/book-excerpt-animal-crossing-tracks-the-rise-of-the-original-cozy-life-sim"
},
{
"uri": "/design/bridging-history-and-gameplay-lessons-from-historiographical-video-game-design"
},
{
"uri": "/design/call-for-submissions-lets-talk-about-photography-games"
},
{
"uri": "/design/categories-of-games-by-player-numbers"
},
{
"uri": "/design/classic-postmortem-the-development-of-the-original-psychonauts-was-a-fraught-experience"
},
{
"uri": "/design/conjuring-a-gestural-spellcasting-system-for-vr"
},
{
"uri": "/design/deprioritizing-skillbased-matchmaking-turned-call-of-duty-into-the-bad-place"
},
{
"uri": "/design/exploring-ancient-mexica-culture-through-cooking-in-cacao-cafe"
},
{
"uri": "/design/firaxis-big-swing-with-civilization-vii-convincing-players-to-actually-finish-their-games"
},
{
"uri": "/design/from-monopolies-to-tiny-tools-by-solo-devs"
},
{
"uri": "/design/game-ui-database-relaunches-with-new-features-video-support-and-over-55000-screenshots"
},
{
"uri": "/design/getting-under-the-hood-of-racing-games"
},
{
"uri": "/design/how-the-team-behind-reus-2-nurtured-a-studio-and-ip-back-to-life"
},
{
"uri": "/design/humor-is-all-weve-really-got-championing-absurdity-in-thank-goodness-youre-here"
},
{
"uri": "/design/igf-2024-winners-on-creating-venba-rhythm-doctor-and-more"
},
{
"uri": "/design/jordan-mechner-recounts-the-tale-of-creating-karateka-from-home"
},
{
"uri": "/design/leading-the-charge-what-makes-nikkes-titular-gals-narratively-and-mechanically-compelling"
},
{
"uri": "/design/lessons-on-small-scale-strategy-with-the-xcom-files"
},
{
"uri": "/design/lets-compare-the-narrative-design-of-tactical-breach-wizards-and-into-the-breach"
},
{
"uri": "/design/letting-apex-legends-players-go-guns-akimbo-was-harder-than-you-might-think"
},
{
"uri": "/design/making-a-splash-how-wuthering-waves-characters-draw-players-into-its-world"
},
{
"uri": "/design/making-the-bloodborne-kart-racer-come-to-life-with-nightmare-kart"
},
{
"uri": "/design/player-stunts-in-breath-of-the-wild-gave-nintendo-confidence-to-push-boundaries-in-tears-of-the-kingdom"
},
{
"uri": "/design/preserving-the-past-with-charles-cecil-game-developer-podcast-ep-46"
},
{
"uri": "/design/ranked-four-tiny-screens-to-power-your-tiny-alt-ctrl-dreams"
},
{
"uri": "/design/road-to-the-igf-2024-with-joel-couture-game-developer-podcast-ep-41"
},
{
"uri": "/design/star-wars-outlaws-creative-director-says-swedish-pride-in-craftsmanship-was-key-to-development-progress"
},
{
"uri": "/design/studio-imugi-is-ditching-oatmeal-narrative-design-with-bonapartea-mechanized-revolution"
},
{
"uri": "/design/supporting-game-design-with-evolutionary-algorithms"
},
{
"uri": "/design/tactical-breach-wizards-shows-how-strategy-games-can-tickle-the-funny-bone"
},
{
"uri": "/design/the-garden-paths-savviest-design-decision-connecting-to-the-cosmos"
},
{
"uri": "/design/the-unrealized-potential-of-cooking-in-games"
},
{
"uri": "/design/the-concerns-of-covering-gacha-games"
},
{
"uri": "/design/touch-can-bring-people-together-like-nothing-else-sparking-connections-through-video-game-intimacy"
},
{
"uri": "/design/training-the-game-designers-of-tomorrow-part-3-of-5"
},
{
"uri": "/design/upcoming-acmi-interactive-exhibition-welcomes-back-a-horrible-goose"
},
{
"uri": "/design/vampire-survivors-development-sounds-like-an-open-sourcefueled-fever-dream"
},
{
"uri": "/design/war-never-changes-why-innovation-in-game-development-is-still-vital"
},
{
"uri": "/design/were-currently-choking-to-death-glow-golf-developer-alex-johansson-says-the-industry-must-engage-new-audiences"
},
{
"uri": "/design/what-makes-the-survival-of-survival-horror-the-difference-between-scares-and-shooting"
},
{
"uri": "/design/what-exactly-is-a-gamer-and-why-does-it-matter"
},
{
"uri": "/design/why-fuck-around-and-find-out-became-the-backbone-of-arcos-combat"
},
{
"uri": "/design/why-is-black-hair-so-difficult-for-video-games-to-get-right-this-3d-artist-explains"
},
{
"uri": "/finance/as-strength-training-gets-more-popular-peloton-and-planet-fitness-shift-focus"
},
{
"uri": "/finance/bitcoin-rally-helps-create-more-than-84000-new-crypto-millionaires-in-a-year"
},
{
"uri": "/finance/boeing-starliner-returning-empty-as-nasa-turns-to-spacex-to-bring-astronauts-back-from-iss"
},
{
"uri": "/finance/bronfmans-paramount-bid-could-keep-shari-redstone-involved-at-the-company"
},
{
"uri": "/finance/cava-earnings-beat-estimates-as-restaurant-traffic-climbs-nearly-10"
},
{
"uri": "/finance/classic-car-sales-stall-in-monterey-auctions-as-new-generation-takes-charge"
},
{
"uri": "/finance/delta-chief-operations-officer-departing-for-another-company-after-just-over-a-year-on-the-job"
},
{
"uri": "/finance/eli-lilly-releases-new-form-of-weight-loss-drug-zepbound-for-half-the-price-to-boost-access-supply"
},
{
"uri": "/finance/fda-approves-updated-pfizer-moderna-covid-vaccines-as-virus-surges-shots-to-be-available-within-days"
},
{
"uri": "/finance/foot-locker-shares-drop-10-despite-first-comparable-sales-growth-in-six-quarters"
},
{
"uri": "/finance/ford-delays-new-ev-plant-cancels-electric-threerow-suv-as-it-shifts-strategy"
},
{
"uri": "/finance/ford-joins-list-of-companies-walking-back-dei-policies"
},
{
"uri": "/finance/home-prices-hit-record-high-in-june-on-sp-caseshiller-index"
},
{
"uri": "/finance/home-sales-rose-in-july-for-the-first-time-in-five-months"
},
{
"uri": "/finance/lego-revenue-jumps-13-in-first-half-of-2024-boosted-by-lego-fortnite-and-diverse-brick-sets"
},
{
"uri": "/finance/macys-cuts-sales-forecast-as-department-stores-struggle-to-draw-shoppers"
},
{
"uri": "/finance/mavericks-pelicans-games-are-leaving-their-local-sports-networks-ahead-of-nba-season"
},
{
"uri": "/finance/nfl-owners-vote-in-favor-of-private-equity-investment-select-firms-commit-12-billion"
},
{
"uri": "/finance/nfl-wants-a-cut-of-private-equity-investment-profits"
},
{
"uri": "/finance/nwsl-eliminates-draft-grants-unrestricted-free-agency-to-players"
},
{
"uri": "/finance/nordstrom-shares-climb-5-as-earnings-top-estimates-but-retailer-issues-cautious-guidance"
},
{
"uri": "/finance/nvidia-announces-50-billion-stock-buyback"
},
{
"uri": "/finance/nvidia-reports-122-revenue-growth-on-surging-demand-for-data-center-chips"
},
{
"uri": "/finance/nvidias-earnings-report-shows-the-problem-of-being-priced-for-perfection"
},
{
"uri": "/finance/paramount-special-committee-extends-skydance-go-shop-period-as-it-reviews-bronfman-offer"
},
{
"uri": "/finance/peloton-shares-soar-35-as-turnaround-plan-takes-hold-losses-shrink"
},
{
"uri": "/finance/peloton-to-start-charging-subscribers-with-used-equipment-95-activation-fee"
},
{
"uri": "/finance/restaurants-fight-back-against-the-ftc-crackdown-on-junk-fees-as-diners-balk-at-new-charges"
},
{
"uri": "/finance/shares-of-abercrombie-fitch-plunge-15-after-ceo-warns-of-increasingly-uncertain-environment"
},
{
"uri": "/finance/tj-maxx-owner-raises-fullyear-guidance-posts-56-sales-gain-for-the-most-recent-quarter"
},
{
"uri": "/finance/target-ceo-addresses-price-gouging-accusations-in-retail"
},
{
"uri": "/finance/target-shares-spike-as-profits-rise-despite-cautious-sales-outlook"
},
{
"uri": "/finance/us-will-again-offer-free-athome-covid-tests-starting-in-late-september"
},
{
"uri": "/finance/walmart-adds-a-burger-king-benefit-to-its-membership-program"
},
{
"uri": "/finance/washington-commanders-strike-stadium-naming-rights-deal-with-northwest-federal-credit-union"
},
{
"uri": "/finance/why-ford-believes-its-19-billion-shift-in-ev-strategy-is-the-right-choice-for-the-company-investors"
},
{
"uri": "/finance/yes-network-msg-networks-to-launch-combined-new-york-regional-sports-app"
},
{
"uri": "/news/borderlands-4-announced-with-teaser-trailer-at-opening-night-live-gamescom-2024"
},
{
"uri": "/news/civilization-7-interview-firaxis-answers-all-of-our-questions-about-the-anticipated-sequel-gamescom-2024"
},
{
"uri": "/news/crimson-desert-is-like-god-of-war-and-dragons-dogma-had-a-baby-gamescom-2024"
},
{
"uri": "/news/ign-uk-podcast-762-the-best-of-gamescom-2024"
},
{
"uri": "/news/indiana-jones-and-the-great-circle-finally-gets-a-release-date-for-xboxand-playstation-gamescom-2024"
},
{
"uri": "/news/secret-level-every-video-game-in-the-new-gamescom-trailer"
},
{
"uri": "/programming/book-excerpt-game-ai-uncovered-volume-one"
},
{
"uri": "/programming/chipwits-the-game-that-taught-a-generation-how-to-code-is-back"
},
{
"uri": "/programming/creating-a-spatial-query-system"
},
{
"uri": "/programming/deep-dive-conquering-hardware-hurdles-to-port-kingdom-come-deliverance-to-switch"
},
{
"uri": "/programming/deep-dive-console-crossplay-and-how-we-made-it-work-in-insurgency"
},
{
"uri": "/programming/deep-dive-cooking-up-a-palatable-food-prep-experience-in-fruitbus"
},
{
"uri": "/programming/deep-dive-how-owlchemy-adapted-its-vr-titles-for-the-apple-vision-pro"
},
{
"uri": "/programming/deep-dive-the-design-and-implementation-of-object-pools"
},
{
"uri": "/programming/demystifying-3d-character-rigging-for-games"
},
{
"uri": "/programming/finding-a-new-balance-between-ai-and-beneficial-bugs"
},
{
"uri": "/programming/how-nintendo-did-the-impossible-with-tears-of-the-kingdoms-physics-system"
},
{
"uri": "/programming/how-to-implement-ai-workflows-that-your-artists-will-actually-want-to-use"
},
{
"uri": "/programming/how-to-get-better-fps-on-pc-while-porting-games-to-consoles"
},
{
"uri": "/programming/populating-the-citybuilder-of-the-future-a-deep-dive-into-character-diversity-in-cities-skylines-ii"
},
{
"uri": "/programming/square-enix-is-testing-aidriven-fictional-language-generation"
},
{
"uri": "/programming/the-rise-of-generative-ai-in-revolutionizing-game-development"
},
{
"uri": "/programming/unity-sees-webgpu-as-a-growing-market-for-game-development"
},
{
"uri": "/programming/what-is-game-programming-and-how-do-you-become-a-game-programmer"
},
{
"uri": "/programming/what-to-do-about-game-engines-with-rez-graham-and-bryant-francis-game-developer-podcast-ep-42"
},
{
"uri": "/review/5-ways-star-wars-outlaws-connects-to-the-larger-franchise"
},
{
"uri": "/review/amd-ryzen-9-9900x-review"
},
{
"uri": "/review/amd-ryzen-9-9950x-review"
},
{
"uri": "/review/adam-sandler-love-you-review"
},
{
"uri": "/review/afraid-review"
},
{
"uri": "/review/alien-romulus-review"
},
{
"uri": "/review/asus-rog-ally-x-review"
},
{
"uri": "/review/asus-zenbook-s-16-review"
},
{
"uri": "/review/atomfall-isnt-british-fallout-its-something-much-more-interesting"
},
{
"uri": "/review/avowed-has-big-stealth-archer-potential"
},
{
"uri": "/review/bad-monkey-season-1-review"
},
{
"uri": "/review/baldurs-gate-3-patch-7-arrives-this-week"
},
{
"uri": "/review/batman-caped-crusader-season-1-review"
},
{
"uri": "/review/batman-wont-appear-in-the-penguin-spinoff-show"
},
{
"uri": "/review/beetlejuice-beetlejuice-review"
},
{
"uri": "/review/best-gsync-monitors-2024"
},
{
"uri": "/review/best-ipad-accessories-2024-what-should-you-pair-with-your-tablet"
},
{
"uri": "/review/black-myth-wukong-review"
},
{
"uri": "/review/black-state-inceptioninspired-bullettime-action"
},
{
"uri": "/review/blink-twice-review"
},
{
"uri": "/review/borderlands-review"
},
{
"uri": "/review/cascadero-board-game-review"
},
{
"uri": "/review/clair-obscur-expedition-33-the-first-preview"
},
{
"uri": "/review/concord-is-estimated-to-have-sold-only-25000-units-heres-why-analysts-think-its-failing"
},
{
"uri": "/review/concord-review"
},
{
"uri": "/review/cuckoo-review"
},
{
"uri": "/review/dark-and-darker-mobile-combines-genres-to-give-players-a-unique-experience"
},
{
"uri": "/review/ducktales-returns-in-new-comic-book-series-from-dynamite-entertainment"
},
{
"uri": "/review/dustborn-review"
},
{
"uri": "/review/everything-we-know-about-the-iphone-16-so-far"
},
{
"uri": "/review/fallout-london-review"
},
{
"uri": "/review/famed-dragons-dogma-and-devil-may-cry-director-hideaki-itsuno-leaves-capcom-after-30-years"
},
{
"uri": "/review/final-fantasy-creator-reveals-which-entry-he-thinks-is-most-complete-and-its-not-final-fantasy-7"
},
{
"uri": "/review/final-fantasy-xiv-ttrpg-starter-set-board-game-review"
},
{
"uri": "/review/gandalf-to-appear-in-lord-of-the-rings-the-hunt-for-gollum-ian-mckellen-asked-to-return"
},
{
"uri": "/review/gigabyte-aorus-16x-review"
},
{
"uri": "/review/gigabyte-gs27q-review"
},
{
"uri": "/review/google-pixel-9-pro-review"
},
{
"uri": "/review/google-pixel-9-review"
},
{
"uri": "/review/hisense-u8n-review"
},
{
"uri": "/review/house-of-the-dragon-season-2-review"
},
{
"uri": "/review/industry-season-3-review"
},
{
"uri": "/review/is-avengers-doomsday-secretly-an-avengers-vs-xmen-movie"
},
{
"uri": "/review/jackpot-review"
},
{
"uri": "/review/kaos-review"
},
{
"uri": "/review/labor-day-2024-the-best-sales-weve-found-today"
},
{
"uri": "/review/madden-nfl-25-review"
},
{
"uri": "/review/manny-jacinto-says-making-star-wars-the-acolyte-season-2-is-his-life-goal"
},
{
"uri": "/review/melgeek-made68-pro-review"
},
{
"uri": "/review/metaphor-refantazio-is-a-brilliant-evolution-of-persona-and-smt"
},
{
"uri": "/review/monster-jam-showdown-review"
},
{
"uri": "/review/nintendo-suggests-breath-of-the-wild-and-tears-of-the-kingdom-are-part-of-a-new-zelda-timeline"
},
{
"uri": "/review/one-year-later-larian-reflects-on-baldurs-gate-3s-success-future-plans-and-canceling-dlc-ever-since-weve-felt-better"
},
{
"uri": "/review/oneplus-pad-2-review"
},
{
"uri": "/review/only-murders-in-the-building-season-4-episodes-17-review"
},
{
"uri": "/review/pachinko-season-2-review"
},
{
"uri": "/review/reddit-is-currently-down-platform-says-issue-is-being-investigated-update"
},
{
"uri": "/review/rick-and-morty-the-anime-episodes-12-review"
},
{
"uri": "/review/rick-and-morty-the-anime-review-episodes-12-review"
},
{
"uri": "/review/rocksteady-reportedly-lays-off-staff-following-suicide-squad-kill-the-justice-league-flop"
},
{
"uri": "/review/samsung-galaxy-z-fold-6-review"
},
{
"uri": "/review/save-on-hit-manga-box-sets-at-amazon-this-weekend-for-labor-day"
},
{
"uri": "/review/save-on-mario-switch-games-at-walmart-for-labor-day-2024"
},
{
"uri": "/review/scuf-nomad-mobile-controller-review"
},
{
"uri": "/review/see-pinocchio-completely-reimagined-by-hellboy-creator-mike-mignola"
},
{
"uri": "/review/skin-police-preview-the-hyperviolent-scifi-dystopia-from-oni-press"
},
{
"uri": "/review/skincare-review"
},
{
"uri": "/review/slay-the-spire-the-board-game-review"
},
{
"uri": "/review/squirrel-with-a-gun-review"
},
{
"uri": "/review/star-wars-outlaws-review"
},
{
"uri": "/review/steamworld-heist-2-review"
},
{
"uri": "/review/stormgate-early-access-review"
},
{
"uri": "/review/tactical-breach-wizards-review"
},
{
"uri": "/review/tales-of-the-teenage-mutant-ninja-turtles-episodes-16-review"
},
{
"uri": "/review/terminator-zero-review"
},
{
"uri": "/review/the-10-best-bluetooth-record-players-for-2024"
},
{
"uri": "/review/the-best-apple-watch-deals-right-now-september-2024"
},
{
"uri": "/review/the-best-nintendo-game-youve-never-heard-of-and-its-2024-sequel"
},
{
"uri": "/review/the-crow-review"
},
{
"uri": "/review/the-deliverance-review"
},
{
"uri": "/review/the-instigators-review"
},
{
"uri": "/review/the-killer-review"
},
{
"uri": "/review/the-lg-g4-is-as-close-to-perfect-as-a-tv-can-be-in-2024"
},
{
"uri": "/review/the-lord-of-the-rings-the-rings-of-power-season-2-premiere-review"
},
{
"uri": "/review/the-lord-of-the-rings-the-rings-of-power-season-2-review"
},
{
"uri": "/review/the-scott-pilgrim-20th-anniversary-hardcover-box-set-gets-a-big-discount"
},
{
"uri": "/review/the-secretlab-black-friday-in-august-sale-kicks-off-up-to-100-off-gaming-chairs-and-desks"
},
{
"uri": "/review/the-sims-4-review-2024"
},
{
"uri": "/review/the-umbrella-academy-season-4-review"
},
{
"uri": "/review/the-union-review"
},
{
"uri": "/review/the-victrix-gambit-prime-is-a-prostyle-controller-worth-considering"
},
{
"uri": "/review/until-dawn-remake-developer-ballistic-moon-lays-off-several-staff"
},
{
"uri": "/review/visions-of-mana-review"
},
{
"uri": "/review/voice-acting-legend-jennifer-hale-on-video-game-strikes-ai-is-coming-for-all-of-us"
},
{
"uri": "/review/volgarr-the-viking-2-review"
},
{
"uri": "/review/wwe-fans-mourn-sid-vicious-after-wrestling-legend-dies-at-63-following-battle-with-cancer"
},
{
"uri": "/review/watchmen-chapter-1-review"
},
{
"uri": "/review/we-build-lego-great-deku-tree-the-first-legend-of-zelda-set-in-lego-history"
},
{
"uri": "/review/wolfs-review"
},
{
"uri": "/tech/amazon-games-boss-says-label-will-put-games-on-nintendo-switch-2-praises-switch-as-a-great-device"
},
{
"uri": "/tech/best-240hz-gaming-monitor-2024"
},
{
"uri": "/tech/best-gaming-monitors-for-2024"
},
{
"uri": "/tech/best-racing-wheels-2024-top-steering-wheels-for-gaming"
},
{
"uri": "/tech/gaming-headsets-dont-get-much-better-than-the-beyerdynamic-mmx-300-pro"
},
{
"uri": "/tech/samsung-galaxy-z-fold-6-review"
},
{
"uri": "/tech/the-asus-rog-tessen-is-a-peak-for-mobile-gaming-controllers"
},
{
"uri": "/tech/the-best-apple-watch-deals-right-now-august-2024"
},
{
"uri": "/tech/the-best-budget-gaming-monitors-for-all-gamer-types"
},
{
"uri": "/tech/the-best-ipad-deals-today-august-2024"
},
{
"uri": "/tech/the-lg-g4-is-as-close-to-perfect-as-a-tv-can-be-in-2024"
}
]
}
]
}

@ -0,0 +1,22 @@
{
"accounts": {
"test": "ca-pub-2821871715805907",
"prod": "ca-pub-2821871715805907"
},
"webs": [
{
"host": "https://moads-prod.allapp.link",
"uris": [
{
"uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages/"
},
{
"uri": "/programming/book-excerpt-game-ai-uncovered-volume-one/"
},
{
"uri": "/programming/the-rise-of-generative-ai-in-revolutionizing-game-development/"
}
]
}
]
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,761 @@
{
"close": "إغلاق",
"invite_share_text": "اضغط للعرض",
"copy_link": "نسخ الرابط",
"copy_success": "تم نسخ الرابط بنجاح",
"invite_friend": "دعوة الأصدقاء",
"invite_friend_": "مشاركة عبر",
"total_get": "يمكن الحصول على",
"can_get": "يمكن الحصول على",
"my_invite": "سجل الدعوة",
"invite_record": "سجل الدعوة",
"need_invite": "ما زال يحتاج للدعوة",
"bonus_rules": "قواعد المكافآت",
"activity_rules": "قواعد النشاط",
"invite_no_record": "لا توجد سجلات دعوة حتى الآن",
"invite_time": "وقت الدعوة",
"user_id": "الايدي المستخدم",
"reward_cond": "مكافآت منتظمة",
"target_receive_prizes": "بعد تحقيق الشروط، طريقة استلام المكافأة",
"receive_prizes": "طريقة استلام الجوائز",
"copy": "نسخ الوصلة",
"bonus_content": "شروط المكافأة",
"prize_details": "تفاصيل الجائزة",
"end_time": ":وقت الانتهاء",
"start_time": ":وقت البدء",
"activity_time": "وقت النشاط",
"extra_prizes": "مكافآت إضافية",
"quantity": "كمية",
"prize": "الجائزة",
"download_for_each_friend": "من الأصدقاء للتنزيل{{num}}في كل مرة تتم دعوة",
"accumulate_friend_downloads": "الأصدقاء بشكل تراكمي للتنزيل{{num}}تم بدعوة ",
"max_invite_friend": "يمكن لكل مستخدم إحالة حد أقصى من {{num}} صديق(أصدقاء).",
"register_for_each_friend": "كل {{num}} تسجيل",
"accumulate_friend_register": "التسجيل التراكمي {{num}",
"my_task": "مهامي",
"fans": "حكم",
"target_fans": "تحقيق",
"install_and_finish_all_cond": "يجب على خط الند للتنزيل واستكمال جميع المهام للتأهل.",
"install_and_finish_one_cond": "يجب على خط الند للتنزيل واستكمال مهمة واحدة للتأهل.",
"completed": "تم",
"undone": "للقيام به",
"friend_record": "دعوة الأصدقاء",
"task_1": "المهمة 1",
"task_2": "المهمة 2",
"task_3": "المهمة 3",
"invite_friends_to_register": "كل {{num}} تسجيل",
"invite_friends_to_install": "من الأصدقاء للتنزيل{{num}}في كل مرة تتم دعوة",
"no_record": "لا يوجد سجل حتى الآن",
"invite_friends_to_target": "دعوة {{num}} صديق(أصدقاء) لإكمال المهمة",
"target_for_each_friend": "كل {{num}} إحالة تكمل المهمة",
"accumulate_friend_target": "إحالات التراكمية {{num}} تكمل المهمة",
"prize_list": "قائمة المكافآت",
"regular_rewards": "مكافآت منتظمة",
"extra_rewards": "مكافآت إضافية",
"activity_end_text": "لقد انتهى هذا الحدث@ شكرًا لانضمامك إلينا@ أتمنى رؤيتك مرة أخرى!",
"receive": "احصل",
"contact_customer_service": "يرجى التواصل مع خدمة العملاء للاستلام",
"lottery": "دوران",
"draws_num": "دورات",
"better_luck_next_time": "حاول حظك في المرة القادمة",
"no_winning_record": "لا يوجد سجل حتى الآن",
"prize_name": "مكافأة",
"lottery_service_err": "خطأ في الخدمة، يرجى المحاولة مرة أخرى في وقت لاحق",
"draws_none": "انتهت اليانصيب",
"confirm": "حسنًا",
"try_your_luck": "اشعر بالحظ السعيد",
"get_prize_to_app": "قم بتنزيل التطبيق لاستلام جائزتك الآن",
"target_cond_1": "المهمة 1",
"target_cond_2": "المهمة 2",
"target_cond_3": "المهمة 3",
"all_tasks_to_draw": "يجب على فريقك تنزيل وإكمال جميع المهام للحصول على {{num}} سحب(سحوبات)",
"one_tasks_to_draw": "يجب على فريقك تنزيل وإكمال مهمة واحدة للحصول على {{num}} سحب(سحوبات)",
"draws_obtained": "سحبي/سحوباتي:",
"reward_record": "سجلات المكافآت",
"to_complete": "لإكمال",
"completed_times": "مرات الاكتمال",
"winning_record": "سجلات المكافآت",
"Winning_time": "تاريخ",
"thank": "المرة القادمة",
"no_receive_record": "لا يوجد سجل حتى الآن",
"week_0": "الأحد",
"week_1": "الاثنين",
"week_2": "الثلاثاء",
"week_3": "الأربعاء",
"week_4": "الخميس",
"week_5": "الجمعة",
"week_6": "السبت",
"invite_friend_install_get_sign": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق وستتلقى بطاقة مكياج واحدة.",
"invite_num": "الإحالات: {{num}}",
"sign_day_num": "تسجيل الوصول في {{num}} يوم(أيام)",
"continue_day_num": "تم تسجيل الوصول بشكل مت连续 لمدة {{num}} يوم(أيام)",
"day": "يوم",
"sign_card": "استرداد يوم فائت",
"invite_friend_get_sign_card_text": "فاتك يوم؟ ادعُ أصدقائك لتنزيل التطبيق واحصل على بطاقة تعويض!",
"obtain": "احصل",
"use_sign_card": "استخدم بطاقة التعويض",
"confirm_use_sign_card": "هل أنت متأكد من استخدامه في {{m}}/{{d}}؟ ",
"sign_success": "تسجيل الوصول",
"you_got": "لديك ",
"i_see": "فهمت",
"done_sign_day_num": "تم تسجيل الوصول لمدة {{num}} يوم(أيام)",
"done_continue_day_num": "تم تسجيل الوصول بشكل مت连续 لمدة {{num}} يوم(أيام)",
"sign_ok": "تسجيل الوصول",
"card_sign_ok": "تحقيق النجاح",
"continue_sign_ok": "تسجيل الوصول",
"continue_sign_get_reward_text": "صلابة النجاح للفوز بالمكافآت",
"sign_get_reward_text": "سجل الحضور يوميًا للفوز بالمكافآت!",
"sign_card_lack": "نقص بطاقة الماكياج",
"sign_fail": "فشلت عملية تسجيل الدخول، يرجى تحديث الصفحة",
"best_fan": "أعلى المعجبين",
"top_fans": "أعلى المعجبين",
"invite_num_title": "إحالة",
"no_rank_record": "لا يوجد سجل حتى الآن",
"vote_none": "انتهت المدة الزمنية للتصويت",
"vote_service_err": "خطأ في الخدمة، يرجى المحاولة مرة أخرى في وقت لاحق",
"hour": "س",
"minute": "د",
"second": "ث",
"hour_f": "الساعة",
"minute_f": "الدقيقة",
"second_f": "الثانية",
"vote_num": "هناك حاليًا {{num}} أصوات متاحة",
"here_is_the_quiz_title": "هنا يتم عرض عنوان الاختبار",
"option": "خيار",
"countdown": "العد التنازلي",
"end": "نهاية",
"click_image_select": " انقر على الصورة لتحديدها",
"wait_reward_reward": "يرجى العودة لاحقًا للحصول على النتائج",
"sure": "حسنًا",
"submit": "إرسال",
"next_qa": "التالي",
"right": "صحيح",
"error": "خطأ",
"right_answer": "الإجابة الصحيحة:",
"explain": "تفسير",
"home": "الصفحة الرئيسية",
"share": "مشاركة",
"download_app_qa": "حمّل التطبيق للانضمام إلى الاختبار",
"qa_service_err": "خطأ في الخدمة، يرجى المحاولة مرة أخرى في وقت لاحق",
"qa_none": "ليس لديك أي فرص للإجابة حتى الآن. @يرجى دعوة أصدقائك للحصول على فرص أكثر.",
"start": "بدء",
"challenge_failed": "فشل",
"qa_right": "صحيح ",
"keep_try": "استمر في المحاولة",
"congratulation": "مبروك!",
"please_choose": "اختر",
"qa_loading": "التحميل",
"grow_big": "نما {{name}}",
"click_receive": "احصل",
"after_receive": "الحصول على",
"tree_grow_can_get": "ازرع الشجرة وستحصل عليها.",
"fertilize_standard_text": "فقط قم بتطبيق {{num}}٪ من السماد إضافي، وستحقق الهدف!",
"fertilize": "سماد",
"fertilizer": "سماد",
"need_nutrients_will_die": "أحتاج إلى {{num}} جرام من السماد للحفاظ على صحتي.",
"get_new_tree": "احصل على شتلة جديدة",
"tree_grow_max_text": "شجرتك نمت، ها هدية صغيرة لك.",
"little_tree": "شجرتي",
"fertilize_num": "أسمد {{num}} جرام",
"some_withered": "{{name}} يشيب",
"some_revive": "{{name}} عاد إلى الحياة",
"grow_big_and_get_reward": "{{name}} نمت، لقد حصلت للتو على {{reward_title}}",
"get_grow": "احصل على {{name}}",
"props_lack": "لا يوجد ما يكفي من الملحقات.",
"cannot_lv_up": "لقد وصلت إلى أعلى مستوى.",
"invite_friend_install_get_fertilizer": "ادعو {{num}} من الأصدقاء لتحميل التطبيق، وستحصل على {{grow_num}} من السماد.",
"received_sapling": "لقد تلقيت شتلة.",
"pick_name": "اختر اسمًا",
"growth_manual": "دليل النمو",
"get_nourishment": "احصل على سماد",
"plant_new_tree": "ازرع شجرة",
"tree_revive": "انقذ شجرتك",
"timeout_tree_die": "بسبب نقص التسميد لفترة طويلة، يكون شجرتك قد ذبلت",
"invite_friend_install_revive_tree": "ادعُ {{num}} من الأصدقاء لتحميل التطبيق ويمكنك إنقاذ شجرتك",
"dog_grow_can_get": "اصطحب الجرو وستتلقاه",
"feed_standard_text": "ما عليك سوى إطعام {{num}}٪ إضافية لتحقيق الهدف!",
"feed": "تغذية",
"dog_food": "طعام الكلاب",
"need_dog_food_will_leave": "أحتاج إلى {{num}} غرامًا من الطعام، أو قد يتعين علي الخروج في مغامرة صغيرة خارج منزلنا المريح. ووف!",
"get_new_dog": "تبنّى جروًا",
"dog_grow_max_text": "لقد نمت جروك، هذه هدية صغيرة لك",
"little_dog": "جرو صغير",
"feed_num": "أطعم {{num}} غرامًا من الطعام",
"some_leave": "{{name}} ترك",
"some_come": "{{name}} عاد",
"invite_friend_install_get_dog_food": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق، وستتلقى {{grow_num}} جرام من الطعام",
"received_dog": "أنت تتبنى جروًا",
"get_dog_food": "احصل على طعام",
"plant_new_dog": "تبني كلبًا",
"rescue_puppy": "إنقاذ الجرو",
"timeout_dog_go": "بسبب أنه لم يشعر بالحب والطعام لفترة طويلة، هرب جروك من المنزل",
"invite_friend_install_rescue_puppy": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق ويمكنك إنقاذ جروك.",
"get_collect_num": "لقد تلقيت قطعة واحدة من {{reward_title}}",
"fixed_point": "عدد محدد",
"this_props_lack": "لا يوجد لديك هذا العنصر بعد",
"help_record": "سجل الدعوات",
"no_help_record": "لا يوجد سجل حتى الآن",
"install_help_record": "صديق قام بتنزيل التطبيق",
"open_help_record": "صديق فتح التطبيق",
"click_help_record": "صديق نقر على الرابط",
"service_err": "خطأ في الخدمة، يرجى المحاولة مرة أخرى في وقت لاحق",
"select_reward": "اختر مكافأة",
"view_help_rule": "تحقق من القواعد",
"help_rule": "قواعد الدعوة",
"install_help": "قم بتنزيل التطبيق للتعزيز",
"install_help_text": "كل صديق قام بتنزيل التطبيق، التقدم [[+{{num}}%]]",
"open_help": "افتح التطبيق للتعزيز",
"open_help_text": "كل صديق فتح التطبيق، التقدم [[+{{num}}%]]، يمكن الحصول على {{limit_num}}%",
"click_help": "انقر على الرابط للتعزيز",
"click_help_text": "كل صديق نقر على رابط الدعوة، التقدم [[+{{num}}%]]، يمكن الحصول على {{limit_num}}%",
"invite_friends_receive_free_gifts": "ادعو أصدقاءك للحصول على مكافآت مجانية!",
"get_prizes": "احصل على هذا المكافأة",
"help_success": "نجاح",
"also_get_free": "يمكنك أيضًا الحصول عليه مجانًا",
"install_get_free_reward": "قم بتنزيل التطبيق للحصول على مكافآت مجانية",
"install_get_reward": "احصل على التطبيق، وفتح الجوائز",
"received_success": "نجاح",
"ballot_record": "سجل المكافآت",
"no_ballot_record": "لا يوجد سجل حتى الآن",
"ballot_none": "ليس لديك أي فرص حتى الآن. يرجى دعوة أصدقائك للحصول على مزيد من الفرص",
"share_good_luck": "شارك الحظ",
"ballot": "فهمت",
"answer_record": "سجل المكافآت",
"challenge_results": "مكافأة",
"challenge_time": "تــــاريــــخ",
"no_answer_record": "لا يوجد سجل حتى الآن",
"answer_none": "انتهت الاختبارات",
"please_choose_answer": "يرجى اختيار إجابة",
"answer_countdown": "العد العكسي",
"got_prizes": "الفوز:",
"continue_free_get": "استمر في التخفيض",
"finish_help": "اكتمل",
"reward_send_your_account": "تم إرسال المكافأة إلى حسابك",
"no_reward_record": "لا يوجد سجل حتى الآن",
"download_app_ballot": "قم بتنزيل التطبيق للانضمام إلى الحملة",
"yesterday": "أمس",
"today": "اليوم",
"prize_record": "سجل المكافآت",
"get_reward_time": "تاريخ",
"no_sign_card": "لم أوقع بطاقة بديلة بعد",
"get_more_knowledge": "حاول حظك في المرة القادمة",
"qa_very_hard": "من هو الرجل الذكي؟",
"num": "اختبار",
"contact_customer_service_var": "يرجى التواصل مع ({{contact}})",
"like_share_people_lucky": "الأشخاص المشتركون لديهم حظ أفضل. شارك الآن!",
"my_reward": "جائزتي",
"no_install_prompt": "لم يتم تثبيت منصة وسائل التواصل الاجتماعي هذه بعد",
"please_login": "الرجاء تسجيل الدخول",
"got_num": "(حصل على {{num}} مرات)",
"completed_num": "(أنجز {{num}} مرات)",
"fixed_roll_none": "لا تمتلك نرد محظوظة بعد. دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق والحصول على 1 نرد محظوظ.",
"fixed_roll_none_limit": "لا يوجد نرد محظوظ بعد. دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق للحصول على نرد محظوظ واحد، بحد أقصى {{limit}} نرد محظوظ.",
"invite_friend_install_get_roll_chance": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق والحصول على {{chance}} نرد محظوظ(محظوظة).",
"invite_friend_install_get_roll_chance_limit": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق والحصول على {{chance}} نرد(نردات)، بحد أقصى {{limit}} نرد.",
"invite_friend_register_get_roll_chance": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل للحصول على {{chance}} نرد(نردات).",
"invite_friend_register_get_roll_chance_limit": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل للحصول على {{chance}} نرد(نردات)، بحد أقصى {{limit}} نرد.",
"dice_task_finish": "أكمل للحصول على {{chance}} نرد(نردات)",
"dice_task_finish_limit": "أكمل للحصول على {{chance}} نرد(نردات)، بحد أقصى {{limit}} إكمالات.",
"dice_task_num": "إجمالي النرد المحصل من المهام:",
"dice_task_cond_one": "أكمل أي مهمة للحصول على المزيد من النرد.",
"dice_task_cond_all": "أكمل جميع المهام للحصول على {{chance}} نرد(نردات).",
"dice_task_cond_all_limit": "أكمل جميع المهام للحصول على {{chance}} نرد(نردات)، بحد أقصى {{limit}} مرة(مرات). لقد حصلت على {{num}} مرة(مرات) حتى الآن.",
"spin_now": "دور الآن",
"spinning": "في دوران",
"expires_in": "ينتهي في",
"records": "سجلات",
"luck_you": "حظ سعيد لك",
"get_extra_reward": "مكافأة إضافية لك!",
"share_get": "شارك للحصول على",
"upgrade_reward": "ترقية الجائزة",
"super_upgrade": "مفاجأة! ترقية خارقة!",
"preparation": "لكل دورة",
"invite_get_energy": "دعوة للحصول على طاقة",
"invite_friend_get_energy": "ادعو الأصدقاء للحصول على الطاقة",
"up_to": "حتى",
"spin": "دورة",
"away": "{{num}} بعيداً",
"win_left_energy": "اربح {{cash}} مع مجرد {{num}} دورة",
"enjoy_credit": "استمتع برصيدك",
"invite_no_record_reward": "لم تقم بدعوة أي شخص حتى الآن. قم بدعوة أصدقائك لتحصل على مكافآت!",
"spin_reward": "مكافأة الدوران",
"share_reward": "مكافأة المشاركة",
"start_reward": "بدء الحوافز",
"left_cash_get_reward": "تبقى {{left}} فقط للحصول على مكافأة بقيمة {{cash}}",
"auto_spin": "الدوران تلقائيًا في [[{{second}}]] ثانية",
"guarantee_to": "ضمان الفوز ب {{cash}} مع دوران واحد فقط!",
"auto_select": "التحديد تلقائيًا في [[{{second}}]] ثانية",
"open": "افتح",
"select_box": "اختر صندوق هدايا واحد لترى كم سيكون مكافأة المال الخاصة بك",
"money_reward": "المكافأة المالية",
"jackpot_best_prize": "جائزة كبرى! أفضل جائزة",
"best_prize": "أفضل&&جائزة",
"almost_reward": "على وشك الوصول إلى المكافأة!",
"claimed_reward": "أكثر من [[10000+]] شخصًا ادعوا المكافأة",
"pass_on_energy": "لقد أرسلوا الطاقة إليك!",
"victory_tip": "النصر في متناول يدك، [[انتهزه]]",
"min_won_barrage": "{{name}} فاز [[{{cash}}]] قبل {{min}} دقيقة! رائع!",
"closer_to_prize": "أنت تقترب أكثر من الجائزة الكبيرة",
"shine_arrived": "حان وقتك للتألق، اغتنمه",
"won_barrage": "[[{{name}}]] قد تقدم بمطالبة [[{{cash}}]]",
"get_money_reward": "الحصول على مكافأة نقدية",
"surprise_for_you": "مفاجأة لك",
"last_spin_win": "دفعة واحدة أخيرة للفوز!",
"energy": "طاقة",
"token": "رمز",
"your_reward": "مكافأتك",
"go_to": "لاستخدام",
"click_contact": "اتصل بخدمة العملاء",
"click_contact_tip": "تم نسخ معلومات الاتصال\nالرجاء الاتصال بنا",
"see_reward": "عرض الجوائز",
"prize_gone": "الجوائز ذهبت",
"no_reward_get": "لقد تأخرت كثيرًا ، لقد تم توزيع جميع الجوائز!",
"no_more_record": "لا توجد سجلات أكثر",
"help_fail": "فشل",
"grand_opening": "افتتاح كبير",
"get_reward_after_play": "سيحصل الجميع على مكافأة بعد لعب اللعبة!",
"play_and_get_prize": "العب وانتظر جائزتك!",
"won_free_gift": "فزت بالهدية المجانية!",
"download_app_get_gift": "نزّل التطبيق للحصول على جائزتك!",
"download": "تحميل",
"jackpot": "جائزة كبرى",
"play": "لعب",
"install_ineligible": "غير مؤهل (ليس تثبيتًا جديدًا)",
"unlock_your_luck": "افتح حظك",
"spin_and_win": "دوران والفوز",
"play_to_win_prize": "العب للفوز بجائزة!",
"you_got_the_best_prize": "لقد حصلت على أفضل الجوائز",
"play_and_win": "العب وانتصر",
"download_to_get": "حمّل للحصول على",
"best_prize_!": "الجائزة الأفضل!",
"roll_dice_number": "رمي النرد، النتيجة {{point}}",
"lucky_dice_number": "استخدام النرد الحظ ، العدد {{point}}",
"day_sign": "تسجيل الدخول اليومي",
"dice_record": "السجلات",
"finish_friend_register": "إكمال مهمة تسجيل الأصدقاء",
"finish_friend_install": " إكمال مهمة تحميل التطبيق الموصى به",
"finish_lucky_dice_task": "إكمال مهمة الحصول على نرد الحظ",
"fragment": "كسر",
"click": "انقر",
"collect_fragment_compare_reward": "اجمع {{num}} كسور لتكوين الجائزة",
"craft_fragments": "صنع الرقائق",
"reward_lack_contact_customer_service": "نفد المخزون. الرجاء الاتصال بخدمة العملاء للمساعدة",
"join_in_campaign": "انضم إلى الحملة",
"contact": "اتصال",
"all": "الجميع",
"contact_information": "طرق الاتصال",
"no_more_dice": "لا مزيد من النرجيلة",
"try_your_luck_first_upper": "جرب حظك",
"fill_in": "املء",
"submit_success": "نجاح",
"please_do_not_submit_repeatedly": "من فضلك لا ترسل مرارًا",
"submitted": "تم تقديمه",
"please_complete_the_form": "من فضلك أكمل النموذج",
"welcome_gifts": "هدايا الترحيب",
"spin_to_win": "دوّر للفوز",
"view": "عرض",
"use": "الاستخدام",
"get_and_use": "استلام والاستخدام",
"invite_friend_install_get_lottery_chance": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق، وستحصل على {{chance}} فرصة(فرص).",
"invite_friend_install_get_lottery_chance_limit": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق، وستحصل على {{chance}} فرصة(فرص)، بحد أقصى {{limit}} فرصة(فرص).",
"invite_friend_register_get_lottery_chance": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل، وستحصل على {{chance}} فرصة(فرص).",
"invite_friend_register_get_lottery_chance_limit": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل، وستحصل على {{chance}} فرصة(فرص)، بحد أقصى {{limit}} فرصة(فرص).",
"lottery_task_finish": "ستحصل على {{chance}} فرصة(فرص) عند الإكمال",
"lottery_task_finish_limit": "ستحصل على {{chance}} فرصة(فرص) عند الإكمال، بحد أقصى {{limit}} مرة(مرات)",
"lottery_task_num": "إجمالي فرص السحب التي تم الحصول عليها من المهام",
"lottery_task_cond_one": "إنجاز أي مهمة يمكن أن يؤدي إلى الحصول على المزيد من فرص السحب",
"lottery_task_cond_all": "إكمال جميع المهام يمكن أن يؤدي إلى الحصول على {{chance}} فرصة(فرص)",
"lottery_task_cond_all_limit": "إكمال جميع المهام يمكن أن يؤدي إلى الحصول على {{chance}} فرصة(فرص)، بحد أقصى {{limit}} مرة(مرات)، وقد تم الحصول على {{num}} مرة(مرات).",
"raffle_chances": "فرص السحب",
"quiz_chances": "فرص الإجابة",
"get_lottery_chances": "الحصول على فرص السحب",
"remaining_raffle_chances": "أوقات السحب المتبقية",
"lottery_again": "مرة أخرى",
"use_immediately": "لاستخدام",
"wow_you_got": "وأنت تستحق التهنئة!",
"next_time": "في المرة القادمة",
"finish_all_task": "المهام منجزة",
"finish_one_task": "تم المهمة",
"sign_in_every_day_can_get_dice": "قم بتسجيل الدخول كل يوم، يمكنك الحصول على {{num}} نرد(نردات).",
"do_task_get_dice": "نفّذ المهام واحصل على النرد",
"do_task_get_lottery": "نفّذ المهام واحصل على الفرصة",
"refresh_tomorrow": "سيتم التحديث غدًا",
"click_icon": "انقر الأيقونة",
"paste_to_media": "الصق في الوسائط",
"get_prize": "احصل على الجوائز",
"copy_success_paste_to_media": "تم النسخ بنجاح ، يرجى اللصق على وسائل التواصل الاجتماعي",
"invite_friend_install_get_grow": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق والحصول على {{chance}} عنصر(عناصر) نمو.",
"invite_friend_install_get_grow_limit": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق والحصول على {{chance}} عنصر(عناصر) نمو، بحد أقصى {{limit}} عنصر(عناصر) نمو.",
"invite_friend_register_get_grow": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل والحصول على {{chance}} عنصر(عناصر) نمو.",
"invite_friend_register_get_grow_limit": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل والحصول على {{chance}} عنصر(عناصر) نمو، بحد أقصى {{limit}} عنصر(عناصر) نمو.",
"grow_task_finish": "أكمل للحصول على {{chance}} عناصر نمو",
"grow_task_finish_limit": "اكمل للحصول على {{chance}} عنصر(عناصر) نمو، يمكن إكمالها حتى {{limit}} مرة(مرات).",
"grow_task_cond_one": "أكمل أي مهمة للحصول على عناصر نمو",
"grow_task_cond_all": "أكمل جميع المهام للحصول على {{chance}} عناصر نمو",
"grow_task_cond_all_limit": "أكمل جميع المهام للحصول على {{chance}} عنصر(عناصر) نمو، حتى {{limit}} مرة(مرات)، وقد تم الحصول على {{num}} مرة(مرات).",
"do_task_get_grow": "أكمل المهام للحصول على عناصر النمو",
"easy_mode": "الوضع السهل",
"mins_ago": "{{min}} دقائق مضت",
"barrage_got_reward": "حصل على [[{{title}}]] من خلال سحب الحظ.",
"sold_out": "نفد",
"task_done": "تم المهمة",
"click_copy_link": "اضغط على \"نسخ الرابط\"",
"select_card": "اختيار بطاقة",
"raffle_chances_lack": "الفرص غير كافية",
"raffle_chances_lack_tip": "فرصتك في السحب غير كافية، اذهب إلى أسفل الصفحة وأكمل المهام للحصول على فرص جديدة للسحب.",
"get_more_chance": "احصل على المزيد من الفرص",
"flip_now": "اقلب الآن",
"raffle_num": "فرص السحب",
"win": "فوز",
"next_week_do": "الأسبوع المقبل",
"week_do_1": "تحديث الإثنين",
"week_do_2": "تحديث الثلاثاء",
"week_do_3": "تحديث الأربعاء",
"week_do_4": "تحديث الخميس",
"week_do_5": "تحديث الجمعة",
"week_do_6": "تحديث السبت",
"week_do_7": "تحديث الأحد",
"to_flip": "اذهب لسحب بطاقة",
"won_get": "مبروك",
"invite_friend_download": "دعوة {{num}} صديق(أصدقاء) لتحميل التطبيق",
"invite_friend_register": "دعوة {{num}} صديق(أصدقاء) للتسجيل",
"fixed_roll_none_register": "لا توجد نردات محظوظة بعد. دعوة {{num}} صديق(أصدقاء) للتسجيل واحصل على 1 نرد محظوظ.",
"fixed_roll_none_register_limit": "لا توجد نردات محظوظة حتى الآن. دعوة {{num}} صديق(أصدقاء) للتسجيل واحصل على 1 نرد محظوظ، بحد أقصى {{limit}} نردات محظوظة.",
"sign_in_every_day_can_get_lottery": "قم بتسجيل الدخول كل يوم للحصول على {{num}} فرصة(فرص) للفوز بجائزة.",
"finish_newcomer_task": "[[المبتدئ]] أكمل المهام للحصول على [[{{reward_title}}]]",
"done_newcomer_task": "مهام المبتدئين",
"register_help_record": "صديق قد أكمل التسجيل",
"register_help_text": "كل صديق أكمل التسجيل، التقدم [[+{{num}}%]]",
"register_help": "دعم التسجيل",
"invite_friend_install_get_qa": "دعوة {{num}} صديق(أصدقاء) لتنزيل التطبيق، يمكنك الحصول على {{chance}} فرصة للإجابة على الأسئلة.",
"invite_friend_install_get_qa_limit": "دعوة {{num}} صديق(أصدقاء) لتنزيل التطبيق، يمكنك الحصول على {{chance}} فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} فرصة.",
"invite_friend_register_get_qa": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل، يمكنك الحصول على {{chance}} فرصة للإجابة على الأسئلة.",
"invite_friend_register_get_qa_limit": "دعوة {{num}} صديق(أصدقاء) لإكمال التسجيل، يمكنك الحصول على {{chance}} فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} فرصة.",
"qa_task_finish": "عند الإكمال، يمكنك الحصول على {{chance}} فرصة للإجابة على الأسئلة.",
"qa_task_finish_limit": "عند الإكمال، يمكنك الحصول على {{chance}} فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} مرة.",
"qa_task_cond_one": "إكمال أي مهمة سيمكنك من الحصول على فرصة للإجابة على الأسئلة",
"qa_task_cond_all": "إكمال جميع المهام سيمكنك من الحصول على {{chance}} فرصة للإجابة على الأسئلة",
"qa_task_cond_all_limit": "إكمال جميع المهام سيمكنك من الحصول على {{chance}} فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} فرصة، وقد حصلت على {{num}} فرصة",
"sign_in_every_day_can_get_qa": "كل يوم ستحصل على {{num}} فرصة للإجابة على الأسئلة.",
"do_task_get_qa": "قم بإنجاز المهام للحصول على فرص للإجابة على الأسئلة",
"help_install": "حصل [[{{name}}]] على [[تعزيز التثبيت]]",
"help_register": "حصل [[{{name}}]] على [[تعزيز التسجيل]]",
"help_open": "حصل [[{{name}}]] على [[تعزيز الزيارة اليومية]]",
"help_click": "حصل [[{{name}}]] على [[تعزيز النقر]]",
"finish_help_get_reward": "[[{{name}}]] أكمل مهمة الدعم، وحصل على [[{{reward_title}}]]",
"a_gift_to_you": "هدية لك",
"choose_it": "اختره",
"nice_choice": "خيار رائع!",
"tip": "نصيحة",
"left_percent_get_reward": "فقط [[{{left}}%]] متبقية للحصول على المكافأة",
"ensure_select_reward": "هل تأكدت من اختيار [[{{reward_title}}]]؟",
"reward_obtained": "تم الحصول على المكافأة",
"lucky": "محظوظ",
"percent_progress_for_you": "لقد حصلت على دعم مجاني [[{{percent}}%]]!",
"invite": "دعوة",
"help_task": "مهمة الدعم",
"finish_all_task_help_parent": "أكمل جميع المهام التالية لدعم أصدقائك",
"finish_one_task_help_parent": "أكمل أي من المهام التالية لدعم أصدقائك",
"task_index": "المهمة {{index}}",
"raise_pet_to_get_free_gift": "اعتنِ بحيوانك الأليف للحصول على هدايا مجانية",
"step": "خطوة",
"pick_item": "اختر العنصر",
"raise_pet": "تربية حيوان أليف",
"get_free_gift": "احصل على هدية مجانية",
"has_got": "{{name}} حصل على {{reward_title}}",
"more_unexpected_gifts": "المزيد من الهدايا غير المتوقعة أثناء تربية حيوانك الأليف",
"pick_it": "اختره",
"picked": "اختار",
"your_gift_confirm": "يرجى تأكيد هديتك",
"free": "مجاني",
"raise_the_dog_to_get_your": "ارفع الكلب للحصول على خاصتك",
"free_gift": "هدية مجانية!",
"expires_in_day": "تنتهي صلاحيتها بعد {{day}} يومًا",
"collect_more_love": "اجمع [[{{num}}]] نقطة حب إضافية للحصول على هدية مجانية",
"collect": "جمع",
"claim_now": "قم بالمطالبة الآن",
"feed_more_times": "أضف {{num}} مرة أخرى",
"get_more": "احصل على المزيد",
"first_referral_bonus": "مكافأة الإحالة الأولى!",
"get_rewards_first_time": "احصل على مكافآت من خلال دعوة الأصدقاء للمرة الأولى",
"first_invite_receive": "ستتلقى الدعوة الأولى لمستخدم جديد [[{{num}}]]",
"invite_now": "الدعوة الآن",
"invite_get_dog_foods": "دعوة الأصدقاء لكسب الطعام",
"invite_friends": "دعوة الأصدقاء",
"pick_a_gift": "اختر هدية مجانية واحدة",
"feed_3_times": "إطعام 3 مرات",
"invite_new_user_extra_get": "دعوة مستخدم جديد لأول مرة يمكن أن يحصل على [[{{num}}]] إضافية",
"reward_upgraded": "ترقية المكافأة",
"reward_for_you": "[[{{reward_title}}]] لك",
"time_s_up": "انتهى الوقت!",
"play_again": "العب مرة أخرى",
"complete_tasks_to_earn_reward": "أكمل المهام لكسب المكافأة",
"super": "خارق",
"super_benefit": "الفوائد الفائقة",
"task_cond_one": "أكمل أي مهمة للحصول على [[جائزة]]",
"task_cond_all": "أكمل جميع المهام للحصول على {{reward_title}}[[+{{num}}]]",
"congrats": "مبروك!",
"enjoy_your": "استمتع ب",
"try_again_to_claim": "حاول مرة أخرى للمطالبة بهديتك",
"collect_love": "اجمع الحب",
"finish_step": "أكملت مهمة المرحلة",
"finish_feed": "أكملت مهمة التغذية",
"friend_third_feed": "الصديق أكمل إطعام 3 مرات طعام الكلاب",
"friend_first_third_feed": "دعوة الأصدقاء لإطعام 3 مرات طعام الكلاب يوميًا",
"friend_select_reward": "الصديق اختار الجائزة",
"friend_first_select_reward": "دعوة الأصدقاء لاختيار الجائزة يوميًا",
"rewards": "جوائز",
"round_expired": "انتهت الجولة",
"love_points": "نقاط الحب",
"dog_food_lack": "يرجى الحصول على المزيد من طعام الكلاب",
"collect_machine": "تم استلام آلة طعام الكلاب",
"max_grow": "تجاوز الحد الأقصى لعدد التطورات",
"please_collect_love": "يرجى جمع الحب أولاً",
"continue_grow": "يمكن الاستمرار في تربية الحيوان الأليف الحالي",
"dog_food_machine_running": "يتم إنتاج طعام الكلاب",
"reward_remove": "الجائزة قد أزيلت",
"reward_get_max": "الجائزة قد تجاوزت الحد الأقصى للمكافآت",
"i_am_hungry": "أنا جائع!",
"effect_invite": "تمت دعوة صديق بنجاح",
"day_first_effect_invite": "الدعوة الناجحة الأولى لصديق في نفس اليوم",
"finish_many_feed": "تم إكمال عدة عمليات إطعام",
"daily_rewards": "المكافآت اليومية",
"come_back_tomorrow_for_more_rewards": "عد غدًا للحصول على المزيد من المكافآت!",
"claim_today_reward": "احصل على مكافأتك اليوم!",
"come_back_tomorrow": "عد غدًا!",
"fail_to_sign_progress_reset": "إذا لم تتمكن من تسجيل الدخول بشكل مستمر، سيتم إعادة تعيين تقدمك",
"signed_in": "تم تسجيل الدخول",
"signed_title": "تسجيل الدخول",
"you_got_the_gift_box": "لقد حصلت على صندوق الهدايا",
"use_it": "استخدمه",
"you_got_dog_food": "لقد حصلت على {{num}} من طعام الكلاب",
"you_got_reward": "لقد حصلت على {{reward_title}}",
"invite_contest": "دعوة المسابقة",
"rewards_earned_to_your_account": "ستذهب المكافآت المكتسبة [[مباشرة إلى]] حسابك",
"invite_more_friends": "دعوة المزيد من الأصدقاء",
"invited": "تمت دعوة {{num}}",
"daily_fortune_draw": "سحب الحظ اليومي",
"win_free_gift_every_day": "اربح هدية مجانية كل يوم!",
"draw_now": "اسحب الآن",
"day_num": "اليوم {{num}}",
"you": "أنت",
"blind_box": "صندوق أعمى",
"daily_draw": "سحب يومي",
"rankings": "التصنيفات",
"rank_reward": "جوائز التصنيف",
"sign_reward": "جوائز تسجيل الوصول",
"blind_reward": "جوائز صناديق المفاجآت",
"lucky_reward": "جوائز السحب",
"tomorrow": "غدًا",
"win_reward": "اربح[[{{title}}]]",
"rank_end": "انتهى الوقت",
"congrats_for_getting": "تهانينا على الحصول على",
"ends_in": "ينتهي بـ",
"invite_friend_download_app": "دعوة [[{{num}}]] صديق(أصدقاء) لتنزيل التطبيق",
"invite_friend_register_app": "دعوة [[{{num}}]] صديق(أصدقاء) للتسجيل",
"invite_friend_install_get_lottery_chance_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لتنزيل التطبيق، وستحصل على [[{{chance}}]] فرصة(فرص).",
"invite_friend_install_get_lottery_chance_limit_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لتنزيل التطبيق، وستحصل على [[{{chance}}]] فرصة(فرص)، بحد أقصى {{limit}} فرصة(فرص).",
"invite_friend_register_get_lottery_chance_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لإكمال التسجيل، وستحصل على [[{{chance}}]] فرصة(فرص).",
"invite_friend_register_get_lottery_chance_limit_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لإكمال التسجيل، وستحصل على [[{{chance}}]] فرصة(فرص)، بحد أقصى {{limit}} فرصة(فرص).",
"lottery_task_finish_v2": "ستحصل على [[{{chance}}]] فرصة(فرص) عند الإكمال",
"lottery_task_finish_limit_v2": "ستحصل على [[{{chance}}]] فرصة(فرص) عند الإكمال، بحد أقصى {{limit}} مرة(مرات)",
"lottery_task_cond_all_v2": "إكمال جميع المهام يمكن أن يؤدي إلى الحصول على [[{{chance}}]] فرصة(فرص)",
"lottery_task_cond_all_limit_v2": "إكمال جميع المهام يمكن أن يؤدي إلى الحصول على [[{{chance}}]] فرصة(فرص)، بحد أقصى {{limit}} مرة(مرات)، وقد تم الحصول على [[{{num}}]] مرة(مرات).",
"sign_in_every_day_can_get_lottery_v2": "قم بتسجيل الدخول كل يوم للحصول على [[{{num}}]] فرصة(فرص) للفوز بجائزة.",
"invite_friends_to_earn_reward": "دعُ الأصدقاء للفوز بالمكافأة",
"raffle_num_add": "فرصة [[+{{num}}]]",
"click_button_and_get_coins": "انقر على الزر لإكمال المهمة والحصول على المزيد من العملات",
"do_task_get_energy": "أكمل المهام لكسب الطاقة",
"coins": "{{num}} عملة",
"get_tasks": "احصل على المهام",
"next": "التالي",
"finish_task_title": "أكمل \"{{title}}\"",
"get_energy": "احصل على الطاقة",
"tasks": "المهام",
"invite_friend_install_get_gold": "ادعُ {{num}} من الأصدقاء لتحميل التطبيق، يمكنك الحصول على {{chance}} عملة.",
"invite_friend_install_get_gold_limit": "ادعُ {{num}} من الأصدقاء لتحميل التطبيق، يمكنك الحصول على {{chance}} عملة، بحد أقصى {{limit}} عملة.",
"invite_friend_register_get_gold": "ادعُ {{num}} من الأصدقاء لإكمال التسجيل، يمكنك الحصول على {{chance}} عملة.",
"invite_friend_register_get_gold_limit": "ادعُ {{num}} من الأصدقاء لإكمال التسجيل، يمكنك الحصول على {{chance}} عملة، بحد أقصى {{limit}} عملة.",
"gold_task_finish": "إكمال يمكنك الحصول على {{chance}} عملة",
"gold_task_finish_limit": "إكمال يمكنك الحصول على {{chance}} عملة، بحد أقصى {{limit}} مرة",
"gold_task_cond_one": "إكمال أي مهمة يمكنك من الحصول على عملة",
"gold_task_cond_all": "إكمال جميع المهام يمكنك من الحصول على {{chance}} عملة",
"gold_task_cond_all_limit": "إكمال جميع المهام يمكنك من الحصول على {{chance}} عملة، بحد أقصى {{limit}} مرة، وقد حصلت على {{num}} مرات",
"do_task_get_gold": "القيام بالمهام للحصول على عملة",
"task_none": "لا توجد مهام يمكن إكمالها",
"finish_task_earn_num": "إكمال المهمة يمكنك من الحصول على [[+{{num}}]]",
"reached_the_max": "وصلت إلى الحد الأقصى",
"has_got_style": "[[{{name}}]] حصل على [[{{reward_title}}]]",
"dog_food_num": "{{num}}غ طعام",
"in_production": "قيد الإنتاج",
"active_talk": "لم تزورني منذ وقت طويل. تعال أكثر للحصول على المزيد من المكافآت.",
"task_reset_talk": "إحدى جوائزك على وشك الانتهاء، تعال وتحقق منها.",
"dog_offline_talk": "لقد استلمت حصة من طعام الحيوانات الأليفة، يرجى الذهاب لاستلامها.",
"complete_task_talk": "لقد أكملت المهمة، تهانينا على الحصول على جائزة، تعال واستلمها.",
"current_total_prize_pool": "إجمالي الجوائز الحالية",
"get_coin": "[[{{name}}]] حصل على [[{{num}}]] عملة",
"join_coin_num": "[[{{name}}]] احصل على الذهب [[*{{num}}]]",
"join_coin": "امسك الذهب",
"coin_per_use": "{{num}} عملة ذهبية لكل استخدام",
"expected_to_receive_coin": "من المتوقع استلام [[{{num}}]] عملة ذهبية",
"collect_coin": "يمكن جمع [[{{num}}]] عملة ذهبية",
"more": "المزيد",
"expired": "منتهي الصلاحية",
"gold_coins_deposited": "وصلت العملات الذهبية",
"timeout_and_no_collection": "انتهى الوقت ولم يتم الاستلام",
"use_gold_coins_to_play": "استخدام [[{{num}}]] عملة ذهبية للعب؟",
"cancel": "إلغاء",
"play_limit_next_round": "لقد وصلت إلى حد اللعب! عد في الجولة التالية!",
"insufficient_balance_grab_gold": "رصيد غير كافٍ. لا يمكن المشاركة",
"do_task": "قم بالمهام",
"this_round_has_ended": "انتهت هذه الجولة",
"claim": "المطالبة",
"claim_it_now": "احصل عليه الآن!",
"claim_time_not_reached": "لم يصل وقت المطالبة",
"success": "نجاح",
"too_late_reward_expired": "لقد فات الأوان! انتهت المكافأة",
"no_duplicate_claims": "لا يُسمح بالمطالبات المكررة",
"buy_more": "اشترِ المزيد",
"operation_failed": "فشلت العملية، يرجى إعادة المحاولة لاحقًا",
"expected_to_be_available_tomorrow": "من المتوقع استلامه غدًا",
"expected_to_be_available_in_day": "من المتوقع استلامه بعد {{day}} يومًا",
"num_gold_coins": "[[{{num}}]] عملة",
"check_in_now": "تسجيل الدخول الآن",
"complete_daily_check_ins_for_prizes": "أكمل تسجيل الدخول اليومي للحصول على الجوائز",
"check_in_days": "أيام تسجيل الوصول",
"lottery_chance_done": "الفرصة [[+{{chance}}]] (تم: [[{{num}}]])",
"lottery_chance_done_limit": "فرصة [[+{{chance}}]] (تم: [[{{num}}]]/{{limit}})",
"claim_failed": "فشل الاستلام، يرجى التواصل مع خدمة العملاء",
"answer_tomorrow_get_chance": "غدًا يمكنك الحصول على {{chance}} فرصة للإجابة",
"finish_invite_task": "تم إكمال مهمة الدعوة",
"dice_chance_done": "النرد [[+{{chance}}]] (تم: [[{{num}}]])",
"dice_chance_done_limit": "النرد [[+{{chance}}]] (تم: [[{{num}}]]/{{limit}})",
"grow_chance_done": "عناصر النمو [[+{{chance}}]] (تم: [[{{num}}]])",
"grow_chance_done_limit": "عناصر النمو [[+{{chance}}]] (تم: [[{{num}}]]/{{limit}})",
"qa_chance_done": "فرصة الاختبار [[+{{chance}}]] (تم: [[{{num}}]])",
"qa_chance_done_limit": "فرصة الاختبار [[+{{chance}}]] (تم: [[{{num}}]]/{{limit}})",
"help_wait": "جارٍ",
"distributing": "جارٍ التوزيع",
"distribution_failed": "فشل",
"claimed": "تم الاستلام",
"no_prizes_to_claim": "لم يتم العثور على جوائز تحتاج إلى استلامها",
"points_use": "استخدم {{num}} نقطة",
"points_use_ok": "تم التبادل بنجاح",
"points_use_lack": "النقاط غير كافية",
"points_use_close": "وظيفة التبادل مغلقة",
"points_use_day_limit": "تم الوصول إلى حد تبادل النقاط اليومية",
"points_use_limit": "تم الوصول إلى حد عدد التبادلات",
"points_use_dice": "استخدم [[{{num}}]]، تبادل مقابل [[{{chance}}]] زهرات؟",
"points_use_lottery": "استخدم [[{{num}}]]، تبادل مقابل [[{{chance}}]] فرصة؟",
"times": "مرات",
"dice": "نرد",
"one_spin": "دورة واحدة",
"raise_the_pet_to_get_your": "تربية حيوانات أليفة للحصول على الخاص بك",
"pet_food_num": "{{num}}غ طعام الحيوانات الأليفة",
"pet_food": "طعام الحيوانات الأليفة",
"friend_third_feed_pet": "الصديق الذي أكمل إطعام الحيوانات الأليفة 3 مرات",
"friend_first_third_feed_pet": "دعوة أصدقائك لإطعام الحيوانات الأليفة 3 مرات يوميًا",
"collect_machine_food": "تم استلام آلة طعام الحيوانات الأليفة",
"pet_food_lack": "يرجى الذهاب للحصول على المزيد من طعام الحيوانات الأليفة",
"pet_food_machine_running": "يتم إنتاج طعام الحيوانات الأليفة",
"chat_day_limit": "اليوم أشعر بالتعب قليلاً",
"chat_token_limit": "أنا متعب جداً",
"chat": "دردشة",
"hours_ago": "منذ {{hour}} ساعة",
"conversation_and_chat": "يمكنك بدء محادثة والدردشة مع حيواناتك الأليفة",
"invite_friend_install_get_vote_chance": "دعوة {{num}} أصدقاء لتنزيل التطبيق ، يمكنك الحصول على {{chance}} فرصة للتصويت.",
"invite_friend_install_get_vote_chance_limit": "دعوة {{num}} أصدقاء لتنزيل التطبيق، يمكنك الحصول على {{chance}} فرصة للتصويت، بحد أقصى {{limit}} فرص.",
"invite_friend_register_get_vote_chance": "دعوة {{num}} أصدقاء للتسجيل، يمكنك الحصول على {{chance}} فرصة للتصويت.",
"invite_friend_register_get_vote_chance_limit": "دعوة {{num}} أصدقاء لإكمال التسجيل، يمكنك الحصول على {{chance}} فرصة للتصويت، بحد أقصى {{limit}} فرص.",
"vote_task_finish": "إكمال يمنحك {{chance}} فرصة للتصويت",
"vote_task_finish_limit": "أكمل لتحصل على {{chance}} فرصة تصويت، بحد أقصى {{limit}} مرة",
"vote_task_num": "فرص التصويت المكتسبة من إكمال المهام",
"vote_task_cond_one": "أكمل أي مهمة للحصول على فرص التصويت",
"vote_task_cond_all": "أكمل جميع المهام للحصول على {{chance}} فرصة تصويت",
"vote_task_cond_all_limit": "أكمل جميع المهام لتحصل على {{chance}} فرصة تصويت، الحد الأقصى {{limit}}، تم الحصول على {{num}}",
"do_task_get_vote": "احصل على فرص التصويت من خلال القيام بالمهام",
"sign_in_every_day_can_get_vote": "تعال يومياً لتحصل على {{num}} فرصة تصويت",
"your_choice": "اختيارك",
"cap_win": "اربح",
"cap_draw": "تعادل",
"blue_team": "أزرق",
"red_team": "أحمر",
"spend_coin_to_vote_team": "هل أنت متأكد من رغبتك في إنفاق [[{{coin}}]] للتصويت لـ <<{{title}}>>؟",
"vote_team": "هل أنت متأكد من رغبتك في التصويت لـ [[{{title}}]]؟",
"vote_sure": "تأكيد التصويت؟",
"no_scheduled": "لا توجد مباريات مجدولة",
"schedule": "الجدول",
"in_progress": "قيد التنفيذ",
"participated": "تم المشاركة",
"vote_soon": "سيتم التصويت قريبًا",
"vote": "تصويت",
"pending": "معلق",
"settled": "تم التسوية",
"spend_coin_redeem_reward": "هل أنت متأكد من رغبتك في إنفاق [[{{coin}}]] لاستبدال <<{{title}}>>؟",
"redeem_sure": "تأكيد الاستبدال؟",
"prize_restocking": "جاري إعادة تخزين الجوائز...",
"redeem": "استبدال",
"invite_friend_install_get_vote_chance_v2": "قم بدعوة [[{{num}}]] من الأصدقاء لتحميل التطبيق لتحصل على [[{{chance}}]] فرصة تصويت.",
"invite_friend_install_get_vote_chance_limit_v2": "قم بدعوة [[{{num}}]] من الأصدقاء لتحميل التطبيق لتحصل على [[{{chance}}]] فرصة تصويت، بحد أقصى {{limit}} فرصة تصويت.",
"invite_friend_register_get_vote_chance_v2": "قم بدعوة [[{{num}}]] من الأصدقاء لإكمال التسجيل لتحصل على [[{{chance}}]] فرصة تصويت.",
"invite_friend_register_get_vote_chance_limit_v2": "قم بدعوة [[{{num}}]] من الأصدقاء لإكمال التسجيل لتحصل على [[{{chance}}]] فرصة تصويت، بحد أقصى {{limit}} فرصة تصويت.",
"vote_task_finish_v2": "أكمل لتحصل على [[{{chance}}]] فرصة تصويت",
"vote_task_finish_limit_v2": "أكمل لتحصل على [[{{chance}}]] فرصة تصويت، بحد أقصى {{limit}} مرة",
"vote_task_cond_all_v2": "أكمل جميع المهام لتحصل على [[{{chance}}]] فرصة تصويت会",
"vote_task_cond_all_limit_v2": "أكمل جميع المهام لتحصل على [[{{chance}}]] فرصة تصويت، الحد الأقصى {{limit}}، تم الحصول على [[{{num}}]]",
"sign_in_every_day_can_get_vote_v2": "تعال يوميًا وستحصل على [[{{num}}]] فرصة تصويت",
"vote_num_add": "فرص التصويت [[+{{num}}]]",
"confirm_": "تأكيد",
"vote_chance_done": "فرص التصويت [[+{{chance}}]] (تم الإنجاز: [[{{num}}]])",
"vote_chance_done_limit": "فرص التصويت [[+{{chance}}]] (تم الإنجاز: [[{{num}}]]/{{limit}})",
"vote_success": "التصويت ناجح",
"non_voting_hours": "لا يمكنك التصويت خارج ساعات التصويت",
"vote_chance_lack": "فرص التصويت غير كافية",
"insufficient_points": "نقاط غير كافية",
"vote_limit": "فقد وصل التصويت إلى الحد الأقصى",
"vote_failed": "فشل التصويت",
"odds": "احتمالات",
"playing": "يلعب",
"card_chance_lack": "فرص السحب غير كافية",
"get_color_card": "احصل على بطاقة واحدة من اللون المحدد",
"get_three_card": "احصل على 3 بطاقة من أي لون",
"get_five_card": "احصل على 5 بطاقة من أي لون",
"action_card": "بطاقة الحركة",
"choose_a_color": "الرجاء اختيار لون",
"got_a_new_card": "لقد حصلت على بطاقة جديدة.",
"action_card_unlocked": "تم فتح بطاقة الحركة!",
"claim_prize": "استلام الجائزة",
"vote_chances": "تذاكر",
"coin_log_mall": "استبدال النقاط",
"coin_log_vote": "التصويت في الفعالية",
"coin_log_expired": "انتهاء صلاحية النقاط",
"coin_log_reward": "مكافآت الفعالية",
"coin_log_task": "مكافآت المهام",
"coin_log_title": "نقاط",
"got": "تم الحصول على",
"deduct": "خصم",
"invite_friend_install_get_qa_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لتنزيل التطبيق، يمكنك الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة.",
"invite_friend_install_get_qa_limit_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لتنزيل التطبيق، يمكنك الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} فرصة.",
"invite_friend_register_get_qa_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لإكمال التسجيل، يمكنك الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة.",
"invite_friend_register_get_qa_limit_v2": "دعوة [[{{num}}]] صديق(أصدقاء) لإكمال التسجيل، يمكنك الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} فرصة.",
"qa_task_finish_v2": "عند الإكمال، يمكنك الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة.",
"qa_task_finish_limit_v2": "عند الإكمال، يمكنك الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} مرة.",
"qa_task_cond_all_v2": "إكمال جميع المهام سيمكنك من الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة",
"qa_task_cond_all_limit_v2": "إكمال جميع المهام سيمكنك من الحصول على [[{{chance}}]] فرصة للإجابة على الأسئلة، بحد أقصى {{limit}} فرصة، وقد حصلت على [[{{num}}]] فرصة",
"sign_in_every_day_can_get_qa_v2": "كل يوم ستحصل على [[{{num}}]] فرصة للإجابة على الأسئلة.",
"quiz_starting": "جارٍ بدء الاختبار...",
"quiz_ready": "استعد...",
"quiz_oops": "عذرًا!",
"quiz_question_progress": "السؤال [[{{num}}]] من [[{{x}}]]",
"quiz_back": "العودة إلى الاختبار",
"quiz_review_answers": "مراجعة الإجابات",
"quiz_question": "السؤال",
"quiz_no_answer_submitted": "لم يتم إرسال أي إجابة",
"quiz_perfect_score": "درجة كاملة!",
"quiz_correct_count": "أجبت بشكل صحيح عن [[{{num}}]] من أصل [[{{x}}]]!",
"quiz_good_job": "أحسنت!",
"quiz_round_complete": "اكتملت الجولة",
"quiz_correct": "صحيح",
"quiz_next": "التالي",
"quiz_home": "الرئيسية"
}

@ -0,0 +1 @@
{"deduct":"Odečíst","quiz_correct":"Správně","quiz_correct_count":"Správně jste odpověděli na [[{{num}}]] z [[{{x}}]]!","quiz_home":"Domů","quiz_next":"Další","quiz_question_progress":"Otázka [[{{num}}]] z [[{{x}}]]","quiz_round_complete":"Kolo dokončeno","quiz_chances":"Pokusy v kvízu","claim_it_now":"Získejte to hned!"}

@ -0,0 +1 @@
{"deduct":"Abziehen","quiz_correct":"Richtig","quiz_correct_count":"Du hast [[{{num}}]] von [[{{x}}]] richtig!","quiz_home":"Startseite","quiz_next":"Weiter","quiz_question_progress":"Frage [[{{num}}]] von [[{{x}}]]","quiz_round_complete":"Runde abgeschlossen","quiz_chances":"Quiz-Versuche","claim_it_now":"Jetzt abholen!"}

@ -0,0 +1,761 @@
{
"close": "Close",
"invite_share_text": "Join me to win rewards",
"copy_link": "Copy link",
"copy_success": "Copy successful",
"invite_friend": "Referral",
"invite_friend_": "SHARE",
"total_get": "Reward(s)",
"can_get": "Reward(s)",
"my_invite": "Invitation",
"invite_record": "Invitation Records",
"need_invite": "Next level",
"bonus_rules": "Reward rules",
"activity_rules": "Rules",
"invite_no_record": "No invitation records yet",
"invite_time": "Date",
"user_id": "User ID",
"reward_cond": "Rules",
"target_receive_prizes": "Contact us to claim your reward",
"receive_prizes": "Prize collection method",
"copy": "Copy",
"bonus_content": "Reward",
"prize_details": "Rewards",
"end_time": "END: ",
"start_time": "START: ",
"activity_time": "Event Time",
"extra_prizes": "Extra",
"quantity": "Qty",
"prize": "Reward",
"download_for_each_friend": "Every {{num}} Install",
"accumulate_friend_downloads": "Cumulative {{num}} Install",
"max_invite_friend": "Each user can refer maximum {{num}} friend(s)",
"register_for_each_friend": "Every {{num}} Register",
"accumulate_friend_register": "Cumulative {{num}} Register",
"my_task": "My Tasks",
"fans": "Referee",
"target_fans": "Achieved",
"install_and_finish_all_cond": "Your downline have to download and complete all tasks to qualify.",
"install_and_finish_one_cond": "Your downline have to download and complete a task to qualify.",
"completed": "Done",
"undone": "to do",
"friend_record": "Invitation Records",
"task_1": "Task 1",
"task_2": "Task 2",
"task_3": "Task 3",
"invite_friends_to_register": "Every {{num}} Register",
"invite_friends_to_install": "Every {{num}} Install",
"no_record": "No record yet",
"invite_friends_to_target": "Invite {{num}} friend(s) to complete the task",
"target_for_each_friend": "Every {{num}} referral(s) completes the task",
"accumulate_friend_target": "Cumulative {{num}} referrals complete the task",
"prize_list": "Reward List",
"regular_rewards": "Regular",
"extra_rewards": "Extra",
"activity_end_text": "This event has ended@Thank you for joining us@Hope see you again!",
"receive": "Redeem",
"contact_customer_service": "Please contact customer service to pick up",
"lottery": "Spin",
"draws_num": "Spins",
"better_luck_next_time": "Try your luck next time.",
"no_winning_record": "No record yet",
"prize_name": "Reward",
"lottery_service_err": "Service error, please try again later",
"draws_none": "The lottery has run out",
"confirm": "OK",
"try_your_luck": "FEEL LUCKY",
"get_prize_to_app": "Download the app to claim your prize now",
"target_cond_1": "Task 1",
"target_cond_2": "Task 2",
"target_cond_3": "Task 3",
"all_tasks_to_draw": "Your downline must download and complete all tasks to receive {{num}} draw(s)",
"one_tasks_to_draw": "Your downline must download and complete a task to receive {{num}} draw(s)",
"draws_obtained": "My Draw(s):",
"reward_record": "Reward Records",
"to_complete": "Go",
"completed_times": "Completed times",
"winning_record": "Reward Records",
"Winning_time": "Date",
"thank": "NEXT TIME",
"no_receive_record": "No record yet",
"week_0": "Sun",
"week_1": "Mon",
"week_2": "Tue",
"week_3": "Wed",
"week_4": "Thu",
"week_5": "Fri",
"week_6": "Sat",
"invite_friend_install_get_sign": "Invite {{num}} friend(s) to download the app and you will receive one makeup card.",
"invite_num": "Referrals: {{num}}",
"sign_day_num": "Check in {{num}} day(s)",
"continue_day_num": "Checked-in consecutively for {{num}} Day(s)",
"day": "Day",
"sign_card": "Make up for a missed day",
"invite_friend_get_sign_card_text": "Missed a day? Invite friends to download and earn a makeup card!",
"obtain": "Get",
"use_sign_card": "Use a makeup card",
"confirm_use_sign_card": "Are you sure to use it on {{m}}/{{d}}?",
"sign_success": "Checked-in",
"you_got": "You've got ",
"i_see": "Got it",
"done_sign_day_num": "Checked in {{num}} day(s)",
"done_continue_day_num": "Checked-in consecutively for {{num}} day(s)",
"sign_ok": "Checked in",
"card_sign_ok": "Make-up success",
"continue_sign_ok": "Checked in",
"continue_sign_get_reward_text": "Hit the Streak to win rewards",
"sign_get_reward_text": "Check-in daily to win rewards!",
"sign_card_lack": "Lack of makeup card",
"sign_fail": "Check in failed, please refresh the page",
"best_fan": "Top Fans",
"top_fans": "Top Fans",
"invite_num_title": "Referral",
"no_rank_record": "No record yet",
"vote_none": "The vote has run out",
"vote_service_err": "Service error, please try again later",
"hour": "h",
"minute": "min",
"second": "s",
"hour_f": "HOUR",
"minute_f": "MINUTE",
"second_f": "SECOND",
"vote_num": "There are currently {{num}} votes available",
"here_is_the_quiz_title": "The quiz title is shown here",
"option": "option",
"countdown": "COUNT DOWN",
"end": "END",
"click_image_select": "Click image to select",
"wait_reward_reward": "Please come back later for results",
"sure": "OK",
"submit": "SUBMIT",
"next_qa": "NEXT",
"right": "CORRECT",
"error": "WRONG",
"right_answer": "Correct answer:",
"explain": "Explanation",
"home": "HOME",
"share": "Share",
"download_app_qa": "Download app to join the quiz",
"qa_service_err": "Service error, please try again later",
"qa_none": "You don't have any answering opportunities yet. @Please invite friends to get more chances.",
"start": "START",
"challenge_failed": "FAILED",
"qa_right": "Correct ",
"keep_try": "KEEP TRYING",
"congratulation": "CONGRATS!",
"please_choose": "SELECT",
"qa_loading": "loading...",
"grow_big": "{{name}} has grown up",
"click_receive": "GET",
"after_receive": "to get",
"tree_grow_can_get": "Plant the tree and you will receive it.",
"fertilize_standard_text": "Just apply {{num}}% more fertilizer, and you will meet the goal!",
"fertilize": "Fertilize",
"fertilizer": "Fertilizer",
"need_nutrients_will_die": "I need {{num}}g fertilizer to keep me healthy.",
"get_new_tree": "Get a new sapling.",
"tree_grow_max_text": "Your tree has grown, here's a little gift for you.",
"little_tree": "my tree",
"fertilize_num": "Fertilize {{num}}g",
"some_withered": "{{name}} is withered",
"some_revive": "{{name}} is back to life.",
"grow_big_and_get_reward": "{{name}} has grown up, you just get {{reward_title}",
"get_grow": "Get {{name}}",
"props_lack": "Not enough props.",
"cannot_lv_up": "You've reached the highest level.",
"invite_friend_install_get_fertilizer": "Invite {{num}} friend to download App, you will receive {{grow_num}} fertilizer.",
"received_sapling": "You have received a sapling.",
"pick_name": "Choose a name",
"growth_manual": "Guide to Growth",
"get_nourishment": "Get fertilizer",
"plant_new_tree": "Plant a tree",
"tree_revive": "Save your tree",
"timeout_tree_die": "Due to a lack of fertilization for a long time, your tree has withered",
"invite_friend_install_revive_tree": "Invite {{num}} friends to download the app and you can save your tree",
"dog_grow_can_get": "Raise the puppy and you will receive it",
"feed_standard_text": "Just feed {{num}}% more to meet the goal!",
"feed": "Feed",
"dog_food": "Dog food",
"need_dog_food_will_leave": "I need {{num}}g food, or I might have to go on a little adventure outside our cozy home. Woof!",
"get_new_dog": "Adopt a puppy",
"dog_grow_max_text": "Your puppy has grown up, here's a little gift for you",
"little_dog": "Puppy",
"feed_num": "Feed {{num}}g food",
"some_leave": "{{name}} has left",
"some_come": "{{name}} is back",
"invite_friend_install_get_dog_food": "Invite {{num}} friend(s) to download App, you will receive {{grow_num}}g food",
"received_dog": "You adopt a puppy",
"get_dog_food": "Get food",
"plant_new_dog": "Adopt a dog",
"rescue_puppy": "Save the puppy",
"timeout_dog_go": "Because it hasn't felt love and food for a long time, your puppy has run away from home",
"invite_friend_install_rescue_puppy": "Invite {{num}} friend(s) to download the app and you can save your puppy.",
"get_collect_num": "You have received 1 piece of {{reward_title}}.",
"fixed_point": "Specified Number",
"this_props_lack": "You don't have this item yet.",
"help_record": "Invitation Records",
"no_help_record": "No record yet",
"install_help_record": "A friend downloaded the app",
"open_help_record": "A friend opened the app",
"click_help_record": "A friend clicked the link",
"service_err": "Service error, please try again later",
"select_reward": "Select Reward",
"view_help_rule": "Check Rules",
"help_rule": "Invite Rules",
"install_help": "Download App to Boost",
"install_help_text": "Each friend downloaded the app, progress [[+{{num}}%]]",
"open_help": "Open App to Boost",
"open_help_text": "Each friend opened the app, progress [[+{{num}}%]], up to {{limit_num}}%",
"click_help": "Click Link to Boost",
"click_help_text": "Each friend clicked the invitation link, progress [[+{{num}}%]], up to {{limit_num}}%",
"invite_friends_receive_free_gifts": "Invite friends to get free rewards!",
"get_prizes": "Get this reward",
"help_success": "SUCCESS",
"also_get_free": "You can also get it for free",
"install_get_free_reward": "Download the app to get free rewards",
"install_get_reward": "Get the App, Unlock Prizes",
"received_success": "success",
"ballot_record": "REWARD RECORD",
"no_ballot_record": "No record yet",
"ballot_none": "You don't have any opportunities yet. Please invite friends to get more chances.",
"share_good_luck": "Share the luck",
"ballot": "GOT IT",
"answer_record": "REWARD RECORD",
"challenge_results": "REWARD",
"challenge_time": "DATE",
"no_answer_record": "No record yet",
"answer_none": "The quiz has run out.",
"please_choose_answer": "Please select an answer",
"answer_countdown": "COUNTDOWN",
"got_prizes": "WIN:",
"continue_free_get": "Continue slashing",
"finish_help": "Complete",
"reward_send_your_account": "The reward has been sent to your account",
"no_reward_record": "No record yet",
"download_app_ballot": "Download the app to join the campaign",
"yesterday": "Yesterday",
"today": "Today",
"prize_record": "REWARD RECORD",
"get_reward_time": "DATE",
"no_sign_card": "I haven't signed a replacement card yet",
"get_more_knowledge": "TRY YOUR LUCK NEXT TIME",
"qa_very_hard": "WHO IS THE SMART MAN?",
"num": "QUIZ",
"contact_customer_service_var": "Please contact ({{contact}})",
"like_share_people_lucky": "Shared people have better luck. Share now!",
"my_reward": "My prize",
"no_install_prompt": "That social media platform is not installed.",
"please_login": "Please login",
"got_num": "(Obtained {{num}} times)",
"completed_num": "(Done {{num}})",
"fixed_roll_none": "You don't have a lucky dice yet. Invite {{num}} friend(s) to download the app and get 1 lucky dice.",
"fixed_roll_none_limit": "No lucky dice yet. Invite {{num}} friend(s) to download the App to get 1 lucky dice, up to a maximum of {{limit}} lucky dice(s).",
"invite_friend_install_get_roll_chance": "Invite {{num}} friend(s) to download the app and get {{chance}} lucky dice(s).",
"invite_friend_install_get_roll_chance_limit": "Invite {{num}} friend(s) to download the App and get {{chance}} dice(s), up to a maximum of {{limit}} dice(s).",
"invite_friend_register_get_roll_chance": "Invite {{num}} friend(s) to complete registration to receive {{chance}} dice(s).",
"invite_friend_register_get_roll_chance_limit": "Invite {{num}} friend(s) to complete registration to receive {{chance}} dice(s), up to a maximum of {{limit}} dice(s).",
"dice_task_finish": "Complete to receive {{chance}} dice(s)",
"dice_task_finish_limit": "Complete to receive {{chance}} dice(s), up to {{limit}} completion(s).",
"dice_task_num": "Total dice obtained from tasks:",
"dice_task_cond_one": "Complete any task to get more dice.",
"dice_task_cond_all": "Complete all tasks to get {{chance}} dice(s).",
"dice_task_cond_all_limit": "Complete all tasks to get {{chance}} dice(s), up to a maximum of {{limit}} time(s). You have obtained {{num}} time(s) so far.",
"spin_now": "Spin now",
"spinning": "Spinning",
"expires_in": "Expires In",
"records": "Records",
"luck_you": "Lucky you",
"get_extra_reward": "Extra bonus for you!",
"share_get": "Share to get your",
"upgrade_reward": "upgrade reward",
"super_upgrade": "Surprise! Super upgrade!",
"preparation": "Per spin",
"invite_get_energy": "Invite to get Energy",
"invite_friend_get_energy": "Invite friends to get energy",
"up_to": "Up To",
"spin": "Spin",
"away": "{{num}} away",
"win_left_energy": "win {{cash}} with just {{num}} spin",
"enjoy_credit": "Enjoy your credit",
"invite_no_record_reward": "You haven’t invited anyone yet, Invite friends to receive rewards!",
"spin_reward": "Spin reward",
"share_reward": "Share reward",
"start_reward": "Start incentive",
"left_cash_get_reward": "Only {{left}} left to get {{cash}} reward",
"auto_spin": "Spin automatically in [[{{second}}]] s",
"guarantee_to": "Guarantee to win {{cash}} with just 1 spin!",
"auto_select": "Select automatically in [[{{second}}]] s",
"open": "Open",
"select_box": "Pick 1 gift box to see how much Money Reward will you get",
"money_reward": "Money Reward",
"jackpot_best_prize": "Jackpot!Best Prize",
"best_prize": "Best&&Prize",
"almost_reward": "Almost to the reward!",
"claimed_reward": "Over [[10000+]] people have claimed Reward",
"pass_on_energy": "They passed on Energy to you!",
"victory_tip": "victory is within your reach, [[seize it]]",
"min_won_barrage": "{{name}} Won [[{{cash}}]] {{min}} mins ago Great!",
"closer_to_prize": "you are getting closer to the big prize",
"shine_arrived": "your moment to shine hash arrived grab it",
"get_money_reward": "Get Money Reward",
"won_barrage": "[[{{name}}]] has claimed [[{{cash}}]]",
"surprise_for_you": "Surprise for you",
"last_spin_win": "Just 1 last spin to win!",
"energy": "Energy",
"token": "Token",
"your_reward": "YOUR REWARD",
"go_to": "To Use",
"click_contact": "Contact Customer Service",
"click_contact_tip": "Contact information has been copied\nPlease contact us",
"see_reward": "View Prizes",
"prize_gone": "Prizes are gone",
"no_reward_get": "You're too late, all the prizes have been given out!",
"no_more_record": "No more records",
"help_fail": "FAILED",
"grand_opening": "Grand Opening",
"get_reward_after_play": "Everyone will receive a reward after playing the game!",
"play_and_get_prize": "Play to get your prize!",
"won_free_gift": "You won the free gift!",
"download_app_get_gift": "Download App to get your prize!",
"download": "Download",
"jackpot": "JACKPOT",
"play": "Play",
"install_ineligible": "Ineligible (Not new install)",
"unlock_your_luck": "Unlock Your Luck",
"spin_and_win": "Spin and Win",
"play_to_win_prize": "Play to win a prize!",
"you_got_the_best_prize": "You Got The Best Prize",
"play_and_win": "Play and Win",
"download_to_get": "download to get",
"best_prize_!": "BEST PRIZE!",
"roll_dice_number": "Roll dice, number {{point}}",
"lucky_dice_number": "Use lucky dice, number {{point}}",
"day_sign": "Daily check-in",
"dice_record": "Records",
"finish_friend_register": "Complete friend registration task",
"finish_friend_install": " Complete the recommended app download task",
"finish_lucky_dice_task": "Complete the lucky dice task",
"fragment": "Fragment",
"click": "click",
"collect_fragment_compare_reward": "Collect {{num}} fragments to craft the prize",
"craft_fragments": "Craft Fragments",
"reward_lack_contact_customer_service": "Out of stock. Please contact customer service for assistance.",
"join_in_campaign": "Join In Campaign",
"contact": "Contact",
"all": "All",
"contact_information": "Contact Information",
"no_more_dice": "No More Dice",
"try_your_luck_first_upper": "Try your luck",
"fill_in": "Fill In",
"submit_success": "Success",
"please_do_not_submit_repeatedly": "Please do not submit repeatedly",
"submitted": "SUBMITTED",
"please_complete_the_form": "Please complete the form",
"welcome_gifts": "Welcome gifts",
"spin_to_win": "Spin to win",
"view": "view",
"use": "Use",
"get_and_use": "Claim and Use",
"invite_friend_install_get_lottery_chance": "Invite {{num}} friend(s) to download the App, and you'll get {{chance}} chance(s).",
"invite_friend_install_get_lottery_chance_limit": "Invite {{num}} friend(s) to download the App, and you'll get {{chance}} chance(s), up to a maximum of {{limit}} chance(s).",
"invite_friend_register_get_lottery_chance": "Invite {{num}} friend(s) to complete registration, and you'll get {{chance}} chance(s).",
"invite_friend_register_get_lottery_chance_limit": "Invite {{num}} friend(s) to complete registration, and you'll get {{chance}} chance(s), up to a maximum of {{limit}} chance(s).",
"lottery_task_finish": "You'll get {{chance}} chance(s) upon completion",
"lottery_task_finish_limit": "You'll get {{chance}} chance(s) upon completion, up to a maximum of {{limit}} time(s)",
"lottery_task_num": "The total chances obtained from the tasks",
"lottery_task_cond_one": "Complete tasks to get chances",
"lottery_task_cond_all": "Completing all tasks can result in obtaining {{chance}} chance(s)",
"lottery_task_cond_all_limit": "Completing all tasks can result in obtaining {{chance}} chance(s), up to a maximum of {{limit}} time(s), and {{num}} time(s) have been obtained.",
"raffle_chances": "Chance",
"quiz_chances": "Quiz Chances",
"get_lottery_chances": "Get Lottery Chances",
"remaining_raffle_chances": "Remaining chances",
"lottery_again": "Again",
"use_immediately": "Use Now",
"wow_you_got": "Wow! You've got",
"next_time": "Next Time",
"finish_all_task": "Tasks Done",
"finish_one_task": "Task Done",
"sign_in_every_day_can_get_dice": "Sign in every day , you can get {{num}} dice(s).",
"do_task_get_dice": "Do Tasks And Get Dice",
"do_task_get_lottery": "Do Tasks And Get Chance",
"refresh_tomorrow": "Refresh Tomorrow",
"click_icon": "Click Icon",
"paste_to_media": "Paste To Media",
"get_prize": "Get Prizes",
"copy_success_paste_to_media": "Copied success, please paste to social media",
"invite_friend_install_get_grow": "Invite {{num}} friend(s) to download the App and receive {{chance}} growth items.",
"invite_friend_install_get_grow_limit": "Invite {{num}} friend(s) to download the App and receive {{chance}} growth items, up to a maximum of {{limit}} growth items.",
"invite_friend_register_get_grow": "Invite {{num}} friend(s) to complete registration and receive {{chance}} growth items.",
"invite_friend_register_get_grow_limit": "Invite {{num}} friend(s) to complete registration and receive {{chance}} growth items, up to a maximum of {{limit}} growth items.",
"grow_task_finish": "Complete to get {{chance}} growth items",
"grow_task_finish_limit": "Complete to get {{chance}} growth items, complete up to {{limit}} time(s)",
"grow_task_cond_one": "Complete any task to get growth items",
"grow_task_cond_all": "Complete all tasks to get {{chance}} growth items",
"grow_task_cond_all_limit": "Complete all tasks to get {{chance}} growth items, up to {{limit}} time(s), already got {{num}} time(s)",
"do_task_get_grow": "Complete tasks to get growth items",
"easy_mode": "Easy Mode",
"mins_ago": "{{min}} mins ago",
"barrage_got_reward": "has got [[{{title}}]] by playing lucky draw.",
"sold_out": "sold out",
"task_done": "Task Done",
"click_copy_link": "Click \"Copy Link\"",
"select_card": "Select a card",
"raffle_chances_lack": "Not enough opportunities",
"raffle_chances_lack_tip": "You do not have enough chances for the lucky draw. Go to the bottom of the page to complete tasks and earn more chances.",
"get_more_chance": "Get more opportunities",
"flip_now": "Flip Now",
"raffle_num": "Chance",
"win": "Win",
"next_week_do": "Next Week",
"week_do_1": "Refresh On Mon",
"week_do_2": "Refresh On Tue",
"week_do_3": "Refresh On Wed",
"week_do_4": "Refresh On Thu",
"week_do_5": "Refresh On Fri",
"week_do_6": "Refresh On Sat",
"week_do_7": "Refresh On Sun",
"to_flip": "Go draw a card",
"won_get": "Congratulations",
"invite_friend_download": "Invite {{num}} friend(s) to download the App",
"invite_friend_register": "Invite {{num}} friend(s) to register",
"fixed_roll_none_register": "No lucky dice yet. Invite {{num}} friend(s) to register and get 1 lucky dice.",
"fixed_roll_none_register_limit": "No lucky dice yet. Invite {{num}} friend(s) to register and get 1 lucky dice, up to a maximum of {{limit}} lucky dice(s).",
"sign_in_every_day_can_get_lottery": "Sign in every day to get {{num}} chance(s) to win a prize.",
"finish_newcomer_task": "[[Newcomer]] complete tasks to earn [[{{reward_title}}]]",
"done_newcomer_task": "Newcomer tasks",
"register_help_record": "A friend has completed the registration",
"register_help_text": "Each friend has completed the registration, progress [[+{{num}}%]]",
"register_help": "Registration Boost",
"invite_friend_install_get_qa": "Invite {{num}} friends to download the App and get {{chance}} chances to answer questions.",
"invite_friend_install_get_qa_limit": "Invite {{num}} friends to download the App and get {{chance}} chances to answer questions, with a maximum of {{limit}} chances.",
"invite_friend_register_get_qa": "Invite {{num}} friends to complete registration and get {{chance}} chances to answer questions.",
"invite_friend_register_get_qa_limit": "Invite {{num}} friends to complete registration and get {{chance}} chances to answer questions, with a maximum of {{limit}} chances.",
"qa_task_finish": "Completing it will earn you {{chance}} chances to answer questions.",
"qa_task_finish_limit": "Completing it will earn you {{chance}} chances to answer questions, with a maximum of {{limit}} completions.",
"qa_task_cond_one": "Completing any task will earn you a chance to answer questions",
"qa_task_cond_all": "Completing all tasks will earn you {{chance}} chances to answer questions",
"qa_task_cond_all_limit": "Completing all tasks will earn you {{chance}} chances to answer questions, with a maximum of {{limit}} chances, and you have already received {{num}} chances",
"sign_in_every_day_can_get_qa": "Every day you will receive {{num}} chances to answer questions.",
"do_task_get_qa": "Complete tasks to earn chances to answer questions",
"help_install": "[[{{name}}]] received [[installation support]]",
"help_register": "[[{{name}}]] received [[registration support]]",
"help_open": "[[{{name}}]] received [[daily visit boost]]",
"help_click": "[[{{name}}]] received [[click support]]",
"finish_help_get_reward": "[[{{name}}]] completed the support task and received [[{{reward_title}}]]",
"a_gift_to_you": "A Gift for You",
"choose_it": "Choose It",
"nice_choice": "Nice Choice!",
"tip": "Tip",
"left_percent_get_reward": "Only [[{{left}}%]] left to get reward",
"ensure_select_reward": "Confirm selection [[{{reward_title}}]]?",
"reward_obtained": "Reward obtained",
"lucky": "Lucky",
"percent_progress_for_you": "You've got a free [[{{percent}}%]] boost!",
"invite": "Invite",
"help_task": "Boost Task",
"finish_all_task_help_parent": "Complete all the following tasks to boost your friend",
"finish_one_task_help_parent": "Complete any of the following tasks to boost your friend",
"task_index": "Task {{index}}",
"raise_pet_to_get_free_gift": "Raise your pet to get free gifts",
"step": "STEP",
"pick_item": "Pick item",
"raise_pet": "Raise Pet",
"get_free_gift": "Get free gift",
"has_got": "{{name}} has got {{reward_title}}",
"more_unexpected_gifts": "More unexpected gifts during raising your pet",
"pick_it": "Pick it",
"picked": "picked",
"your_gift_confirm": "Please confirm your gift",
"free": "Free",
"raise_the_dog_to_get_your": "raise the dog to get your",
"free_gift": "FREE GIFT!",
"expires_in_day": "Expires in {{day}} days",
"collect_more_love": "Collect [[{{num}}]] more love points to get a FREE gift",
"collect": "Collect",
"claim_now": "Claim now",
"feed_more_times": "Feed {{num}} more times",
"get_more": "Get More",
"first_referral_bonus": "First referral bonus!",
"get_rewards_first_time": "Get rewards by inviting friends for the first time",
"first_invite_receive": "The first invitation to a new user will receive [[{{num}}]]",
"invite_now": "invite now",
"invite_get_dog_foods": "Invite friends to earn Food",
"invite_friends": "invite friends",
"pick_a_gift": "Pick 1 free gift",
"feed_3_times": "Feed 3 times",
"invite_new_user_extra_get": "Invite new user for the first times can get extra [[{{num}}]]",
"reward_upgraded": "Reward upgraded",
"reward_for_you": "[[{{reward_title}}]] for you",
"time_s_up": "Time’s up!",
"play_again": "Play Again",
"complete_tasks_to_earn_reward": "Complete tasks to earn Reward",
"super": "SUPER",
"super_benefit": "Super Benefit",
"task_cond_one": "Complete any task to receive a [[reward]]",
"task_cond_all": "Complete all tasks to earn {{reward_title}}[[+{{num}}]]",
"congrats": "Congrats!",
"enjoy_your": "Enjoy your",
"try_again_to_claim": "Try again to claim your gift",
"collect_love": "Collect love",
"finish_step": "Completed stage task",
"finish_feed": "Completed feeding task",
"friend_third_feed": "Friend completed feeding dog food 3 times",
"friend_first_third_feed": "Daily invite friends to complete feeding dog food 3 times",
"friend_select_reward": "Friend has chosen the prize",
"friend_first_select_reward": "Daily invite friends to choose the prize",
"rewards": "Rewards",
"round_expired": "Round Expired",
"love_points": "Love Points",
"dog_food_lack": "Please go get more dog food",
"collect_machine": "The dog food machine has been received",
"max_grow": "Exceeded the maximum development times",
"please_collect_love": "Please collect love first",
"continue_grow": "The current pet can still be kept",
"dog_food_machine_running": "Dog food is in production",
"reward_remove": "The prize has been taken down",
"reward_get_max": "The prize has exceeded the maximum limit of acquisition",
"i_am_hungry": "I'm hungry!",
"effect_invite": "Successfully invited a friend",
"day_first_effect_invite": "Successfully invited a friend for the first time on the same day",
"finish_many_feed": "Completed multiple feedings",
"daily_rewards": "Daily rewards",
"come_back_tomorrow_for_more_rewards": "Come back tomorrow for more rewards!",
"claim_today_reward": "Claim today's reward!",
"come_back_tomorrow": "Come back tomorrow!",
"fail_to_sign_progress_reset": "If you fail to sign in continuously, your progress will be reset",
"signed_in": "Signed in",
"signed_title": "Sign-in",
"you_got_the_gift_box": "You’ve got the gift box",
"use_it": "Use it",
"you_got_dog_food": "You’ve got {{num}} of dog food",
"you_got_reward": "You’ve got {{reward_title}}",
"invite_contest": "Invite contest",
"rewards_earned_to_your_account": "Rewards earned will [[go straight to]] your account",
"invite_more_friends": "Invite more friends",
"invited": "{{num}} Invited",
"daily_fortune_draw": "Daily fortune draw",
"win_free_gift_every_day": "Win free gift every day!",
"draw_now": "Draw now",
"day_num": "Day {{num}}",
"you": "You",
"blind_box": "Blind Box",
"daily_draw": "Daily Draw",
"rankings": "Rankings",
"rank_reward": "Ranking Rewards",
"sign_reward": "Sign-in Rewards",
"blind_reward": "Blind Box Rewards",
"lucky_reward": "Lottery Rewards",
"tomorrow": "Tomorrow",
"win_reward": "Win[[{{title}}]]",
"rank_end": "Time's up",
"congrats_for_getting": "Congrats for getting",
"ends_in": "Ends in",
"invite_friend_download_app": "Invite [[{{num}}]] friend(s) to download the App",
"invite_friend_register_app": "Invite [[{{num}}]] friend(s) to register",
"invite_friend_install_get_lottery_chance_v2": "Invite [[{{num}}]] friend(s) to download the App, and you'll get [[{{chance}}]] chance(s).",
"invite_friend_install_get_lottery_chance_limit_v2": "Invite [[{{num}}]] friend(s) to download the App, and you'll get [[{{chance}}]] chance(s), up to a maximum of {{limit}} chance(s).",
"invite_friend_register_get_lottery_chance_v2": "Invite [[{{num}}]] friend(s) to complete registration, and you'll get [[{{chance}}]] chance(s).",
"invite_friend_register_get_lottery_chance_limit_v2": "Invite [[{{num}}]] friend(s) to complete registration, and you'll get [[{{chance}}]] chance(s), up to a maximum of {{limit}} chance(s).",
"lottery_task_finish_v2": "You'll get [[{{chance}}]] chance(s) upon completion",
"lottery_task_finish_limit_v2": "You'll get [[{{chance}}]] chance(s) upon completion, up to a maximum of {{limit}} time(s)",
"lottery_task_cond_all_v2": "Completing all tasks can result in obtaining [[{{chance}}]] chance(s)",
"lottery_task_cond_all_limit_v2": "Completing all tasks can result in obtaining [[{{chance}}]] chance(s), up to a maximum of {{limit}} time(s), and [[{{num}}]] time(s) have been obtained.",
"sign_in_every_day_can_get_lottery_v2": "Sign in every day to get [[{{num}}]] chance(s) to win a prize.",
"invite_friends_to_earn_reward": "Invite friends to earn Reward",
"raffle_num_add": "Chance [[+{{num}}]]",
"click_button_and_get_coins": "Click button to complete the task and get more coins",
"do_task_get_energy": "Complete tasks to gain energy",
"coins": "{{num}} Coins",
"get_tasks": "Get Tasks",
"next": "Next",
"finish_task_title": "Completed \"{{title}}\"",
"get_energy": "Get Energy",
"tasks": "Tasks",
"invite_friend_install_get_gold": "Invite {{num}} friends to download the app to earn {{chance}} coins.",
"invite_friend_install_get_gold_limit": "Invite {{num}} friends to download the app to earn {{chance}} coins, with a maximum of {{limit}} coins.",
"invite_friend_register_get_gold": "Invite {{num}} friends to complete registration to earn {{chance}} coins.",
"invite_friend_register_get_gold_limit": "Invite {{num}} friends to complete registration to earn {{chance}} coins, with a maximum of {{limit}} coins.",
"gold_task_finish": "Complete to earn {{chance}} coins",
"gold_task_finish_limit": "Complete to earn {{chance}} coins, up to a maximum of {{limit}} times",
"gold_task_cond_one": "Complete any task to earn coins",
"gold_task_cond_all": "Complete all tasks to earn {{chance}} coins",
"gold_task_cond_all_limit": "Complete all tasks to earn {{chance}} coins, up to a maximum of {{limit}} times, you have received {{num}} times",
"do_task_get_gold": "Complete tasks to earn coins",
"task_none": "There are no tasks available to complete",
"finish_task_earn_num": "Complete the task to earn [[+{{num}}]]",
"reached_the_max": "Reached the max",
"has_got_style": "[[{{name}}]] has got [[{{reward_title}}]]",
"dog_food_num": "{{num}}g food",
"in_production": "In production",
"active_talk": "You haven't visited me for a long time. Come more often to get more rewards.",
"task_reset_talk": "One of your prizes is about to expire, come and check it out.",
"dog_offline_talk": "You have received a portion of pet food, please go and claim it.",
"complete_task_talk": "You have completed the task, congratulations on receiving a prize, come and claim it.",
"current_total_prize_pool": "Current Total Prize Pool",
"get_coin": "[[{{name}}]] Gained [[{{num}}]] coins",
"join_coin_num": "[[{{name}}]] Grab gold [[*{{num}}]]",
"join_coin": "Grab Gold",
"coin_per_use": "{{num}} gold coins per use",
"expected_to_receive_coin": "Expected to receive [[{{num}}]] gold coins",
"collect_coin": "[[{{num}}]] gold coins can be collected",
"expired": "Expired",
"gold_coins_deposited": "Gold coins deposited",
"timeout_and_no_collection": "Timeout and not claimed",
"use_gold_coins_to_play": "Use [[{{num}}]] gold coins to play?",
"more": "More",
"cancel": "Cancel",
"play_limit_next_round": "You’ve hit the play limit! Come back for the next round!",
"insufficient_balance_grab_gold": "Insufficient balance. Cannot Grab Gold",
"do_task": "Do Tasks",
"this_round_has_ended": "This round has ended",
"claim": "Claim",
"claim_it_now": "Claim it now!",
"claim_time_not_reached": "Claim time not reached",
"success": "Success",
"too_late_reward_expired": "Too late! Reward expired",
"no_duplicate_claims": "No duplicate claims",
"buy_more": "Buy More",
"operation_failed": "Operation failed. Please try again later",
"expected_to_be_available_tomorrow": "Expected to be available tomorrow",
"expected_to_be_available_in_day": "Expected to be available in {{day}} days",
"num_gold_coins": "[[{{num}}]] coins",
"check_in_now": "Check in now",
"complete_daily_check_ins_for_prizes": "Complete daily check-ins for prizes",
"check_in_days": "Check-in Days",
"lottery_chance_done": "Chance [[+{{chance}}]] (Done: [[{{num}}]])",
"lottery_chance_done_limit": "Chance [[+{{chance}}]] (Done: [[{{num}}]]/{{limit}})",
"claim_failed": "Claim Failed. Please contact customer support.",
"answer_tomorrow_get_chance": "Get {{chance}} more chances to answer tomorrow",
"finish_invite_task": "Invitation task completed",
"dice_chance_done": "Dice [[+{{chance}}]] (Done: [[{{num}}]])",
"dice_chance_done_limit": "Dice [[+{{chance}}]] (Done: [[{{num}}]]/{{limit}})",
"grow_chance_done": "Growth Items [[+{{chance}}]] (Done: [[{{num}}]])",
"grow_chance_done_limit": "Growth Items [[+{{chance}}]] (Done: [[{{num}}]]/{{limit}})",
"qa_chance_done": "Quiz Chance [[+{{chance}}]] (Done: [[{{num}}]])",
"qa_chance_done_limit": "Quiz Chance [[+{{chance}}]] (Done: [[{{num}}]]/{{limit}})",
"help_wait": "In progress",
"distributing": "Distributing",
"distribution_failed": "FAILED",
"claimed": "Claimed",
"no_prizes_to_claim": "No prizes available for you to claim",
"points_use": "Used {{num}} points",
"points_use_ok": "Exchange Successful",
"points_use_lack": "Insufficient points",
"points_use_close": "Exchange function is closed",
"points_use_day_limit": "Daily exchange limit reached",
"points_use_limit": "Exchange limit reached",
"points_use_dice": "Use [[{{num}}]], exchange for [[{{chance}}]] dice?",
"points_use_lottery": "Use [[{{num}}]], exchange for [[{{chance}}]] chance?",
"times": "Times",
"dice": "Dice",
"one_spin": "1 spin",
"raise_the_pet_to_get_your": "Raise pets to gain your",
"pet_food_num": "{{num}}g pet food",
"pet_food": "Pet food",
"friend_third_feed_pet": "Your friend has fed pets 3 times",
"friend_first_third_feed_pet": "Invite friends daily to feed pets 3 times",
"collect_machine_food": "The pet food machine has been received",
"pet_food_lack": "Please go to get more pet food",
"pet_food_machine_running": "Pet food is being produced",
"chat_day_limit": "I'm a bit tired today",
"chat_token_limit": "I'm very tired",
"chat": "Chat",
"hours_ago": "{{hour}} hours ago",
"conversation_and_chat": "You can start a conversation and chat with your pet",
"invite_friend_install_get_vote_chance": "Invite {{num}} friends to download the app to get {{chance}} voting chances.",
"invite_friend_install_get_vote_chance_limit": "Invite {{num}} friends to download the app to get {{chance}} voting chances, with a maximum of {{limit}} chances.",
"invite_friend_register_get_vote_chance": "Invite {{num}} friends to complete registration to get {{chance}} voting chances.",
"invite_friend_register_get_vote_chance_limit": "Invite {{num}} friends to complete registration to get {{chance}} voting chances, with a maximum of {{limit}} chances.",
"vote_task_finish": "Completing will give you {{chance}} voting chances",
"vote_task_finish_limit": "Complete to earn {{chance}} vote chances, max {{limit}} times",
"vote_task_num": "Vote chances earned from tasks",
"vote_task_cond_one": "Complete any task to earn vote chances",
"vote_task_cond_all": "Complete all tasks to get {{chance}} vote chances",
"vote_task_cond_all_limit": "Complete all tasks to get {{chance}} vote chances, max {{limit}}, already got {{num}}",
"do_task_get_vote": "Earn vote chances by doing tasks",
"sign_in_every_day_can_get_vote": "Come daily to receive {{num}} vote chances",
"your_choice": "Your Choice",
"cap_win": "WIN",
"cap_draw": "DRAW",
"blue_team": "Blue",
"red_team": "Red",
"spend_coin_to_vote_team": "Are you sure you want to spend [[{{coin}}]] to vote for <<{{title}}>>?",
"vote_team": "Are you sure you want to vote for [[{{title}}]]?",
"vote_sure": "Confirm vote?",
"no_scheduled": "No matches scheduled",
"schedule": "Schedule",
"in_progress": "In Progress",
"participated": "Participated",
"vote_soon": "Vote Soon",
"vote": "Vote",
"pending": "Pending",
"settled": "Settled",
"spend_coin_redeem_reward": "Are you sure you want to spend [[{{coin}}]] to redeem <<{{title}}>>?",
"redeem_sure": "Confirm redemption?",
"prize_restocking": "Prize restocking in progress...",
"redeem": "Redeem",
"invite_friend_install_get_vote_chance_v2": "Invite [[{{num}}]] friends to download the App to get [[{{chance}}]] vote chances.",
"invite_friend_install_get_vote_chance_limit_v2": "Invite [[{{num}}]] friends to download the App to get [[{{chance}}]] vote chances, up to {{limit}} vote chances.",
"invite_friend_register_get_vote_chance_v2": "Invite [[{{num}}]] friends to complete registration to get [[{{chance}}]] vote chances.",
"invite_friend_register_get_vote_chance_limit_v2": "Invite [[{{num}}]] friends to complete registration to get [[{{chance}}]] vote chances, up to {{limit}} vote chances.",
"vote_task_finish_v2": "Complete to get [[{{chance}}]] vote chances",
"vote_task_finish_limit_v2": "Complete to get [[{{chance}}]] vote chances, max {{limit}} times",
"vote_task_cond_all_v2": "Complete all tasks to get [[{{chance}}]] vote chances",
"vote_task_cond_all_limit_v2": "Complete all tasks to get [[{{chance}}]] vote chances, max {{limit}}, already got [[{{num}}]]",
"sign_in_every_day_can_get_vote_v2": "Come daily and get [[{{num}}]] vote chances",
"vote_num_add": "Vote chances [[+{{num}}]]",
"confirm_": "Confirm",
"vote_chance_done": "Vote chances [[+{{chance}}]] (Completed: [[{{num}}]])",
"vote_chance_done_limit": "Vote chances [[+{{chance}}]] (Completed: [[{{num}}]]/{{limit}})",
"vote_success": "Vote successful",
"non_voting_hours": "You cannot vote during non-voting hours",
"vote_chance_lack": "Insufficient voting opportunities",
"insufficient_points": "Insufficient points",
"vote_limit": "The voting has reached the maximum limit",
"vote_failed": "Vote failed",
"odds": "Odd",
"playing": "Playing",
"card_chance_lack": "Insufficient draw chances",
"get_color_card": "Get 1 card of the specified color",
"get_three_card": "Get 3 cards of any color",
"get_five_card": "Get 5 cards of any color",
"action_card": "Action Card",
"choose_a_color": "Please choose a color",
"got_a_new_card": "You got a new card.",
"action_card_unlocked": "ACTION CARD UNLOCKED!",
"claim_prize": "Claim Prize",
"vote_chances": "Tickets",
"coin_log_mall": "Points Redemption",
"coin_log_vote": "Event Voting",
"coin_log_expired": "Points Expiry",
"coin_log_reward": "Event Rewards",
"coin_log_task": "Task Rewards",
"coin_log_title": "Points",
"got": "Got",
"deduct": "Deduct",
"invite_friend_install_get_qa_v2": "Invite [[{{num}}]] friends to download the App and get [[{{chance}}]] chances to answer questions.",
"invite_friend_install_get_qa_limit_v2": "Invite [[{{num}}]] friends to download the App and get [[{{chance}}]] chances to answer questions, with a maximum of {{limit}} chances.",
"invite_friend_register_get_qa_v2": "Invite [[{{num}}]] friends to complete registration and get [[{{chance}}]] chances to answer questions.",
"invite_friend_register_get_qa_limit_v2": "Invite [[{{num}}]] friends to complete registration and get [[{{chance}}]] chances to answer questions, with a maximum of {{limit}} chances.",
"qa_task_finish_v2": "Completing it will earn you [[{{chance}}]] chances to answer questions.",
"qa_task_finish_limit_v2": "Completing it will earn you [[{{chance}}]] chances to answer questions, with a maximum of {{limit}} completions.",
"qa_task_cond_all_v2": "Completing all tasks will earn you [[{{chance}}]] chances to answer questions",
"qa_task_cond_all_limit_v2": "Completing all tasks will earn you [[{{chance}}]] chances to answer questions, with a maximum of {{limit}} chances, and you have already received [[{{num}}]] chances",
"sign_in_every_day_can_get_qa_v2": "Every day you will receive [[{{num}}]] chances to answer questions.",
"quiz_starting": "Starting the Quiz...",
"quiz_ready": "Ready...",
"quiz_oops": "Oops!",
"quiz_question_progress": "Question [[{{num}}]] of [[{{x}}]]",
"quiz_back": "Back to quiz",
"quiz_review_answers": "Review answers",
"quiz_question": "Question",
"quiz_no_answer_submitted": "No answer was submitted",
"quiz_perfect_score": "Perfect score!",
"quiz_correct_count": "You got [[{{num}}]] of [[{{x}}]] correct!",
"quiz_good_job": "Good job!",
"quiz_round_complete": "Round complete",
"quiz_correct": "Correct",
"quiz_next": "Next",
"quiz_home": "Home"
}

@ -0,0 +1 @@
{"deduct":"Deducir","quiz_correct":"Correcto","quiz_correct_count":"¡Acertaste [[{{num}}]] de [[{{x}}]]!","quiz_home":"Inicio","quiz_next":"Siguiente","quiz_question_progress":"Pregunta [[{{num}}]] de [[{{x}}]]","quiz_round_complete":"Ronda completada","quiz_chances":"Intentos de cuestionario","claim_it_now":"¡Reclámalo ahora!"}

@ -0,0 +1 @@
{"deduct":"Déduire","quiz_correct":"Correct","quiz_correct_count":"Vous avez [[{{num}}]] bonnes réponses sur [[{{x}}]] !","quiz_home":"Accueil","quiz_next":"Suivant","quiz_question_progress":"Question [[{{num}}]] sur [[{{x}}]]","quiz_round_complete":"Manche terminée","quiz_chances":"Tentatives de quiz","claim_it_now":"Récupérez-le maintenant !"}

@ -0,0 +1 @@
{"deduct":"Levon","quiz_correct":"Helyes","quiz_correct_count":"[[{{num}}]] helyes válaszod lett [[{{x}}]] kérdésből!","quiz_home":"Kezdőlap","quiz_next":"Következő","quiz_question_progress":"[[{{num}}]]. kérdés, összesen [[{{x}}]]","quiz_round_complete":"A forduló befejeződött","quiz_chances":"Kvízlehetőségek","claim_it_now":"Szerezd meg most!"}

@ -0,0 +1 @@
{"deduct":"Kurangi","quiz_correct":"Benar","quiz_correct_count":"Kamu menjawab benar [[{{num}}]] dari [[{{x}}]]!","quiz_home":"Beranda","quiz_next":"Berikutnya","quiz_question_progress":"Pertanyaan [[{{num}}]] dari [[{{x}}]]","quiz_round_complete":"Ronde selesai","quiz_chances":"Kesempatan kuis","claim_it_now":"Klaim sekarang!"}

@ -0,0 +1 @@
{"deduct":"Dedurre","quiz_correct":"Corretto","quiz_correct_count":"Hai risposto correttamente a [[{{num}}]] domande su [[{{x}}]]!","quiz_home":"Home","quiz_next":"Avanti","quiz_question_progress":"Domanda [[{{num}}]] di [[{{x}}]]","quiz_round_complete":"Round completato","quiz_chances":"Tentativi del quiz","claim_it_now":"Richiedilo ora!"}

@ -0,0 +1 @@
{"deduct":"控除","quiz_correct":"正解","quiz_correct_count":"[[{{x}}]]問中[[{{num}}]]問正解しました!","quiz_home":"ホーム","quiz_next":"次へ","quiz_question_progress":"第[[{{num}}]]問(全[[{{x}}]]問)","quiz_round_complete":"ラウンド完了","quiz_chances":"クイズ挑戦回数","claim_it_now":"今すぐ受け取る"}

@ -0,0 +1 @@
{"deduct":"차감","quiz_correct":"정답","quiz_correct_count":"[[{{x}}]]문제 중 [[{{num}}]]문제를 맞혔습니다!","quiz_home":"홈","quiz_next":"다음","quiz_question_progress":"총 [[{{x}}]]문제 중 [[{{num}}]]번","quiz_round_complete":"라운드 완료","quiz_chances":"퀴즈 기회","claim_it_now":"지금 받기"}

@ -0,0 +1,234 @@
package lang
import (
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils/verify"
"encoding/json"
"fmt"
"os"
"strings"
"testing"
)
var aa = map[string]string{
"德语": "de",
"英语": "en",
"西班牙语": "es",
"法语": "fr",
"印尼语": "id",
"意大利语": "it",
"日语": "ja",
"韩语": "ko",
"葡萄牙语": "pt",
"俄语": "ru",
"泰语": "th",
"土耳其语": "tr",
"中文": "zh",
"繁体中文": "zh-TW",
"越南语": "vi",
"匈牙利语": "hu",
"捷克语": "cs",
"荷兰语": "nl",
"波兰语": "pl",
"罗马尼亚语": "ro",
}
func TestName(t *testing.T) {
var data = `德语: Abziehen
西班牙语: Deducir
法语: Déduire
印尼语: Kurangi
意大利语: Dedurre
日语: 控除
韩语: 차감
葡萄牙语: Deduzir
俄语: Вычесть
泰语: หัก
土耳其语: Düş
繁体中文: 扣除
越南语: Khấu trừ
匈牙利语: Levon
捷克语: Odečíst`
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
langData[mark] = ddd
}
ak := "deduct"
var arr = strings.Split(data, "\n")
for _, v := range arr {
key, val, _ := strings.Cut(v, ":")
mark := aa[strings.TrimSpace(key)]
if _, ok := langData[mark][ak]; !ok {
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
langData[mark][ak] = strings.TrimSpace(val)
adata, _ := json.Marshal(langData[mark])
file.Write(adata)
file.Close()
fmt.Printf("%s: %s->%s \n", key, ak, langData[mark][ak])
}
}
}
func TestRemoveKey(t *testing.T) {
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var keys = []string{"invite_friend_install_get_vote_chance_v2"}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
for _, key := range keys {
delete(ddd, key)
}
langData[mark] = ddd
}
for mark, data := range langData {
if verify.InArray(mark, "en", "zh", "ar") {
continue
}
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(data)
file.Write(adata)
file.Close()
}
}
func TestCopyKey(t *testing.T) {
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var key = map[string]string{
"help_fail": "distribution_failed",
}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
for cp, to := range key {
_, ok1 := ddd[cp]
if !ok1 {
t.Logf("[%s]没有[%s]", mark, cp)
continue
}
ddd[to] = ddd[cp]
}
langData[mark] = ddd
}
for mark, data := range langData {
if verify.InArray(mark, "en", "zh", "ar", "zh-TW") {
continue
}
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(data)
file.Write(adata)
file.Close()
}
}
func TestUpdateKey(t *testing.T) {
var fname = "./es.json"
b, err := os.ReadFile(fname)
if err != nil {
t.Log(err)
return
}
var ddd = make(map[string]string)
_ = json.Unmarshal(b, &ddd)
val := "Girar"
key := []string{"spin", "lottery"}
var do bool
for _, v := range key {
old, ok := ddd[v]
if !ok || old == val {
continue
}
ddd[v] = val
do = true
fmt.Printf("%s: %s->%s \n", v, old, val)
}
if !do {
t.Log("not done ")
return
}
file, _ := os.OpenFile(fname, os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(ddd)
file.Write(adata)
file.Close()
}

@ -0,0 +1,761 @@
{
"close": "Sluiten",
"invite_share_text": "Doe mee om beloningen te winnen",
"copy_link": "Verwijzing kopiëren",
"copy_success": "Kopiëren succesvol",
"invite_friend": "Raadpleging",
"invite_friend_": "DELEN",
"total_get": "Beloning",
"can_get": "Beloning",
"my_invite": "Uitnodiging",
"invite_record": "Uitnodigingsrecords",
"need_invite": "Volgende niveau",
"bonus_rules": "Beloningsregels",
"activity_rules": "Regels",
"invite_no_record": "Nog geen uitnodigingsdossiers",
"invite_time": "Datum",
"user_id": "Gebruikers-ID",
"reward_cond": "Regels",
"target_receive_prizes": "Neem contact met ons op om uw beloning te claimen",
"receive_prizes": "Wijze van verzameling van de prijzen",
"copy": "Kopiëren",
"bonus_content": "Beloning",
"prize_details": "Beloningen",
"end_time": "END:",
"start_time": "START:",
"activity_time": "Gebeurtenistijd",
"extra_prizes": "Extra",
"quantity": "Aantal",
"prize": "Beloning",
"download_for_each_friend": "Elke {{num}} installatie",
"accumulate_friend_downloads": "Cumulatieve {{num}} installatie",
"max_invite_friend": "Elke gebruiker kan maximale {{num}} vriend(s) verwijzen",
"register_for_each_friend": "Elke {{num}} Registreer",
"accumulate_friend_register": "Cumulatieve {{num}}-register",
"my_task": "Mijn taken",
"fans": "Refee",
"target_fans": "Bereikt",
"install_and_finish_all_cond": "Je downline moet alle taken downloaden en voltooien om in aanmerking te komen.",
"install_and_finish_one_cond": "Je downline moet een taak downloaden en voltooien om in aanmerking te komen.",
"completed": "Klaar",
"undone": "te doen",
"friend_record": "Uitnodigingsrecords",
"task_1": "Taak 1",
"task_2": "Taak 2",
"task_3": "Taak 3",
"invite_friends_to_register": "Elke {{num}} Registreer",
"invite_friends_to_install": "Elke {{num}} installatie",
"no_record": "Nog geen record",
"invite_friends_to_target": "Nodig {{num}} vriend(s) uit om de taak te voltooien",
"target_for_each_friend": "Elke {{num}} referral(s) voltooit de taak",
"accumulate_friend_target": "Cumulatieve {{num}} verwijzingen voltooien de taak",
"prize_list": "Beloninglijst",
"regular_rewards": "Regelmatig",
"extra_rewards": "Extra",
"activity_end_text": "Dit evenement is afgelopen@Bedankt voor uw komst naar ons@Hope tot ziens!",
"receive": "Inwisselen",
"contact_customer_service": "Neem contact op met de klantenservice om op te halen",
"lottery": "Draaien",
"draws_num": "Draaiingen",
"better_luck_next_time": "Probeer je geluk de volgende keer.",
"no_winning_record": "Nog geen record",
"prize_name": "Beloning",
"lottery_service_err": "Servicefout, probeer het later opnieuw",
"draws_none": "De loterij is op.",
"confirm": "OK",
"try_your_luck": "Feel lucky",
"get_prize_to_app": "Download de app om nu uw prijs te claimen",
"target_cond_1": "Taak 1",
"target_cond_2": "Taak 2",
"target_cond_3": "Taak 3",
"all_tasks_to_draw": "Uw downline moet alle taken downloaden en voltooien om {{num}} draw(s) te ontvangen",
"one_tasks_to_draw": "Uw downline moet een taak downloaden en voltooien om {{num}} draw(s) te ontvangen",
"draws_obtained": "Mijn Draw(s):",
"reward_record": "Reward records",
"to_complete": "Ga.",
"completed_times": "Voltooid",
"winning_record": "Reward records",
"Winning_time": "Datum",
"thank": "Volgende tijd",
"no_receive_record": "Nog geen record",
"week_0": "Zon",
"week_1": "Ma",
"week_2": "Di",
"week_3": "wo",
"week_4": "do",
"week_5": "Vr",
"week_6": "Zat",
"invite_friend_install_get_sign": "Nodig {{num}} vriend(s) uit om de app te downloaden en je ontvangt één make-upkaart.",
"invite_num": "Verwijzingen: {{num}}",
"sign_day_num": "Check in {{num}} day(s)",
"continue_day_num": "Achter elkaar ingecheckt voor {{num}} Day(s)",
"day": "Dag",
"sign_card": "Maak een gemiste dag goed",
"invite_friend_get_sign_card_text": "Een dag gemist? Nodig vrienden uit om een make-upkaart te downloaden en te verdienen!",
"obtain": "Get",
"use_sign_card": "Gebruik een make-up kaart",
"confirm_use_sign_card": "Weet u zeker dat u het gebruikt op {{m}}/{{d}}?",
"sign_success": "Ingecheckt",
"you_got": "Je hebt",
"i_see": "Begrepen.",
"done_sign_day_num": "Gecheckt in {{num}} dag(s)",
"done_continue_day_num": "Achter elkaar ingecheckt voor {{num}} day(s)",
"sign_ok": "Ingecheckt",
"card_sign_ok": "Make-up succes",
"continue_sign_ok": "Ingecheckt",
"continue_sign_get_reward_text": "Hit the Streak om beloningen te winnen",
"sign_get_reward_text": "Check-in dagelijks om beloningen te winnen!",
"sign_card_lack": "Gebrek aan make-up kaart",
"sign_fail": "Inchecken mislukt, gelieve de pagina te vernieuwen",
"best_fan": "Topfans",
"top_fans": "Topfans",
"invite_num_title": "Raadpleging",
"no_rank_record": "Nog geen record",
"vote_none": "De stemming is voorbij.",
"vote_service_err": "Servicefout, probeer het later opnieuw",
"hour": "h",
"minute": "min",
"second": "s",
"hour_f": "UUR",
"minute_f": "MINUUT",
"second_f": "TWEEDE",
"vote_num": "Er zijn momenteel {{num}} stemmen beschikbaar",
"here_is_the_quiz_title": "De quiz titel wordt hier getoond",
"option": "optie",
"countdown": "Aantal",
"end": "Einde",
"click_image_select": "Klik op de afbeelding om te selecteren",
"wait_reward_reward": "Kom later terug voor resultaten.",
"sure": "OK",
"submit": "INDIENEN",
"next_qa": "Volgende",
"right": "JUIST",
"error": "Fout",
"right_answer": "Correct antwoord:",
"explain": "Toelichting",
"home": "Thuis",
"share": "Delen",
"download_app_qa": "Download app om mee te doen aan de quiz",
"qa_service_err": "Servicefout, probeer het later opnieuw",
"qa_none": "Je hebt nog geen antwoordmogelijkheden. @Please nodig vrienden uit om meer kansen te krijgen.",
"start": "START",
"challenge_failed": "NIET VERMIST",
"qa_right": "Correct",
"keep_try": "Blijf proberen.",
"congratulation": "Gefeliciteerd.",
"please_choose": "SELECTIE",
"qa_loading": "laden...",
"grow_big": "{{name}} is opgegroeid",
"click_receive": "ONTVANG",
"after_receive": "om te krijgen",
"tree_grow_can_get": "Plant de boom en je ontvangt hem.",
"fertilize_standard_text": "Pas {{num}}% meer meststof toe, en je zult het doel bereiken!",
"fertilize": "Mest",
"fertilizer": "Meststof",
"need_nutrients_will_die": "Ik heb {{num}}g meststof nodig om me gezond te houden.",
"get_new_tree": "Haal een nieuw sapling.",
"tree_grow_max_text": "Je boom is gegroeid, hier is een cadeautje voor je.",
"little_tree": "mijn boom",
"fertilize_num": "Bemest {{num}}g",
"some_withered": "{{name}} is verwelkt",
"some_revive": "{{name}} is weer tot leven gekomen.",
"grow_big_and_get_reward": "{{name}} is volwassen geworden, je krijgt gewoon {{beloning titel}",
"get_grow": "{{name}} ophalen",
"props_lack": "Niet genoeg rekwisieten.",
"cannot_lv_up": "Je hebt het hoogste niveau bereikt.",
"invite_friend_install_get_fertilizer": "Nodig {{num}} vriend uit om App te downloaden, u ontvangt {{grow_num}} meststof.",
"received_sapling": "Je hebt een sapling gekregen.",
"pick_name": "Kies een naam",
"growth_manual": "Groeigids",
"get_nourishment": "Krijg kunstmest",
"plant_new_tree": "Plant een boom",
"tree_revive": "Bewaar je boom",
"timeout_tree_die": "Door een gebrek aan bevruchting voor een lange tijd, uw boom is verdord",
"invite_friend_install_revive_tree": "Nodig {{num}} vrienden uit om de app te downloaden en u kunt uw boom opslaan",
"dog_grow_can_get": "Verhoog de puppy en je zult het ontvangen",
"feed_standard_text": "Voer gewoon {{num}}% meer om het doel te bereiken!",
"feed": "Feed",
"dog_food": "Hondenvoer",
"need_dog_food_will_leave": "Ik heb {{num}}g eten nodig, of ik moet misschien op avontuur buiten ons gezellige huis. Woef!",
"get_new_dog": "Een puppy goedkeuren",
"dog_grow_max_text": "Je puppy is volwassen geworden, hier is een cadeautje voor je.",
"little_dog": "Puppy",
"feed_num": "{{num}}g-voeding voeren",
"some_leave": "{{name}} is vertrokken",
"some_come": "{{name}} is terug",
"invite_friend_install_get_dog_food": "Nodig {{num}} vriend(s) uit om App te downloaden, u ontvangt {{grow_num}}g voedsel",
"received_dog": "Je adopteert een puppy",
"get_dog_food": "Haal voedsel.",
"plant_new_dog": "Adopteer een hond",
"rescue_puppy": "De puppy opslaan",
"timeout_dog_go": "Omdat het al lang geen liefde en voedsel meer heeft gevoeld, is je puppy weggelopen van huis.",
"invite_friend_install_rescue_puppy": "Nodig {{num}} vriend(s) uit om de app te downloaden en je kunt je puppy opslaan.",
"get_collect_num": "U heeft 1 stuk {{reward_title}} ontvangen.",
"fixed_point": "Gespecificeerd aantal",
"this_props_lack": "Je hebt dit item nog niet.",
"help_record": "Uitnodigingsrecords",
"no_help_record": "Nog geen record",
"install_help_record": "Een vriend downloadde de app",
"open_help_record": "Een vriend opende de app",
"click_help_record": "Een vriend klikte op de link",
"service_err": "Servicefout, probeer het later opnieuw",
"select_reward": "Selecteer Beloning",
"view_help_rule": "Controleregels",
"help_rule": "Regels uitnodigen",
"install_help": "App naar Boost downloaden",
"install_help_text": "Elke vriend downloadde de app, voortgang [[+{{num}}%]]",
"open_help": "App openen om te versterken",
"open_help_text": "Elke vriend opende de app, voortgang [[+{{num}}%]], tot {{limit_num}}%",
"click_help": "Klik op Link naar Boost",
"click_help_text": "Elke vriend klikte op de uitnodigingslink, voortgang [[+{{num}}%]], tot {{limit_num}}%",
"invite_friends_receive_free_gifts": "Nodig vrienden uit om gratis beloningen te krijgen!",
"get_prizes": "Krijg deze beloning",
"help_success": "SUCCES",
"also_get_free": "U kunt het ook gratis krijgen",
"install_get_free_reward": "Download de app om gratis beloningen te krijgen",
"install_get_reward": "Haal de App, ontgrendel prijzen",
"received_success": "succes",
"ballot_record": "HERHALING",
"no_ballot_record": "Nog geen record",
"ballot_none": "Je hebt nog geen kansen. Nodig vrienden uit om meer kansen te krijgen.",
"share_good_luck": "Deel het geluk",
"ballot": "Hebbes.",
"answer_record": "HERHALING",
"challenge_results": "WEERGAVE",
"challenge_time": "DATUM",
"no_answer_record": "Nog geen record",
"answer_none": "De quiz is op.",
"please_choose_answer": "Selecteer een antwoord",
"answer_countdown": "Aantal",
"got_prizes": "GEWONNEN:",
"continue_free_get": "Doorsnijden",
"finish_help": "Voltooid",
"reward_send_your_account": "De beloning is naar uw account gestuurd",
"no_reward_record": "Nog geen record",
"download_app_ballot": "Download de app om mee te doen aan de campagne",
"yesterday": "Gisteren",
"today": "Vandaag",
"prize_record": "HERHALING",
"get_reward_time": "DATUM",
"no_sign_card": "Ik heb nog geen vervangende kaart getekend.",
"get_more_knowledge": "Probeer je geluk volgende keer.",
"qa_very_hard": "Wie is de slimme man?",
"num": "QUIZ",
"contact_customer_service_var": "Neem contact op ({{contact}})",
"like_share_people_lucky": "Gedeelde mensen hebben meer geluk. Deel nu!",
"my_reward": "Mijn prijs",
"no_install_prompt": "Dat social media platform is niet geïnstalleerd.",
"please_login": "Aanmelden",
"got_num": "(Gebeurde {{num}} keer)",
"completed_num": "(Gedaan aan {{num}})",
"fixed_roll_none": "Je hebt nog geen geluk. Nodig {{num}} vriend(s) uit om de app te downloaden en krijg 1 geluks dobbelsteen.",
"fixed_roll_none_limit": "Nog geen geluk. Nodig {{num}} vriend(s) uit om de App te downloaden om 1 geluks dobbelsteen te krijgen, tot een maximum van {{limit}} lucky dobbelstenen(s).",
"invite_friend_install_get_roll_chance": "Nodig {{num}}-vriend(s) uit om de app te downloaden en {{chance}}-gelukkige dobbelstenen te krijgen.",
"invite_friend_install_get_roll_chance_limit": "Nodig {{num}} vriend(s) uit om de App te downloaden en {{chance}} dobbelstenen(s), tot een maximum van {{limit}} dobbelstenen(s).",
"invite_friend_register_get_roll_chance": "Nodig {{num}} vriend(s) uit om de registratie te voltooien om {{chance}} dobbelstenen te ontvangen.",
"invite_friend_register_get_roll_chance_limit": "Nodig {{num}} vriend(s) uit om de registratie te voltooien om {{chance}} dobbelstenen(s te ontvangen), tot een maximum van {{limit}} dobbelstenen(s).",
"dice_task_finish": "Compleet om {{chance}} dobbelstenen te ontvangen",
"dice_task_finish_limit": "Voltooid om {{chance}} dobbelstenen te ontvangen, tot {{limit}} voltooiing(s).",
"dice_task_num": "Totale dobbelstenen verkregen uit taken:",
"dice_task_cond_one": "Voltooi elke taak om meer dobbelstenen te krijgen.",
"dice_task_cond_all": "Voltooi alle taken om {{chance}} dobbelstenen(s).",
"dice_task_cond_all_limit": "Voltooi alle taken om {{chance}} dobbelstenen(s), tot een maximum van {{limit}} tijd(s). U heeft {{num}} time(s) tot nu toe verkregen.",
"spin_now": "Draai nu",
"spinning": "Draaien",
"expires_in": "Verloopt in",
"records": "Gegevens",
"luck_you": "Geluksvogel.",
"get_extra_reward": "Extra bonus voor u!",
"share_get": "Delen om uw",
"upgrade_reward": "upgrade beloning",
"super_upgrade": "Verrassing! Super upgrade!",
"preparation": "Per spin",
"invite_get_energy": "Uitnodigen om energie te krijgen",
"invite_friend_get_energy": "Nodig vrienden uit om energie te krijgen",
"up_to": "Tot",
"spin": "Draaien",
"away": "{{num}} weg",
"win_left_energy": "{{cash}} winnen met slechts {{num}} spin",
"enjoy_credit": "Geniet van je krediet",
"invite_no_record_reward": "Je hebt nog niemand uitgenodigd, Nodig vrienden uit om beloningen te ontvangen!",
"spin_reward": "Spin beloning",
"share_reward": "Gedeelde beloning",
"start_reward": "Startstimulans",
"left_cash_get_reward": "Alleen {{left}} nog over om {{cash}} beloning te krijgen",
"auto_spin": "Spin automatisch in [[{{second}}]] s",
"guarantee_to": "Garantie om te winnen {{cash}} met slechts 1 spin!",
"auto_select": "Selecteer automatisch in [[{{second}}]] s",
"open": "Open",
"select_box": "Kies 1 geschenkdoos om te zien hoeveel geld Beloning krijgt u",
"money_reward": "Geldbeloning",
"jackpot_best_prize": "Jackpot! Beste prijs",
"best_prize": "Best&&Prize",
"almost_reward": "Bijna tot de beloning!",
"claimed_reward": "Over [[10000+]] hebben mensen beloond",
"pass_on_energy": "Ze gaven Energie aan jou door!",
"victory_tip": "de overwinning ligt binnen jullie bereik, [[neem het]]",
"min_won_barrage": "{{name}} Won [[{{cash}}]] {{min}} mins ago Great!",
"closer_to_prize": "je komt dichter bij de grote prijs",
"shine_arrived": "je moment om te schitteren hash arrived pak het",
"get_money_reward": "Krijgen geld Beloning",
"won_barrage": "[[{{name}}]] heeft beweerd [[{{cash}}]]",
"surprise_for_you": "Verrassing voor jou",
"last_spin_win": "Slechts een laatste draai om te winnen!",
"energy": "Energie",
"token": "Token",
"your_reward": "UW GELD",
"go_to": "Te gebruiken",
"click_contact": "Contacteer Klantenservice",
"click_contact_tip": "Contactinformatie is gekopieerd\nNeem contact met ons op",
"see_reward": "Prijzen bekijken",
"prize_gone": "De prijzen zijn weg.",
"no_reward_get": "Je bent te laat, alle prijzen zijn uitgedeeld!",
"no_more_record": "Geen platen meer.",
"help_fail": "NIET VERMIST",
"grand_opening": "Grote opening",
"get_reward_after_play": "Iedereen krijgt een beloning na het spelen van het spel!",
"play_and_get_prize": "Speel om je prijs te krijgen!",
"won_free_gift": "Je hebt het gratis geschenk gewonnen!",
"download_app_get_gift": "Download App om uw prijs te krijgen!",
"download": "Downloaden",
"jackpot": "JACKPOT",
"play": "Afspelen",
"install_ineligible": "Niet in aanmerking komende (niet nieuwe installatie)",
"unlock_your_luck": "Ontgrendel je geluk",
"spin_and_win": "Spin en Win",
"play_to_win_prize": "Speel om een prijs te winnen!",
"you_got_the_best_prize": "Je hebt de beste prijs.",
"play_and_win": "Spelen en winnen",
"download_to_get": "downloaden om op te halen",
"best_prize_!": "Beste prijs!",
"roll_dice_number": "Rol dobbelstenen, nummer {{point}}",
"lucky_dice_number": "Gebruik geluks dobbelstenen, nummer {{point}}",
"day_sign": "Dagelijks inchecken",
"dice_record": "Gegevens",
"finish_friend_register": "Volledige vriend registratie taak",
"finish_friend_install": "Voltooi de aanbevolen app download taak",
"finish_lucky_dice_task": "Voltooi de gelukkige dobbelsteen taak",
"fragment": "Fragment",
"click": "klik",
"collect_fragment_compare_reward": "Verzamel {{num}} fragmenten om de prijs te maken",
"craft_fragments": "Fragmenten voor ambachten",
"reward_lack_contact_customer_service": "Uit voorraad. Neem contact op met de klantenservice voor assistentie.",
"join_in_campaign": "Deelnemen aan campagne",
"contact": "Contactpersoon",
"all": "Alles",
"contact_information": "Contactinformatie",
"no_more_dice": "Geen dobbelstenen meer",
"try_your_luck_first_upper": "Probeer je geluk.",
"fill_in": "Invullen",
"submit_success": "Succes",
"please_do_not_submit_repeatedly": "Gelieve niet herhaaldelijk in te dienen",
"submitted": "Overgedragen",
"please_complete_the_form": "Vul het formulier in",
"welcome_gifts": "Welkomstgeschenken",
"spin_to_win": "Draai om te winnen",
"view": "weergave",
"use": "Gebruik",
"get_and_use": "Claim en gebruik",
"invite_friend_install_get_lottery_chance": "Nodig {{num}} vriend(s) uit om de App te downloaden, en je krijgt {{chance}} kans(s).",
"invite_friend_install_get_lottery_chance_limit": "Nodig {{num}} vriend(s) uit om de App te downloaden, en je krijgt {{chance}} kans(s), tot een maximum van {{limit}} kans(s).",
"invite_friend_register_get_lottery_chance": "Nodig {{num}} vriend(s) uit om de registratie te voltooien, en je krijgt {{chance}} kans(s).",
"invite_friend_register_get_lottery_chance_limit": "Nodig {{num}} vriend(s) uit om de registratie te voltooien, en je krijgt {{chance}} kans(s), tot een maximum van {{limit}} kans(s).",
"lottery_task_finish": "Je krijgt {{chance}} kans(s) na voltooiing",
"lottery_task_finish_limit": "U krijgt {{chance}} kans(s) na voltooiing, tot een maximum van {{limit}} tijd(s)",
"lottery_task_num": "De totale kansen van de taken",
"lottery_task_cond_one": "Volledige taken om kansen te krijgen",
"lottery_task_cond_all": "Het voltooien van alle taken kan resulteren in het verkrijgen van {{chance}} kans(s)",
"lottery_task_cond_all_limit": "Het voltooien van alle taken kan resulteren in het verkrijgen van {{chance}} kans(s), tot een maximum van {{limit}} tijd(s), en {{num}} tijd(s) zijn verkregen.",
"raffle_chances": "Kans",
"quiz_chances": "Quiz-kans",
"get_lottery_chances": "Get Loterij Kansen",
"remaining_raffle_chances": "Resterende kansen",
"lottery_again": "Opnieuw",
"use_immediately": "Nu gebruiken",
"wow_you_got": "Wow! Je hebt",
"next_time": "Volgende keer",
"finish_all_task": "Taken voltooid",
"finish_one_task": "Taak voltooid",
"sign_in_every_day_can_get_dice": "Meld je aan elke dag , kunt u {{num}} dobbelstenen(s).",
"do_task_get_dice": "Doe taken en haal dobbelstenen",
"do_task_get_lottery": "Taken uitvoeren en kans krijgen",
"refresh_tomorrow": "Morgen vernieuwen",
"click_icon": "Klik op pictogram",
"paste_to_media": "Plakken naar media",
"get_prize": "Prijzen krijgen",
"copy_success_paste_to_media": "Gecopieerd succes, gelieve te plakken op social media",
"invite_friend_install_get_grow": "Nodig {{num}} vriend(s) uit om de App te downloaden en {{chance}} groei items te ontvangen.",
"invite_friend_install_get_grow_limit": "Nodig {{num}} vriend(s) uit om de App te downloaden en {{chance}} groei items te ontvangen, tot een maximum van {{limit}} groei items.",
"invite_friend_register_get_grow": "Nodig {{num}} vriend(s) uit om de registratie te voltooien en {{chance}} groei items te ontvangen.",
"invite_friend_register_get_grow_limit": "Nodig {{num}} vriend(s) uit om de registratie te voltooien en {{chance}} groei items te ontvangen, tot een maximum van {{limit}} groei items.",
"grow_task_finish": "Voltooien om {{chance}} groei items",
"grow_task_finish_limit": "Complete om {{chance}} groei items, voltooien tot {{limit}} tijd(s)",
"grow_task_cond_one": "Voltooi elke taak om groei items",
"grow_task_cond_all": "Voltooi alle taken om {{chance}} groei items",
"grow_task_cond_all_limit": "Voltooi alle taken om {{chance}} groei items, tot {{limit}} tijd(s), al kreeg {{num}} tijd(s)",
"do_task_get_grow": "Complete taken om groeipunten te krijgen",
"easy_mode": "Gemakkelijke modus",
"mins_ago": "{{min}} minuten geleden",
"barrage_got_reward": "heeft [[{{title}}]] door het spelen van lucky draw.",
"sold_out": "uitverkocht",
"task_done": "Taak voltooid",
"click_copy_link": "Klik op \"Copy Link\"",
"select_card": "Selecteer een kaart",
"raffle_chances_lack": "Niet genoeg mogelijkheden",
"raffle_chances_lack_tip": "Je hebt niet genoeg kansen voor de gelukstrekking. Ga naar de onderkant van de pagina om taken te voltooien en meer kansen te verdienen.",
"get_more_chance": "Meer kansen krijgen",
"flip_now": "Nu spiegelen",
"raffle_num": "Kans",
"win": "Win",
"next_week_do": "Volgende week",
"week_do_1": "Verversen op ma",
"week_do_2": "Verversen op di",
"week_do_3": "Verversen op wo",
"week_do_4": "Op do verversen",
"week_do_5": "Verversen op vr",
"week_do_6": "Verversen op za",
"week_do_7": "Verversen op de zon",
"to_flip": "Ga een kaart tekenen",
"won_get": "Gefeliciteerd.",
"invite_friend_download": "Nodig {{num}} vriend(s) uit om de App te downloaden",
"invite_friend_register": "Nodig {{num}} vriend(s) uit om te registreren",
"fixed_roll_none_register": "Nog geen geluk. Nodig {{num}} vriend(s) om te registreren en krijgen 1 geluk dobbelstenen.",
"fixed_roll_none_register_limit": "Nog geen geluk. Nodig {{num}} vriend(s) uit om te registreren en krijg 1 geluks dobbelsteen, tot een maximum van {{limit}} lucky dobbelstenen(s).",
"sign_in_every_day_can_get_lottery": "Meld je elke dag aan om {{num}} kans(s) te krijgen om een prijs te winnen.",
"finish_newcomer_task": "[[Nieuwkomer]] volledige taken te verdienen [[{{reward_title}}]]",
"done_newcomer_task": "Nieuwkomertaken",
"register_help_record": "Een vriend heeft de registratie voltooid.",
"register_help_text": "Elke vriend heeft de registratie voltooid, voortgang [[+{{num}}%]]",
"register_help": "Registratie Boost",
"invite_friend_install_get_qa": "Nodig {{num}} vrienden uit om de App te downloaden en krijg {{chance}} kansen om vragen te beantwoorden.",
"invite_friend_install_get_qa_limit": "Nodig {{num}} vrienden uit om de App te downloaden en krijg {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
"invite_friend_register_get_qa": "Nodig {{num}} vrienden uit om de registratie te voltooien en krijg {{chance}} kansen om vragen te beantwoorden.",
"invite_friend_register_get_qa_limit": "Nodig {{num}} vrienden uit om de registratie te voltooien en krijg {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
"qa_task_finish": "Het voltooien van het zal verdienen u {{chance}} kansen om vragen te beantwoorden.",
"qa_task_finish_limit": "Het voltooien van het zal verdienen u {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} voltooiingen.",
"qa_task_cond_one": "Het voltooien van elke taak zal u een kans om vragen te beantwoorden verdienen",
"qa_task_cond_all": "Het voltooien van alle taken zal verdienen u {{chance}} kansen om vragen te beantwoorden",
"qa_task_cond_all_limit": "Het voltooien van alle taken zal verdienen je {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen, en je hebt al {{num}} kansen ontvangen",
"sign_in_every_day_can_get_qa": "Elke dag ontvangt u {{num}} kansen om vragen te beantwoorden.",
"do_task_get_qa": "Volledige taken om kansen te verdienen om vragen te beantwoorden",
"help_install": "[[{{name}}]] ontvangen [[installatiesteun]]",
"help_register": "[[{{name}}]] ontvangen [[registratiesteun]]",
"help_open": "[[{{name}}]] ontvangen [[dagelijks bezoek boost]]",
"help_click": "[[{{name}}]] ontvangen [[klik op ondersteuning]]",
"finish_help_get_reward": "[[{{name}}]] de ondersteunende taak voltooid en ontvangen [[{{reward_title}}]]",
"a_gift_to_you": "Een geschenk voor jou",
"choose_it": "Kies het",
"nice_choice": "Mooie keuze.",
"tip": "Tip",
"left_percent_get_reward": "Alleen [[{{left}}%]] over om beloning te krijgen",
"ensure_select_reward": "Selectie bevestigen [[{{reward_title}}]]?",
"reward_obtained": "Beloning verkregen",
"lucky": "Lucky",
"percent_progress_for_you": "Je hebt een gratis [[{{percent}}%]] boost!",
"invite": "Uitnodigen",
"help_task": "Taak versterken",
"finish_all_task_help_parent": "Voltooi alle volgende taken om uw vriend boost",
"finish_one_task_help_parent": "Voltooi een van de volgende taken om uw vriend boost",
"task_index": "Taak {{index}}",
"raise_pet_to_get_free_gift": "Verhoog uw huisdier om gratis geschenken te krijgen",
"step": "STAP",
"pick_item": "Kies item",
"raise_pet": "Huisdier verhogen",
"get_free_gift": "Krijg gratis geschenk",
"has_got": "{{name}} heeft {{reward_title}}",
"more_unexpected_gifts": "Meer onverwachte geschenken tijdens het opvoeden van uw huisdier",
"pick_it": "Kies het.",
"picked": "geplukt",
"your_gift_confirm": "Bevestig uw geschenk.",
"free": "Vrij",
"raise_the_dog_to_get_your": "voed de hond op om uw",
"free_gift": "Gratis geschenk!",
"expires_in_day": "Vervalt in {{day}} dagen",
"collect_more_love": "Verzamel [[{{num}}]] meer liefdespunten om een GRATIS geschenk te krijgen",
"collect": "Verzamelen",
"claim_now": "Claim nu",
"feed_more_times": "Feed {{num}} meer keer",
"get_more": "Meer informatie",
"first_referral_bonus": "Eerste verwijzing bonus!",
"get_rewards_first_time": "Ontvang beloningen door vrienden voor het eerst uit te nodigen",
"first_invite_receive": "De eerste uitnodiging voor een nieuwe gebruiker zal ontvangen [[{{num}}]]",
"invite_now": "Nodig nu uit",
"invite_get_dog_foods": "Nodig vrienden uit om voedsel te verdienen",
"invite_friends": "Nodig vrienden uit",
"pick_a_gift": "Kies 1 gratis geschenk",
"feed_3_times": "3 maal voeden",
"invite_new_user_extra_get": "Nodig nieuwe gebruiker voor de eerste keer kan krijgen extra [[{{num}}]]",
"reward_upgraded": "Beloning verbeterd",
"reward_for_you": "[[{{reward_title}}]] voor u",
"time_s_up": "Tijden om!",
"play_again": "Opnieuw afspelen",
"complete_tasks_to_earn_reward": "Volledige taken om Beloning te verdienen",
"super": "SUPER",
"super_benefit": "Supervoordeel",
"task_cond_one": "Voltooi elke taak om een [[beloning]] te ontvangen",
"task_cond_all": "Voltooi alle taken om {{reward_title}}[[+{{num}}]]",
"congrats": "Gefeliciteerd!",
"enjoy_your": "Geniet van je",
"try_again_to_claim": "Probeer opnieuw je gave op te eisen",
"collect_love": "Verzamel liefde",
"finish_step": "Afgedane fasetaak",
"finish_feed": "Voltooid voertaak",
"friend_third_feed": "Vriend voltooide het voeden van hondenvoer 3 keer",
"friend_first_third_feed": "Dagelijks uitnodigen vrienden om het voeden van honden voedsel 3 keer te voltooien",
"friend_select_reward": "Vriend heeft de prijs gekozen.",
"friend_first_select_reward": "Nodig dagelijks vrienden uit om de prijs te kiezen",
"rewards": "Beloningen",
"round_expired": "Ronde verlopen",
"love_points": "Love Points",
"dog_food_lack": "Ga alsjeblieft meer hondenvoer halen.",
"collect_machine": "De hondenvoermachine is ontvangen.",
"max_grow": "De maximale ontwikkelingstijden overschreden",
"please_collect_love": "Verzamel eerst liefde",
"continue_grow": "Het huidige huisdier kan nog steeds worden gehouden",
"dog_food_machine_running": "Hondenvoer is in productie",
"reward_remove": "De prijs is verlaagd.",
"reward_get_max": "De prijs heeft de maximumgrens van de verwerving overschreden",
"i_am_hungry": "Ik heb honger.",
"effect_invite": "Succesvol een vriend uitgenodigd",
"day_first_effect_invite": "Succesvol een vriend uitgenodigd voor de eerste keer op dezelfde dag",
"finish_many_feed": "Meerdere voedingen voltooid",
"daily_rewards": "Dagelijkse beloning",
"come_back_tomorrow_for_more_rewards": "Kom morgen terug voor meer beloningen!",
"claim_today_reward": "Claim de beloning van vandaag!",
"come_back_tomorrow": "Kom morgen terug!",
"fail_to_sign_progress_reset": "Als u zich niet continu aanmeldt, wordt uw voortgang hersteld.",
"signed_in": "Ondertekend in",
"signed_title": "Aanmelden",
"you_got_the_gift_box": "Je hebt de geschenkdoos.",
"use_it": "Gebruik het",
"you_got_dog_food": "Je hebt {{num}} hondenvoer",
"you_got_reward": "Je hebt {{reward_title}}",
"invite_contest": "Uitnodigingswedstrijd",
"rewards_earned_to_your_account": "Verdiende beloningen worden [[direct op]] je account bijgeschreven",
"invite_more_friends": "Nodig meer vrienden uit",
"invited": "{{num}} uitgenodigd",
"daily_fortune_draw": "Dagelijkse loting",
"win_free_gift_every_day": "Win gratis geschenk elke dag!",
"draw_now": "Nu tekenen",
"day_num": "Dag {{num}}",
"you": "Jij",
"blind_box": "Blinde doos",
"daily_draw": "Dagelijkse trekking",
"rankings": "Ranglijst",
"rank_reward": "Ranking Rewards",
"sign_reward": "Aanmeldvergoedingen",
"blind_reward": "Blind Box Rewards",
"lucky_reward": "Loterij Beloningen",
"tomorrow": "Morgen",
"win_reward": "Win[[{{title}}]]",
"rank_end": "De tijd is om.",
"congrats_for_getting": "Gefeliciteerd met het krijgen",
"ends_in": "eindigt in",
"invite_friend_download_app": "Nodig [[{{num}}]] vriend(s) uit om de App te downloaden",
"invite_friend_register_app": "Nodig [[{{num}}]] vriend(s) uit om te registreren",
"invite_friend_install_get_lottery_chance_v2": "Nodig [[{{num}}]] vriend(s) uit om de App te downloaden, en je krijgt [[{{chance}}]] kans(s).",
"invite_friend_install_get_lottery_chance_limit_v2": "Nodig [[{{num}}]] vriend(s) uit om de App te downloaden, en je krijgt [[{{chance}}]] kans(s), tot een maximum van {{limit}} kans(s).",
"invite_friend_register_get_lottery_chance_v2": "Nodig [[{{num}}]] vriend(s) uit om de registratie te voltooien, en je krijgt [[{{chance}}]] kans(s).",
"invite_friend_register_get_lottery_chance_limit_v2": "Nodig [[{{num}}]] vriend(s) uit om registratie te voltooien, en je krijgt [[{{chance}}]] kans(s), tot een maximum van {{limit}} kans(s).",
"lottery_task_finish_v2": "Je krijgt [[{{chance}}]] kans(s) na voltooiing",
"lottery_task_finish_limit_v2": "Je krijgt [[{{chance}}]] kans(s) na voltooiing, tot een maximum van {{limit}} tijd(s)",
"lottery_task_cond_all_v2": "Het voltooien van alle taken kan resulteren in het verkrijgen van [[{{chance}}]] kans(s)",
"lottery_task_cond_all_limit_v2": "Het voltooien van alle taken kan resulteren in het verkrijgen [[{{chance}}]] kans(s), tot een maximum van {{limit}} tijd(s), en [[{{num}}]] tijd(s) zijn verkregen.",
"sign_in_every_day_can_get_lottery_v2": "Meld je elke dag aan om [[{{num}}]] kans(s) te krijgen om een prijs te winnen.",
"invite_friends_to_earn_reward": "Nodig vrienden uit om Beloning te verdienen",
"raffle_num_add": "Kans [[+{{num}}]]",
"click_button_and_get_coins": "Klik op de knop om de taak te voltooien en meer munten te krijgen",
"do_task_get_energy": "Volledige taken om energie te winnen",
"coins": "{{num}} munten",
"get_tasks": "Taken ophalen",
"next": "Volgende",
"finish_task_title": "Voltooid \"{{title}}\"",
"get_energy": "Energie ophalen",
"tasks": "Taken",
"invite_friend_install_get_gold": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} munten te verdienen.",
"invite_friend_install_get_gold_limit": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} munten te verdienen, met een maximum van {{limit}} munten.",
"invite_friend_register_get_gold": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} munten te verdienen.",
"invite_friend_register_get_gold_limit": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} munten te verdienen, met een maximum van {{limit}} munten.",
"gold_task_finish": "Volledig te verdienen {{chance}} munten",
"gold_task_finish_limit": "Volledig te verdienen {{chance}} munten, tot een maximum van {{limit}} tijden",
"gold_task_cond_one": "Voltooi elke taak om munten te verdienen",
"gold_task_cond_all": "Voltooi alle taken om {{chance}} munten te verdienen",
"gold_task_cond_all_limit": "Voltooi alle taken om {{chance}} munten te verdienen, tot een maximum van {{limit}} keer, u hebt ontvangen {{num}} keer",
"do_task_get_gold": "Volledige taken om munten te verdienen",
"task_none": "Er zijn geen taken beschikbaar om te voltooien",
"finish_task_earn_num": "Voltooi de taak om te verdienen [[+{{num}}]]",
"reached_the_max": "Bereikt het maximum",
"has_got_style": "[[{{name}}]] heeft [[{{reward_title}}]]",
"dog_food_num": "{{num}}g voedsel",
"in_production": "In productie",
"active_talk": "Je hebt me lang niet bezocht. Kom vaker om meer beloningen te krijgen.",
"task_reset_talk": "Een van uw prijzen staat op het punt te vervallen, kom en bekijk het.",
"dog_offline_talk": "U hebt een deel van het voeder voor huisdieren ontvangen, ga het alstublieft claimen.",
"complete_task_talk": "U hebt de taak volbracht, gefeliciteerd met het ontvangen van een prijs, kom en claim het.",
"current_total_prize_pool": "Huidige totale prijspool",
"get_coin": "[[{{name}}]] Munten gewonnen [[{{num}}]]",
"join_coin_num": "[[{{name}}]] Grijp goud [[[*{{num}}]]",
"join_coin": "Goud grijpen",
"coin_per_use": "{{num}} gouden munten per gebruik",
"expected_to_receive_coin": "Verwacht om [[{{num}}]] gouden munten te ontvangen",
"collect_coin": "[[{{num}}]] gouden munten kunnen worden verzameld",
"expired": "Verlopen",
"gold_coins_deposited": "Gedeponeerde gouden munten",
"timeout_and_no_collection": "Timeout en niet geclaimd",
"use_gold_coins_to_play": "Gebruik [[{{num}}]] gouden munten om te spelen?",
"more": "Meer",
"cancel": "Annuleren",
"play_limit_next_round": "Je hebt de speellimiet bereikt! Kom terug voor de volgende ronde!",
"insufficient_balance_grab_gold": "Onvoldoende evenwicht. Kan goud niet grijpen",
"do_task": "Taken uitvoeren",
"this_round_has_ended": "Deze ronde is afgelopen.",
"claim": "Claim",
"claim_it_now": "Claim het nu!",
"claim_time_not_reached": "Claimtijd niet bereikt",
"success": "Succes",
"too_late_reward_expired": "Te laat! Beloning verlopen",
"no_duplicate_claims": "Geen dubbele claims",
"buy_more": "Koop meer",
"operation_failed": "Operatie mislukt. Probeer het later opnieuw",
"expected_to_be_available_tomorrow": "Verwacht wordt dat morgen beschikbaar zal zijn",
"expected_to_be_available_in_day": "Verwacht beschikbaar te zijn in {{day}} dagen",
"num_gold_coins": "[[{{num}}]] munten",
"check_in_now": "Check nu in",
"complete_daily_check_ins_for_prizes": "Volledige dagelijkse check-ins voor prijzen",
"check_in_days": "Incheckdagen",
"lottery_chance_done": "Kans [[+{{chance}}]] (Gedaan: [[{{num}}]])",
"lottery_chance_done_limit": "Kans [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
"claim_failed": "Claim mislukt. Neem contact op met klantenservice.",
"answer_tomorrow_get_chance": "Haal {{chance}} meer kansen om morgen te antwoorden",
"finish_invite_task": "Uitnodigingstaak voltooid",
"dice_chance_done": "Dobbelstenen [[+{{chance}}]] (Gedaan: [[{{num}}]])",
"dice_chance_done_limit": "Dice [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
"grow_chance_done": "Groeiposten [[+{{chance}}]] (Gedaan: [[{{num}}]])",
"grow_chance_done_limit": "Groeiposten [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
"qa_chance_done": "Quiz Chance [[+{{chance}}]] (Gedaan: [[{{num}}]])",
"qa_chance_done_limit": "Quizkans [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
"help_wait": "Aan de gang",
"distributing": "Verdeling",
"distribution_failed": "NIET VERMIST",
"claimed": "Opgevraagd",
"no_prizes_to_claim": "Geen prijzen beschikbaar voor u om te claimen",
"points_use": "Gebruikte {{num}}-punten",
"points_use_ok": "Uitwisseling succesvol",
"points_use_lack": "Onvoldoende punten",
"points_use_close": "Wisselfunctie is gesloten",
"points_use_day_limit": "Dagelijkse wisselkoerslimiet bereikt",
"points_use_limit": "Koerslimiet bereikt",
"points_use_dice": "Gebruik [[{{num}}]], ruil voor [[{{chance}}]] dobbelstenen?",
"points_use_lottery": "Gebruik [[{{num}}]], ruil voor [[{{chance}}]] kans?",
"times": "Tijden",
"dice": "Dobbelstenen",
"one_spin": "1 spin",
"raise_the_pet_to_get_your": "Verhoog huisdieren te krijgen uw",
"pet_food_num": "{{num}}g voeder voor gezelschapsdieren",
"pet_food": "Diervoeders",
"friend_third_feed_pet": "Uw vriend heeft huisdieren 3 keer gevoed",
"friend_first_third_feed_pet": "Nodig vrienden dagelijks uit om huisdieren 3 keer te voeden",
"collect_machine_food": "De petfood machine is ontvangen",
"pet_food_lack": "Ga alsjeblieft meer dierenvoer halen.",
"pet_food_machine_running": "Huisdiervoer wordt geproduceerd",
"chat_day_limit": "Ik ben een beetje moe vandaag.",
"chat_token_limit": "Ik ben erg moe.",
"chat": "Chat",
"hours_ago": "{{hour}} uren geleden",
"conversation_and_chat": "U kunt een gesprek beginnen en chatten met uw huisdier",
"invite_friend_install_get_vote_chance": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} stemkansen te krijgen.",
"invite_friend_install_get_vote_chance_limit": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} stemkansen te krijgen, met een maximum van {{limit}} kansen.",
"invite_friend_register_get_vote_chance": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} stemkansen te krijgen.",
"invite_friend_register_get_vote_chance_limit": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} stemkansen te krijgen, met een maximum van {{limit}} kansen.",
"vote_task_finish": "Voltooien geeft je {{chance}} stemkansen",
"vote_task_finish_limit": "Volledig om {{chance}} stemkansen te verdienen, max {{limit}} keer",
"vote_task_num": "Stem op kansen die uit taken worden verdiend",
"vote_task_cond_one": "Voltooi elke taak om stemkansen te verdienen",
"vote_task_cond_all": "Voltooi alle taken om {{chance}} stemkansen te krijgen",
"vote_task_cond_all_limit": "Voltooi alle taken om {{chance}} stemkansen, max {{limit}}, al {{num}}",
"do_task_get_vote": "Verdien stemkansen door taken te doen",
"sign_in_every_day_can_get_vote": "Kom dagelijks om {{num}} stemkansen te ontvangen",
"your_choice": "Uw keuze",
"cap_win": "WINST",
"cap_draw": "GELIJKSPEL",
"blue_team": "Blauw",
"red_team": "Rood",
"spend_coin_to_vote_team": "Weet u zeker dat u [[{{coin}}]] wilt besteden aan het stemmen voor <<{{title}}>>?",
"vote_team": "Weet u zeker dat u wilt stemmen op [[{{title}}]]?",
"vote_sure": "Stem bevestigen?",
"no_scheduled": "Geen overeenkomsten gepland",
"schedule": "Schema",
"in_progress": "In behandeling",
"participated": "Deelgenomen",
"vote_soon": "Stemming",
"vote": "Stemming",
"pending": "In afwachting",
"settled": "Ingesteld",
"spend_coin_redeem_reward": "Weet u zeker dat u [[{{coin}}]] wilt uitgeven om <<{{title}}>> te verzilveren?",
"redeem_sure": "Verlossing bevestigen?",
"prize_restocking": "Prijsuitreiking in uitvoering...",
"redeem": "Inwisselen",
"invite_friend_install_get_vote_chance_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden om [[{{chance}}]] stemkansen te krijgen.",
"invite_friend_install_get_vote_chance_limit_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden om [[{{chance}}]] stemkansen te krijgen, tot {{limit}} stemkansen.",
"invite_friend_register_get_vote_chance_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien om [[{{chance}}]] stemkansen te krijgen.",
"invite_friend_register_get_vote_chance_limit_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien om [[{{chance}}]] stemkansen te krijgen, tot {{limit}} stemkansen.",
"vote_task_finish_v2": "Voltooid om te krijgen [[{{chance}}]] stemkansen",
"vote_task_finish_limit_v2": "Voltooid om te krijgen [[{{chance}}]] stemkansen, max {{limit}} tijden",
"vote_task_cond_all_v2": "Voltooi alle taken om te krijgen [[{{chance}}]] stemkansen",
"vote_task_cond_all_limit_v2": "Voltooi alle taken om te krijgen [[{{chance}}]] stemkansen, max {{limit}}, al gekregen [[{{num}}]]",
"sign_in_every_day_can_get_vote_v2": "Kom dagelijks en krijg [[{{num}}]] stemkansen",
"vote_num_add": "Stem kansen [[+{{num}}]]",
"confirm_": "Bevestigen",
"vote_chance_done": "Stem kansen [[+{{chance}}]] (Voltooid: [[{{num}}]])",
"vote_chance_done_limit": "Stem kansen [[+{{chance}}]] (voltooid: [[{{num}}]]/{{limit}})",
"vote_success": "Stem succesvol",
"non_voting_hours": "U kunt niet stemmen tijdens niet-stemmingsuren",
"vote_chance_lack": "Onvoldoende stemmogelijkheden",
"insufficient_points": "Onvoldoende punten",
"vote_limit": "De stemming heeft het maximum bereikt.",
"vote_failed": "Stem mislukt",
"odds": "Vreemd",
"playing": "Afspelen",
"card_chance_lack": "Onvoldoende kansen",
"get_color_card": "Ontvang 1 kaart van de opgegeven kleur",
"get_three_card": "Krijg 3 kaarten van elke kleur",
"get_five_card": "Krijg 5 kaarten van elke kleur",
"action_card": "Actiekaart",
"choose_a_color": "Kies een kleur",
"got_a_new_card": "Je hebt een nieuwe kaart.",
"action_card_unlocked": "ACTIEKAART NIET VERBINDEN!",
"claim_prize": "Claimprijs",
"vote_chances": "Tickets",
"coin_log_mall": "Punten Aflossing",
"coin_log_vote": "Stemprocedure",
"coin_log_expired": "Punten verlopen",
"coin_log_reward": "Event Beloningen",
"coin_log_task": "Taakbeloningen",
"coin_log_title": "Punten",
"got": "Begrepen.",
"deduct": "Aftrekken",
"invite_friend_install_get_qa_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden en krijg [[{{chance}}]] kansen om vragen te beantwoorden.",
"invite_friend_install_get_qa_limit_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden en krijg [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
"invite_friend_register_get_qa_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien en krijg [[{{chance}}]] kansen om vragen te beantwoorden.",
"invite_friend_register_get_qa_limit_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien en krijg [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
"qa_task_finish_v2": "Het voltooien ervan zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden.",
"qa_task_finish_limit_v2": "Het voltooien van het zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} voltooiingen.",
"qa_task_cond_all_v2": "Het voltooien van alle taken zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden",
"qa_task_cond_all_limit_v2": "Het voltooien van alle taken zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen, en je hebt al ontvangen [[{{num}}]] kansen",
"sign_in_every_day_can_get_qa_v2": "Elke dag ontvangt u [[{{num}}]] kansen om vragen te beantwoorden.",
"quiz_starting": "De Quiz starten...",
"quiz_ready": "Klaar.",
"quiz_oops": "Oeps!",
"quiz_question_progress": "Vraag [[{{num}}]] van [[{{x}}]]",
"quiz_back": "Terug naar de quiz",
"quiz_review_answers": "Antwoorden herzien",
"quiz_question": "Vraag",
"quiz_no_answer_submitted": "Er werd geen antwoord gegeven",
"quiz_perfect_score": "Perfecte score!",
"quiz_correct_count": "Je hebt [[{{num}}]] van [[{{x}}]] juist!",
"quiz_good_job": "Goed gedaan!",
"quiz_round_complete": "Rond voltooid",
"quiz_correct": "Correct",
"quiz_next": "Volgende",
"quiz_home": "Begin"
}

@ -0,0 +1 @@
{"deduct":"Deduzir","quiz_correct":"Correto","quiz_correct_count":"Você acertou [[{{num}}]] de [[{{x}}]]!","quiz_home":"Início","quiz_next":"Próximo","quiz_question_progress":"Pergunta [[{{num}}]] de [[{{x}}]]","quiz_round_complete":"Rodada concluída","quiz_chances":"Tentativas do quiz","claim_it_now":"Resgate agora!"}

@ -0,0 +1 @@
{"deduct":"Вычесть","quiz_correct":"Верно","quiz_correct_count":"Правильных ответов: [[{{num}}]] из [[{{x}}]]!","quiz_home":"Главная","quiz_next":"Далее","quiz_question_progress":"Вопрос [[{{num}}]] из [[{{x}}]]","quiz_round_complete":"Раунд завершён","quiz_chances":"Попытки в викторине","claim_it_now":"Получить сейчас!"}

@ -0,0 +1 @@
{"deduct":"หัก","quiz_correct":"ถูกต้อง","quiz_correct_count":"คุณตอบถูก [[{{num}}]] จาก [[{{x}}]] ข้อ!","quiz_home":"หน้าหลัก","quiz_next":"ถัดไป","quiz_question_progress":"ข้อที่ [[{{num}}]] จาก [[{{x}}]]","quiz_round_complete":"จบรอบแล้ว","quiz_chances":"โอกาสตอบคำถาม","claim_it_now":"รับเลยตอนนี้!"}

@ -0,0 +1 @@
{"deduct":"Düş","quiz_correct":"Doğru","quiz_correct_count":"[[{{x}}]] sorudan [[{{num}}]] tanesini doğru bildin!","quiz_home":"Ana sayfa","quiz_next":"Sonraki","quiz_question_progress":"Soru [[{{num}}]] / [[{{x}}]]","quiz_round_complete":"Tur tamamlandı","quiz_chances":"Quiz hakkı","claim_it_now":"Şimdi al!"}

@ -0,0 +1 @@
{"deduct":"Khấu trừ","quiz_correct":"Đúng","quiz_correct_count":"Bạn đã trả lời đúng [[{{num}}]] trên [[{{x}}]] câu!","quiz_home":"Trang chủ","quiz_next":"Tiếp theo","quiz_question_progress":"Câu [[{{num}}]] trên [[{{x}}]]","quiz_round_complete":"Hoàn thành vòng","quiz_chances":"Lượt trả lời","claim_it_now":"Nhận ngay!"}

@ -0,0 +1 @@
{"deduct":"扣除","quiz_correct":"正確","quiz_correct_count":"你答對了[[{{num}}]]題,共[[{{x}}]]題!","quiz_home":"首頁","quiz_next":"下一題","quiz_question_progress":"第[[{{num}}]]題,共[[{{x}}]]題","quiz_round_complete":"本輪完成","quiz_chances":"答題機會","claim_it_now":"立即領取"}

@ -0,0 +1,761 @@
{
"close": "关闭",
"invite_share_text": "邀请好友 一起赢奖励 点击链接为好友助力",
"copy_link": "复制链接",
"copy_success": "复制成功",
"invite_friend": "邀请好友",
"invite_friend_": "邀请好友_",
"total_get": "累计获得",
"can_get": "可获得",
"my_invite": "我的邀请",
"invite_record": "邀请记录",
"need_invite": "还需邀请",
"bonus_rules": "奖励规则",
"activity_rules": "活动规则",
"invite_no_record": "还没有邀请记录哦",
"invite_time": "邀请时间",
"user_id": "用户ID",
"reward_cond": "奖励条件",
"target_receive_prizes": "达标后,奖品领取方式",
"receive_prizes": "奖品领取方式",
"copy": "复制",
"bonus_content": "奖励内容",
"prize_details": "奖品详情",
"end_time": "结束时间:",
"start_time": "开始时间:",
"activity_time": "活动时间",
"extra_prizes": "额外奖品",
"quantity": "数量",
"prize": "奖品",
"download_for_each_friend": "每{{num}}个好友下载",
"accumulate_friend_downloads": "累积{{num}}个好友下载",
"max_invite_friend": "最多可邀请{{num}}(含)个好友",
"register_for_each_friend": "每{{num}}个好友注册",
"accumulate_friend_register": "累积{{num}}个好友注册",
"my_task": "我的任务",
"fans": "粉丝",
"target_fans": "已达标粉丝",
"install_and_finish_all_cond": "好友下载并完成所有任务即可达标",
"install_and_finish_one_cond": "好友下载并完成任一任务即可达标",
"completed": "已完成",
"undone": "未完成",
"friend_record": "好友记录",
"task_1": "任务1",
"task_2": "任务2",
"task_3": "任务3",
"invite_friends_to_register": "邀请{{num}}个好友注册",
"invite_friends_to_install": "邀请{{num}}个好友下载",
"no_record": "暂无记录",
"invite_friends_to_target": "邀请{{num}}个好友达标",
"target_for_each_friend": "每{{num}}个好友达标",
"accumulate_friend_target": "累积{{num}}个好友达标",
"prize_list": "奖品列表",
"regular_rewards": "常规奖励",
"extra_rewards": "额外奖励",
"activity_end_text": "活动已经结束啦@下次再来吧!",
"receive": "领取",
"contact_customer_service": "请联系客服领取",
"lottery": "抽奖",
"draws_num": "抽奖次数",
"better_luck_next_time": "下次运气会更好",
"no_winning_record": "还没有中奖记录哦",
"prize_name": "奖品名称",
"lottery_service_err": "服务出错了,稍后再来吧。您的抽奖机会还在,请放心",
"draws_none": "抽奖次数用完啦",
"confirm": "确认",
"try_your_luck": "试试手气",
"get_prize_to_app": "请前往APP内领取奖品",
"target_cond_1": "达标条件一",
"target_cond_2": "达标条件二",
"target_cond_3": "达标条件三",
"all_tasks_to_draw": "完成所有任务即可获得{{num}}次抽奖机会",
"one_tasks_to_draw": "完成一个任务即可获得{{num}}次抽奖机会",
"draws_obtained": "已获取的抽奖次数:",
"reward_record": "奖励记录",
"to_complete": "去完成",
"completed_times": "完成次数",
"winning_record": "中奖记录",
"Winning_time": "中奖时间",
"thank": "谢谢参与",
"no_receive_record": "还没有领取记录哦",
"week_0": "日",
"week_1": "一",
"week_2": "二",
"week_3": "三",
"week_4": "四",
"week_5": "五",
"week_6": "六",
"invite_friend_install_get_sign": "邀请{{num}}个好友下载App,即可获得1张补签卡。",
"invite_num": "已邀请{{num}}人",
"sign_day_num": "签到{{num}}天",
"continue_day_num": "连签{{num}}天",
"day": "天",
"sign_card": "补签卡",
"invite_friend_get_sign_card_text": "错过了一天?邀请朋友下载并获得补签卡!",
"obtain": "获取",
"use_sign_card": "使用一张补签卡",
"confirm_use_sign_card": "补签日期为{{m}}/{{d}},确认补签?",
"sign_success": "签到成功",
"you_got": "您获得了",
"i_see": "我知道了",
"done_sign_day_num": "已签{{num}}天",
"done_continue_day_num": "连续{{num}}天",
"sign_ok": "已签到",
"card_sign_ok": "补签成功",
"continue_sign_ok": "已连签",
"continue_sign_get_reward_text": "连续签到,即可赢取奖励",
"sign_get_reward_text": "累计签到天数达标,即可赢取奖励",
"sign_card_lack": "签到卡不足",
"sign_fail": "签到失败,请刷新页面",
"best_fan": "最佳粉丝",
"top_fans": "Top Fans",
"invite_num_title": "邀请数",
"no_rank_record": "还没有排行榜记录哦",
"vote_none": "投票次数用完啦",
"vote_service_err": "服务出错了,稍后再来吧。您的投票机会还在,请放心",
"hour": "小时",
"minute": "分钟",
"second": "秒",
"hour_f": "小时_",
"minute_f": "分钟_",
"second_f": "秒_",
"vote_num": "当前有{{num}}票可投",
"here_is_the_quiz_title": "这里显示的是竞猜标题",
"option": "选项",
"countdown": "倒计时",
"end": "已结束",
"click_image_select": "点击图片选择",
"wait_reward_reward": "开奖结果还未公布,请稍后再来",
"sure": "确定",
"submit": "提交",
"next_qa": "下一题",
"right": "正确",
"error": "错误",
"right_answer": "正确答案:",
"explain": "解析",
"home": "首页",
"share": "分享",
"download_app_qa": "下载app,参与答题",
"qa_service_err": "服务出错了,稍后再来吧。您的答题机会还在,请放心",
"qa_none": "还没有答题机会哦@邀请好友获取更多机会",
"start": "开始",
"challenge_failed": "挑战失败",
"qa_right": "答对 ",
"keep_try": "继续尝试",
"congratulation": "恭喜您",
"please_choose": "请选择",
"qa_loading": "题库载入中",
"grow_big": "{{name}}长大了",
"click_receive": "点击领取",
"after_receive": "后领取",
"tree_grow_can_get": "果树种成即可得",
"fertilize_standard_text": "在施肥{{num}}%就可以达标啦",
"fertilize": "施肥",
"fertilizer": "肥料",
"need_nutrients_will_die": "需要{{num}}g养料,不然我有可能会枯萎哦",
"get_new_tree": "获取新的小树苗",
"tree_grow_max_text": "您的果树长大了,送您一个小礼物",
"little_tree": "小树苗",
"fertilize_num": "施肥{{num}}g",
"some_withered": "{{name}}枯萎了",
"some_revive": "{{name}}复活了",
"grow_big_and_get_reward": "{{name}}长大了,奖励{{reward_title}}",
"get_grow": "获得了{{name}}",
"props_lack": "道具不足",
"cannot_lv_up": "不能继续升级",
"invite_friend_install_get_fertilizer": "邀请{{num}}个好友下载App,即可获取{{grow_num}}g肥料",
"received_sapling": "你已领取一颗小树苗",
"pick_name": "取一个名字吧",
"growth_manual": "成长手册",
"get_nourishment": "获取养料",
"plant_new_tree": "重新种一棵",
"tree_revive": "复活小树",
"timeout_tree_die": "由于长时间没有施肥,您的树已枯萎",
"invite_friend_install_revive_tree": "邀请{{num}}个好友下载App,即可复活你的小树",
"dog_grow_can_get": "小狗养成即可得",
"feed_standard_text": "在投喂{{num}}%就可以达标啦",
"feed": "投喂",
"dog_food": "狗粮",
"need_dog_food_will_leave": "需要{{num}}g狗粮,不然我有可能会离开哦",
"get_new_dog": "领取新小狗",
"dog_grow_max_text": "您的小狗长大了,送您一个小礼物",
"little_dog": "小狗",
"feed_num": "投喂{{num}}g",
"some_leave": "{{name}}离开了",
"some_come": "{{name}}回来了",
"invite_friend_install_get_dog_food": "邀请{{num}}个好友下载App,即可获取{{grow_num}}g狗粮",
"received_dog": "你已领取一只小狗",
"get_dog_food": "获取狗粮",
"plant_new_dog": "重新养一只",
"rescue_puppy": "挽回小狗",
"timeout_dog_go": "因为长时间没有感受到爱和食物你的小狗已离家出走了",
"invite_friend_install_rescue_puppy": "邀请{{num}}个好友下载App,即可挽回你的小狗",
"get_collect_num": "您获得了{{reward_title}}碎片",
"fixed_point": "指定点数",
"this_props_lack": "您还没有该道具",
"help_record": "助力记录",
"no_help_record": "还没有助力记录哦",
"install_help_record": "有好友下载了App",
"open_help_record": "有好友打开了App",
"click_help_record": "有好友点击了链接",
"service_err": "服务出错了,稍后再来吧。",
"select_reward": "选择奖品",
"view_help_rule": "查看助力规则",
"help_rule": "助力规则",
"install_help": "下载助力",
"install_help_text": "每个好友下载App,进度[[+{{num}}%]]",
"open_help": "打开App助力",
"open_help_text": "每个好友打开App,进度[[+{{num}}%]],最多获得{{limit_num}}%",
"click_help": "点击助力",
"click_help_text": "每个好友点击邀请链接,进度[[+{{num}}%]],最多获得{{limit_num}}%",
"invite_friends_receive_free_gifts": "邀请好友免费领礼品",
"get_prizes": "获取奖品",
"help_success": "助力成功",
"also_get_free": "你也可以免费领",
"install_get_free_reward": "下载app领取免费礼品",
"install_get_reward": "下载App立即领取奖品",
"received_success": "领取成功",
"ballot_record": "抽签记录",
"no_ballot_record": "还没有抽签记录哦",
"ballot_none": "还没有抽签机会哦",
"share_good_luck": "分享有好运",
"ballot": "我抽到了",
"answer_record": "答题记录",
"challenge_results": "挑战结果",
"challenge_time": "挑战时间",
"no_answer_record": "还没有答题记录哦",
"answer_none": "答题次数用完啦",
"please_choose_answer": "请选择答案",
"answer_countdown": "答题倒计时",
"got_prizes": "获得奖品:",
"continue_free_get": "继续免费领",
"finish_help": "完成助力",
"reward_send_your_account": "奖品已发放到您的账户中",
"no_reward_record": "还没有奖励记录哦",
"download_app_ballot": "下载app,参与抽签",
"yesterday": "昨天",
"today": "今天",
"prize_record": "奖品记录",
"get_reward_time": "获奖时间",
"no_sign_card": "还没有补签卡哦",
"get_more_knowledge": "加油!用更多的知识武装自己",
"qa_very_hard": "这些题难倒了99%的人",
"num": "次数",
"contact_customer_service_var": "请联系客服({{contact}})领取",
"like_share_people_lucky": "爱分享的人运气会变好,快去分享吧~",
"my_reward": "我的奖品",
"no_install_prompt": "该社媒平台还没有被安装。",
"please_login": "请登录",
"got_num": "(已获得{{num}}次)",
"completed_num": "(已完成{{num}}次)",
"fixed_roll_none": "还没有幸运骰,邀请{{num}}个好友下载App可获得1个幸运骰",
"fixed_roll_none_limit": "还没有幸运骰,邀请{{num}}个好友下载App可获得1个幸运骰,最多获得{{limit}}个",
"invite_friend_install_get_roll_chance": "邀请{{num}}个好友下载App,可获得{{chance}}个骰子。",
"invite_friend_install_get_roll_chance_limit": "邀请{{num}}个好友下载App,可获得{{chance}}个骰子,最多获得{{limit}}个骰子。",
"invite_friend_register_get_roll_chance": "邀请{{num}}个好友完成注册,可获得{{chance}}个骰子。",
"invite_friend_register_get_roll_chance_limit": "邀请{{num}}个好友完成注册,可获得{{chance}}个骰子,最多获得{{limit}}个骰子。",
"dice_task_finish": "完成可获得{{chance}}个骰子",
"dice_task_finish_limit": "完成可获得{{chance}}个骰子,最多完成{{limit}}次",
"dice_task_num": "任务总共获得的骰子:",
"dice_task_cond_one": "完成任意任务可获得更多骰子",
"dice_task_cond_all": "完成所有任务可以获得{{chance}}个骰子",
"dice_task_cond_all_limit": "完成所有任务可以获得{{chance}}个骰子,最多获得{{limit}}次,已获得{{num}}次",
"spin_now": "立即抽奖",
"spinning": "转起来",
"expires_in": "过期时间",
"records": "记录",
"luck_you": "太幸运了",
"get_extra_reward": "你获得了额外奖励",
"share_get": "分享后",
"upgrade_reward": "升级奖励",
"super_upgrade": "超级升级!",
"preparation": "预备",
"invite_get_energy": "完成邀请可获得能量",
"invite_friend_get_energy": "邀请好友获得能量",
"up_to": "最多升至",
"spin": "可抽",
"away": "还差{{num}}点能量",
"win_left_energy": "还差{{num}}次抽奖即可赢得{{cash}}",
"enjoy_credit": "代币增加",
"invite_no_record_reward": "你还没有邀请任何人哦,邀请好友来获得奖励吧~",
"spin_reward": "转盘抽奖",
"share_reward": "分享领奖",
"start_reward": "开箱有奖",
"left_cash_get_reward": "还差{{left}}获得{{cash}}奖励",
"auto_spin": "[[{{second}}]]秒后自动抽奖",
"guarantee_to": "只要完成最后一次抽奖即可[[赢得{{cash}}]]",
"auto_select": "[[{{second}}]]秒后自动选择",
"open": "打开",
"select_box": "选择1个礼盒看看能获得多少现金奖",
"money_reward": "现金奖励",
"jackpot_best_prize": "大奖!最高奖励",
"best_prize": "最高&&奖励",
"almost_reward": "马上可以领取奖励了!",
"claimed_reward": "已经有超过[[10000+]]的用户领取了奖励",
"pass_on_energy": "发放能量到您的账户",
"victory_tip": "胜利就在眼前,[[把握机会]]",
"min_won_barrage": "{{name}}在{{min}}分钟前获得了[[{{cash}}]]",
"closer_to_prize": "你离大奖越来越近啦",
"shine_arrived": "闪耀的时刻即将到来,抓住它",
"get_money_reward": "打开盒子获得现金奖品",
"won_barrage": "[[{{name}}]] 已经获得了 [[{{cash}}]]",
"surprise_for_you": "惊喜礼盒",
"last_spin_win": "距离领奖只差1次抽奖!",
"energy": "能量",
"token": "代币",
"your_reward": "您的奖励",
"go_to": "前往使用",
"click_contact": "点击联系客服",
"click_contact_tip": "已复制联系方式\n请前往联系",
"see_reward": "查看奖品",
"prize_gone": "奖品发完啦",
"no_reward_get": "你来得太晚啦,奖品已经全部发完啦~",
"no_more_record": "没有更多记录",
"help_fail": "助力失败",
"grand_opening": "盛大开幕",
"get_reward_after_play": "每个人在游戏后都会获得奖励!",
"play_and_get_prize": "玩游戏并赢取属于你的奖品!",
"won_free_gift": "你赢得了一个待领取奖品",
"download_app_get_gift": "下载App领取您的奖品",
"download": "下载",
"jackpot": "大奖",
"play": "开奖",
"install_ineligible": "无法领奖(非新安装用户)",
"unlock_your_luck": "奇迹再现",
"spin_and_win": "决定就是你了,皮卡丘",
"play_to_win_prize": "这些奖品您不拿一个走吗?",
"you_got_the_best_prize": "你获得了最好的奖品",
"play_and_win": "玩游戏并赢",
"download_to_get": "下载app即可领取",
"best_prize_!": "最高奖励!",
"roll_dice_number": "掷骰子,点数{{point}}",
"lucky_dice_number": "使用幸运骰子,点数{{point}}",
"day_sign": "每日签到",
"finish_all_task": "完成所有任务",
"finish_one_task": "完成任务",
"finish_friend_register": "完成好友注册任务",
"finish_friend_install": " 完成邀请App下载任务",
"finish_lucky_dice_task": "完成获取幸运骰子任务",
"fragment": "碎片",
"click": "点击",
"collect_fragment_compare_reward": "收集{{num}}个碎片即可合成奖品",
"craft_fragments": "合成碎片",
"reward_lack_contact_customer_service": "奖品售罄,如需帮助请联系客服",
"join_in_campaign": "参与活动",
"contact": "联系客服",
"all": "全部",
"contact_information": "联系方式",
"no_more_dice": "骰子不足",
"try_your_luck_first_upper": "看看你有多幸运",
"fill_in": "填写表单",
"submit_success": "提交成功",
"please_do_not_submit_repeatedly": "请勿重复提交",
"submitted": "已提交",
"please_complete_the_form": "请完善表单",
"welcome_gifts": "迎接礼物到来",
"spin_to_win": "旋转赢取",
"view": "查看",
"use": "使用",
"get_and_use": "领取并使用",
"invite_friend_install_get_lottery_chance": "邀请{{num}}个好友下载App,可获得{{chance}}次抽奖机会。",
"invite_friend_install_get_lottery_chance_limit": "邀请{{num}}个好友下载App,可获得{{chance}}次抽奖机会,最多获得{{limit}}次抽奖机会。",
"invite_friend_register_get_lottery_chance": "邀请{{num}}个好友完成注册,可获得{{chance}}次抽奖机会。",
"invite_friend_register_get_lottery_chance_limit": "邀请{{num}}个好友完成注册,可获得{{chance}}次抽奖机会,最多获得{{limit}}次抽奖机会。",
"lottery_task_finish": "完成可获得{{chance}}次抽奖机会",
"lottery_task_finish_limit": "完成可获得{{chance}}次抽奖机会,最多完成{{limit}}次",
"lottery_task_num": "完成任务获得的抽奖次数",
"lottery_task_cond_one": "完成任一任务即可获得抽奖机会",
"lottery_task_cond_all": "完成所有任务可以获得{{chance}}次抽奖机会",
"lottery_task_cond_all_limit": "完成所有任务可以获得{{chance}}次抽奖机会,最多获得{{limit}}次,已获得{{num}}次",
"raffle_chances": "抽奖机会",
"quiz_chances": "答题机会",
"get_lottery_chances": "获取抽奖机会",
"remaining_raffle_chances": "可用抽奖次数",
"lottery_again": "再抽一次",
"use_immediately": "立即使用",
"wow_you_got": "哇!恭喜你",
"next_time": "非常遗憾",
"dice_record": "骰子记录",
"sign_in_every_day_can_get_dice": "每天过来都会赠送{{num}}个骰子哦~",
"do_task_get_dice": "做任务获得骰子",
"do_task_get_lottery": "做任务获得抽奖机会",
"refresh_tomorrow": "明天再来",
"click_icon": "点击社媒ICON",
"paste_to_media": "社媒粘贴邀请",
"get_prize": "获得奖品",
"copy_success_paste_to_media": "复制成功,请粘贴至社交媒体",
"invite_friend_install_get_grow": "邀请{{num}}个好友下载App,可获得{{chance}}个成长道具。",
"invite_friend_install_get_grow_limit": "邀请{{num}}个好友下载App,可获得{{chance}}个成长道具,最多获得{{limit}}个成长道具。",
"invite_friend_register_get_grow": "邀请{{num}}个好友完成注册,可获得{{chance}}个成长道具。",
"invite_friend_register_get_grow_limit": "邀请{{num}}个好友完成注册,可获得{{chance}}个成长道具,最多获得{{limit}}个成长道具。",
"grow_task_finish": "完成可获得{{chance}}个成长道具",
"grow_task_finish_limit": "完成可获得{{chance}}个成长道具,最多完成{{limit}}次",
"grow_task_cond_one": "完成任一任务即可获得成长道具",
"grow_task_cond_all": "完成所有任务可以获得{{chance}}个成长道具",
"grow_task_cond_all_limit": "完成所有任务可以获得{{chance}}个成长道具,最多获得{{limit}}次,已获得{{num}}次",
"do_task_get_grow": "做任务获得成长道具",
"easy_mode": "简易模式",
"mins_ago": "{{min}}分钟前",
"barrage_got_reward": "通过参加幸运抽奖获得了[[{{title}}]]。",
"sold_out": "库存不足",
"task_done": "任务完成",
"click_copy_link": "点击“复制链接”",
"select_card": "选取卡牌",
"raffle_chances_lack": "机会不足",
"raffle_chances_lack_tip": "您的抽奖机会不足,快去页面下方完成任务获得抽奖机会吧",
"get_more_chance": "获得更多机会",
"flip_now": "立即翻牌",
"raffle_num": "抽奖次数_",
"win": "赢得",
"next_week_do": "下周再来",
"week_do_1": "周一再来",
"week_do_2": "周二再来",
"week_do_3": "周三再来",
"week_do_4": "周四再来",
"week_do_5": "周五再来",
"week_do_6": "周六再来",
"week_do_7": "周天再来",
"to_flip": "去抽卡",
"won_get": "恭喜获得",
"invite_friend_download": "邀请{{num}}位好友下载App",
"invite_friend_register": "邀请{{num}}位好友注册",
"fixed_roll_none_register": "还没有幸运骰,邀请{{num}}个好友注册可获得1个幸运骰",
"fixed_roll_none_register_limit": "还没有幸运骰,邀请{{num}}个好友注册可获得1个幸运骰,最多获得{{limit}}个",
"sign_in_every_day_can_get_lottery": "每天过来都会赠送{{num}}次抽奖机会哦~",
"finish_newcomer_task": "[[新人]]完成任务获得[[{{reward_title}}]]",
"done_newcomer_task": "新人任务",
"register_help_record": "有好友完成了注册",
"register_help_text": "每个好友完成注册,进度[[+{{num}}%]]",
"register_help": "注册助力",
"invite_friend_install_get_qa": "邀请{{num}}个好友下载App,可获得{{chance}}次答题机会。",
"invite_friend_install_get_qa_limit": "邀请{{num}}个好友下载App,可获得{{chance}}次答题机会,最多获得{{limit}}次答题机会。",
"invite_friend_register_get_qa": "邀请{{num}}个好友完成注册,可获得{{chance}}次答题机会。",
"invite_friend_register_get_qa_limit": "邀请{{num}}个好友完成注册,可获得{{chance}}次答题机会,最多获得{{limit}}次答题机会。",
"qa_task_finish": "完成可获得{{chance}}次答题机会",
"qa_task_finish_limit": "完成可获得{{chance}}次答题机会,最多完成{{limit}}次",
"qa_task_cond_one": "完成任一任务即可获得答题机会",
"qa_task_cond_all": "完成所有任务可以获得{{chance}}次答题机会",
"qa_task_cond_all_limit": "完成所有任务可以获得{{chance}}次答题机会,最多获得{{limit}}次,已获得{{num}}次",
"sign_in_every_day_can_get_qa": "每天过来都会赠送{{num}}次答题机会哦~",
"do_task_get_qa": "做任务获得答题机会",
"help_install": "[[{{name}}]]获得了[[安装助力]]",
"help_register": "[[{{name}}]]获得了[[注册助力]]",
"help_open": "[[{{name}}]]获得了[[拉日活助力]]",
"help_click": "[[{{name}}]]获得了[[点击助力]]",
"finish_help_get_reward": "[[{{name}}]]完成助力任务,获得[[{{reward_title}}]]",
"a_gift_to_you": "送给你的奖品",
"choose_it": "就要它",
"nice_choice": "很好的选择!",
"tip": "提示",
"left_percent_get_reward": "还差[[{{left}}%]]获得奖励",
"ensure_select_reward": "确认选择[[{{reward_title}}]]?",
"reward_obtained": "已获得奖励",
"lucky": "幸运",
"percent_progress_for_you": "你获得了一个免费的 [[{{percent}}%]]助力!",
"invite": "邀请好友___",
"help_task": "助力任务",
"finish_all_task_help_parent": "完成以下所有任务即可助力好友",
"finish_one_task_help_parent": "完成以下任意任务即可助力好友",
"task_index": "任务{{index}}",
"raise_pet_to_get_free_gift": "饲养宠物可获得免费礼物",
"step": "步骤",
"pick_item": "选择物品",
"raise_pet": "饲养宠物",
"get_free_gift": "获得免费礼物",
"has_got": "{{name}}获得了{{reward_title}}",
"more_unexpected_gifts": "饲养宠物期间的更多意想不到的礼物",
"pick_it": "选择它",
"picked": "人选择",
"your_gift_confirm": "您的礼物请确认",
"free": "免费",
"raise_the_dog_to_get_your": "养狗以获得你的",
"free_gift": "免费礼物!",
"expires_in_day": "{{day}} 天后过期",
"collect_more_love": "再收集[[{{num}}]]个爱心点数即可获得免费礼物",
"collect": "收集",
"claim_now": "立即领取",
"feed_more_times": "再喂 {{num}} 次",
"get_more": "获得更多",
"first_referral_bonus": "首次推荐奖励!",
"get_rewards_first_time": "首次邀请好友可获得奖励",
"first_invite_receive": "第一次邀请新用户将获得 [[{{num}}]]",
"invite_now": "立即邀请",
"invite_get_dog_foods": "邀请朋友赚取食品",
"invite_friends": "邀请好友__",
"pick_a_gift": "选择一个免费礼物",
"feed_3_times": "喂食3次",
"invite_new_user_extra_get": "邀请新用户首次可以获得额外 [[{{num}}]]",
"reward_upgraded": "奖励升级",
"reward_for_you": "给你[[{{reward_title}}]]",
"time_s_up": "时间到了!",
"play_again": "再玩一次",
"complete_tasks_to_earn_reward": "完成任务获得奖励",
"super": "超级",
"super_benefit": "超级福利",
"task_cond_one": "完成任意任务即可获得[[奖励]]",
"task_cond_all": "完成所有任务可以获得{{reward_title}}[[+{{num}}]]",
"congrats": "恭喜!",
"enjoy_your": "享受你的",
"try_again_to_claim": "再试一次以领取你的礼物",
"collect_love": "收集爱心",
"finish_step": "完成了阶段任务",
"finish_feed": "完成了喂养任务",
"friend_third_feed": "好友完成喂养3次狗粮",
"friend_first_third_feed": "每日首邀好友完成喂养3次狗粮",
"friend_select_reward": "好友选择了奖品",
"friend_first_select_reward": "每日首邀好友选择了奖品",
"rewards": "奖励",
"round_expired": "回合已结束",
"love_points": "爱心点数",
"dog_food_lack": "请去获得更多的狗粮",
"collect_machine": "领取了狗粮机",
"max_grow": "超过最大养成次数",
"please_collect_love": "请先收集爱心",
"continue_grow": "当前宠物还能继续养",
"dog_food_machine_running": "狗粮生产中",
"reward_remove": "奖品已下架",
"reward_get_max": "奖品已超过获得的最大上限",
"i_am_hungry": "我饿了!",
"effect_invite": "成功邀请一个好友",
"day_first_effect_invite": "当日首次成功邀请好友",
"finish_many_feed": "完成了多次喂养",
"daily_rewards": "每日奖励",
"come_back_tomorrow_for_more_rewards": "明天回来获得更多奖励!",
"claim_today_reward": "领取今天的奖励!",
"come_back_tomorrow": "明天再來!",
"fail_to_sign_progress_reset": "如果连续签到失败,你的进度将被重置",
"signed_in": "已签到_",
"signed_title": "签到",
"you_got_the_gift_box": "你拿到了礼物盒",
"use_it": "使用它",
"you_got_dog_food": "你获得了{{num}}份狗粮",
"you_got_reward": "您获得了{{reward_title}}",
"invite_contest": "邀请竞赛",
"rewards_earned_to_your_account": "获得的奖励将[[直接进入]]您的账户",
"invite_more_friends": "邀请更多好友",
"invited": "{{num}}已邀请",
"daily_fortune_draw": "每日幸运抽奖",
"win_free_gift_every_day": "每天赢取免费礼物!",
"draw_now": "立即抽奖_",
"day_num": "第{{num}}天",
"you": "你",
"blind_box": "幸运盒子",
"daily_draw": "每日抽奖",
"rankings": "排行榜",
"rank_reward": "排名活动奖励",
"sign_reward": "签到奖励",
"blind_reward": "盲盒奖励",
"lucky_reward": "抽奖奖励",
"tomorrow": "明天",
"win_reward": "赢得[[{{title}}]]",
"rank_end": "排名结束",
"congrats_for_getting": "恭喜获得_",
"ends_in": "结束于",
"invite_friend_download_app": "邀请[[{{num}}]]位好友下载App",
"invite_friend_register_app": "邀请[[{{num}}]]位好友注册",
"invite_friend_install_get_lottery_chance_v2": "邀请[[{{num}}]]个好友下载App,可获得[[{{chance}}]]次抽奖机会。",
"invite_friend_install_get_lottery_chance_limit_v2": "邀请[[{{num}}]]个好友下载App,可获得[[{{chance}}]]次抽奖机会,最多获得{{limit}}次抽奖机会。",
"invite_friend_register_get_lottery_chance_v2": "邀请[[{{num}}]]个好友完成注册,可获得[[{{chance}}]]次抽奖机会。",
"invite_friend_register_get_lottery_chance_limit_v2": "邀请[[{{num}}]]个好友完成注册,可获得[[{{chance}}]]次抽奖机会,最多获得{{limit}}次抽奖机会。",
"lottery_task_finish_v2": "完成可获得[[{{chance}}]]次抽奖机会",
"lottery_task_finish_limit_v2": "完成可获得[[{{chance}}]]次抽奖机会,最多完成{{limit}}次",
"lottery_task_cond_all_v2": "完成所有任务可以获得[[{{chance}}]]次抽奖机会",
"lottery_task_cond_all_limit_v2": "完成所有任务可以获得[[{{chance}}]]次抽奖机会,最多获得{{limit}}次,已获得[[{{num}}]]次",
"sign_in_every_day_can_get_lottery_v2": "每天过来都会赠送[[{{num}}]]次抽奖机会哦~",
"invite_friends_to_earn_reward": "邀请好友赢取奖励",
"raffle_num_add": "抽奖次数[[+{{num}}]]",
"click_button_and_get_coins": "点击按钮完成任务并获得更多金币",
"do_task_get_energy": "完成任务可获得能量",
"coins": "{{num}} 个金币",
"get_tasks": "获取任务",
"next": "下一个",
"finish_task_title": "完成了\"{{title}}\"",
"get_energy": "获取能量",
"tasks": "任务",
"invite_friend_install_get_gold": "邀请{{num}}个好友下载App,可获得{{chance}}个金币。",
"invite_friend_install_get_gold_limit": "邀请{{num}}个好友下载App,可获得{{chance}}个金币,最多获得{{limit}}个金币。",
"invite_friend_register_get_gold": "邀请{{num}}个好友完成注册,可获得{{chance}}个金币。",
"invite_friend_register_get_gold_limit": "邀请{{num}}个好友完成注册,可获得{{chance}}个金币,最多获得{{limit}}个金币。",
"gold_task_finish": "完成可获得{{chance}}个金币",
"gold_task_finish_limit": "完成可获得{{chance}}个金币,最多完成{{limit}}次",
"gold_task_cond_one": "完成任一任务即可获得金币",
"gold_task_cond_all": "完成所有任务可以获得{{chance}}个金币",
"gold_task_cond_all_limit": "完成所有任务可以获得{{chance}}个金币,最多获得{{limit}}次,已获得{{num}}次",
"do_task_get_gold": "做任务获得金币",
"task_none": "没有可完成的任务",
"finish_task_earn_num": "完成任务可获得 [[+{{num}}]]",
"reached_the_max": "达到最大值",
"has_got_style": "[[{{name}}]]获得了[[{{reward_title}}]]",
"dog_food_num": "{{num}}g狗粮",
"in_production": "生产中",
"active_talk": "你很久没有来看我了。多来几次以获得更多奖励。",
"task_reset_talk": "你的一个奖品即将过期,快来看看吧。",
"dog_offline_talk": "您有一份宠粮已到账,请前往领取。",
"complete_task_talk": "您完成任务啦,恭喜获得一份奖品,快来领取吧。",
"current_total_prize_pool": "当前奖池总金额",
"get_coin": "[[{{name}}]] 获得了 [[{{num}}]] 金币",
"join_coin_num": "[[{{name}}]] 参与瓜分 [[*{{num}}]]",
"join_coin": "瓜分金币",
"coin_per_use": "{{num}}金币/次",
"expected_to_receive_coin": "预计可获得[[{{num}}]]金币",
"collect_coin": "[[{{num}}]] 金币可领取",
"more": "更多",
"expired": "已过期",
"gold_coins_deposited": "金币到账",
"timeout_and_no_collection": "超时未领取",
"use_gold_coins_to_play": "请确定是否使用[[{{num}}]]金币参与游戏",
"cancel": "取消",
"play_limit_next_round": "您已达到游戏限制!请在下轮回来!",
"insufficient_balance_grab_gold": "余额不足,无法参与",
"do_task": "做任务",
"this_round_has_ended": "当前场次已经结束,无法参加",
"claim": "领取_",
"claim_it_now": "立即领取",
"claim_time_not_reached": "没到领奖时间",
"success": "成功",
"too_late_reward_expired": "太晚了!奖励已过期",
"no_duplicate_claims": "不允许重复领取",
"buy_more": "购买更多",
"operation_failed": "操作失败,请稍后重试",
"expected_to_be_available_tomorrow": "明天预计可领取",
"expected_to_be_available_in_day": "{{day}}天后预计可领取",
"num_gold_coins": "[[{{num}}]]金币",
"check_in_now": "立即签到",
"complete_daily_check_ins_for_prizes": "完成每日签到获取奖励",
"check_in_days": "签到天数",
"lottery_chance_done": "抽奖次数[[+{{chance}}]](已完成:[[{{num}}]])",
"lottery_chance_done_limit": "抽奖次数[[+{{chance}}]](已完成:[[{{num}}]]/{{limit}})",
"claim_failed": "领取失败,请联系客服",
"answer_tomorrow_get_chance": "明天还可以获得{{chance}}次答题机会",
"finish_invite_task": "完成了邀请任务",
"dice_chance_done": "骰子[[+{{chance}}]](已完成:[[{{num}}]])",
"dice_chance_done_limit": "骰子[[+{{chance}}]](已完成:[[{{num}}]]/{{limit}})",
"grow_chance_done": "成长道具[[+{{chance}}]](已完成:[[{{num}}]])",
"grow_chance_done_limit": "成长道具[[+{{chance}}]](已完成:[[{{num}}]]/{{limit}})",
"qa_chance_done": "答题机会[[+{{chance}}]](已完成:[[{{num}}]])",
"qa_chance_done_limit": "答题机会[[+{{chance}}]](已完成:[[{{num}}]]/{{limit}})",
"help_wait": "助力中",
"distributing": "发放中",
"distribution_failed": "发放失败",
"claimed": "已领取",
"no_prizes_to_claim": "未查询到您有需要领取的奖品",
"points_use": "消耗{{num}}积分",
"points_use_ok": "兑换成功",
"points_use_lack": "积分不足_",
"points_use_close": "兑换功能已关闭",
"points_use_day_limit": "已达到每日兑换次数上限",
"points_use_limit": "已达到兑换次数上限",
"points_use_dice": "消耗[[{{num}}]]兑换[[{{chance}}]]个骰子?",
"points_use_lottery": "消耗[[{{num}}]]兑换[[{{chance}}]]次抽奖机会?",
"times": "次",
"dice": "骰子",
"one_spin": "1次",
"raise_the_pet_to_get_your": "养宠物以获得你的",
"pet_food_num": "{{num}}g宠粮",
"pet_food": "宠粮",
"friend_third_feed_pet": "好友完成喂养3次宠物",
"friend_first_third_feed_pet": "每日首邀好友完成喂养3次宠物",
"collect_machine_food": "宠粮机已领取",
"pet_food_lack": "请去获得更多的宠粮",
"pet_food_machine_running": "宠粮生产中",
"chat_day_limit": "今天我有点累了",
"chat_token_limit": "我很累了",
"chat": "聊天",
"hours_ago": "{{hour}}小时前",
"conversation_and_chat": "您可以发起对话,和您的宠物聊天哟",
"invite_friend_install_get_vote_chance": "邀请{{num}}个好友下载App,可获得{{chance}}次投票机会。",
"invite_friend_install_get_vote_chance_limit": "邀请{{num}}个好友下载App,可获得{{chance}}次投票机会,最多获得{{limit}}次投票机会。",
"invite_friend_register_get_vote_chance": "邀请{{num}}个好友完成注册,可获得{{chance}}次投票机会。",
"invite_friend_register_get_vote_chance_limit": "邀请{{num}}个好友完成注册,可获得{{chance}}次投票机会,最多获得{{limit}}次投票机会。",
"vote_task_finish": "完成可获得{{chance}}次投票机会",
"vote_task_finish_limit": "完成可获得{{chance}}次投票机会,最多完成{{limit}}次",
"vote_task_num": "完成任务获得的投票机会",
"vote_task_cond_one": "完成任一任务即可获得投票机会",
"vote_task_cond_all": "完成所有任务可以获得{{chance}}次投票机会",
"vote_task_cond_all_limit": "完成所有任务可以获得{{chance}}次投票机会,最多获得{{limit}}次,已获得{{num}}次",
"do_task_get_vote": "做任务获得投票机会",
"sign_in_every_day_can_get_vote": "每天过来都会赠送{{num}}次投票机会哦~",
"your_choice": "你的选择",
"cap_win": "赢",
"cap_draw": "平局",
"blue_team": "蓝队",
"red_team": "红队",
"spend_coin_to_vote_team": "确定要花费[[{{coin}}]]为<<{{title}}>>投票吗?",
"vote_team": "确定为[[{{title}}]]投票吗?",
"vote_sure": "确认投票?",
"no_scheduled": "暂无赛程",
"schedule": "赛程",
"in_progress": "进行中",
"participated": "已参与",
"vote_soon": "即将投票",
"vote": "投票",
"pending": "待结算",
"settled": "已结算",
"spend_coin_redeem_reward": "确定要花费[[{{coin}}]]兑换<<{{title}}>>吗?",
"redeem_sure": "确认兑换?",
"prize_restocking": "奖品补货中...",
"redeem": "兑换",
"invite_friend_install_get_vote_chance_v2": "邀请[[{{num}}]]个好友下载App,可获得[[{{chance}}]]次投票机会。",
"invite_friend_install_get_vote_chance_limit_v2": "邀请[[{{num}}]]个好友下载App,可获得[[{{chance}}]]次投票机会,最多获得{{limit}}次投票机会。",
"invite_friend_register_get_vote_chance_v2": "邀请[[{{num}}]]个好友完成注册,可获得[[{{chance}}]]次投票机会。",
"invite_friend_register_get_vote_chance_limit_v2": "邀请[[{{num}}]]个好友完成注册,可获得[[{{chance}}]]次投票机会,最多获得{{limit}}次投票机会。",
"vote_task_finish_v2": "完成可获得[[{{chance}}]]次投票机会",
"vote_task_finish_limit_v2": "完成可获得[[{{chance}}]]次投票机会,最多完成{{limit}}次",
"vote_task_cond_all_v2": "完成所有任务可以获得[[{{chance}}]]次投票机会",
"vote_task_cond_all_limit_v2": "完成所有任务可以获得[[{{chance}}]]次投票机会,最多获得{{limit}}次,已获得[[{{num}}]]次",
"sign_in_every_day_can_get_vote_v2": "每天过来都会赠送[[{{num}}]]次投票机会哦~",
"vote_num_add": "投票次数[[+{{num}}]]",
"confirm_": "确认_",
"vote_chance_done": "投票次数[[+{{chance}}]](已完成:[[{{num}}]])",
"vote_chance_done_limit": "投票次数[[+{{chance}}]](已完成:[[{{num}}]]/{{limit}})",
"vote_success": "投票成功",
"non_voting_hours": "非投票时段无法投票",
"vote_chance_lack": "投票机会不足",
"insufficient_points": "积分不足",
"vote_limit": "投票已达上限",
"vote_failed": "投票失败",
"odds": "赔率",
"playing": "比赛中",
"card_chance_lack": "抽卡次数不足",
"get_color_card": "获得指定颜色的1张牌",
"get_three_card": "获得任意颜色的3张牌",
"get_five_card": "获得任意颜色的5张牌",
"action_card": "功能牌",
"choose_a_color": "请选择颜色",
"got_a_new_card": "你获得了一张新卡牌。",
"action_card_unlocked": "功能牌已解锁!",
"claim_prize": "领取奖励",
"vote_chances": "投票机会",
"coin_log_mall": "积分兑换",
"coin_log_vote": "活动投票",
"coin_log_expired": "积分过期",
"coin_log_reward": "活动奖励",
"coin_log_task": "任务奖励",
"coin_log_title": "积分记录",
"got": "获得",
"deduct": "扣除",
"invite_friend_install_get_qa_v2": "邀请[[{{num}}]]个好友下载App,可获得[[{{chance}}]]次答题机会。",
"invite_friend_install_get_qa_limit_v2": "邀请[[{{num}}]]个好友下载App,可获得[[{{chance}}]]次答题机会,最多获得{{limit}}次答题机会。",
"invite_friend_register_get_qa_v2": "邀请[[{{num}}]]个好友完成注册,可获得[[{{chance}}]]次答题机会。",
"invite_friend_register_get_qa_limit_v2": "邀请[[{{num}}]]个好友完成注册,可获得[[{{chance}}]]次答题机会,最多获得{{limit}}次答题机会。",
"qa_task_finish_v2": "完成可获得[[{{chance}}]]次答题机会",
"qa_task_finish_limit_v2": "完成可获得[[{{chance}}]]次答题机会,最多完成{{limit}}次",
"qa_task_cond_all_v2": "完成所有任务可以获得[[{{chance}}]]次答题机会",
"qa_task_cond_all_limit_v2": "完成所有任务可以获得[[{{chance}}]]次答题机会,最多获得{{limit}}次,已获得[[{{num}}]]次",
"sign_in_every_day_can_get_qa_v2": "每天过来都会赠送[[{{num}}]]次答题机会哦~",
"quiz_starting": "开始答题...",
"quiz_ready": "准备...",
"quiz_oops": "哎呀!",
"quiz_question_progress": "第[[{{num}}]]题,共[[{{x}}]]题",
"quiz_back": "返回答题",
"quiz_review_answers": "查看答案",
"quiz_question": "题目",
"quiz_no_answer_submitted": "未提交答案",
"quiz_perfect_score": "满分!",
"quiz_correct_count": "你答对了[[{{num}}]]题,共[[{{x}}]]题!",
"quiz_good_job": "做得好!",
"quiz_round_complete": "本轮完成",
"quiz_correct": "正确_",
"quiz_next": "下一题_",
"quiz_home": "首页_"
}

@ -0,0 +1,22 @@
## 阿拉伯语、德语、英语、西班牙语、法语、印尼语、意大利语、日语、韩语、葡萄牙语、俄语、泰语、土耳其语、越南语、中文、繁体中文、匈牙利语、捷克语、荷兰语、波兰语、罗马尼亚语
阿拉伯语: ar
德语: de
英语: en
西班牙语: es
法语: fr
印尼语: id
意大利语: it
日语: ja
韩语: ko
葡萄牙语: pt
俄语: ru
泰语: th
土耳其语: tr
越南语: vi
中文: zh
繁体中文: zh-TW
匈牙利语: hu
捷克语: cs
荷兰语: nl
波兰语: pl
罗马尼亚语: ro

@ -0,0 +1,40 @@
{
"completed": "تم",
"congrats": "مبروك!",
"finish_task_get_reward": "إنهاء سيكسبك",
"next_week_do": "الأسبوع المقبل",
"ok": "حسنًا",
"receive": "احصل",
"refresh_tomorrow": "سيتم التحديث غدًا",
"remain_time_text": "الوقت المتبقي",
"step": "الخطوة {{num}}",
"time_d": "{{d}} يوم",
"time_d_h": "{{d}} يوم {{h}} ساعة",
"time_h": "{{h}} ساعة",
"time_h_m": "{{h}} ساعة {{m}} دقيقة",
"time_m": "{{m}} دقيقة",
"time_m_s": "{{m}} دقيقة {{s}} ثانية",
"time_s": "{{s}} ثانية",
"to_complete": "لإكمال",
"use": "الاستخدام",
"week_do_1": "تحديث الإثنين",
"week_do_2": "تحديث الثلاثاء",
"week_do_3": "تحديث الأربعاء",
"week_do_4": "تحديث الخميس",
"week_do_5": "تحديث الجمعة",
"week_do_6": "تحديث السبت",
"week_do_7": "تحديث الأحد",
"exchange": "استبدال",
"exchange_tips": "هل أنت متأكد من إنفاق [[{{coin}}]] لاستبدال <<{{title}}>>؟",
"confirm_exchange": "تأكيد الاستبدال؟",
"exchange_success": "تم الاستبدال بنجاح",
"cancel": "إلغاء",
"restock_tips": "المكافآت قيد التوريد...",
"sold_out": "نفدت الكمية",
"coming_soon": "قريبًا",
"discontinued": "تم إزالته",
"exchange_limit": "حد الاستبدال",
"points_lack": "نقاط غير كافية",
"exchange_middle": "جاري الاستبدال",
"exchange_failed": "فشل الاستبدال، يرجى المحاولة مرة أخرى لاحقًا"
}

@ -0,0 +1,40 @@
{
"completed": "Dokončeno",
"congrats": "Gratulujeme!",
"finish_task_get_reward": "Dokončením získáte odměnu",
"next_week_do": "Návštěva příští týden",
"ok": "OK",
"receive": "Vyzvednout",
"refresh_tomorrow": "Zítra znovu",
"remain_time_text": "Zbývající čas",
"step": "Krok {{num}}",
"time_d": "{{d}} dnů",
"time_d_h": "{{d}} dnů {{h}} hodin",
"time_h": "{{h}} hodin",
"time_h_m": "{{h}} hodin {{m}} minut",
"time_m": "{{m}} minut",
"time_m_s": "{{m}} minut {{s}} vteřin",
"time_s": "{{s}} vteřin",
"to_complete": "Dokončit",
"use": "Použít",
"week_do_1": "Návštěva v pondělí",
"week_do_2": "Návštěva v úterý",
"week_do_3": "Návštěva ve středu",
"week_do_4": "Návštěva ve čtvrtek",
"week_do_5": "Návštěva v pátek",
"week_do_6": "Návštěva v sobotu",
"week_do_7": "Návštěva v neděli",
"exchange": "Výměna",
"exchange_tips": "Opravdu chcete utratit [[{{coin}}]] za výměnu „<<{{title}}>>“?",
"confirm_exchange": "Potvrdit výměnu?",
"exchange_success": "Výměna proběhla úspěšně",
"cancel": "Zrušit",
"restock_tips": "Doplnění ceny...",
"sold_out": "Vyprodáno",
"coming_soon": "Brzy k dispozici",
"discontinued": "Není v prodeji",
"exchange_limit": "Limit výměny",
"points_lack": "Nedostatečné body",
"exchange_middle": "Probíhá výměna",
"exchange_failed": "Výměna se nezdařila, zkuste to prosím později"
}

@ -0,0 +1,40 @@
{
"completed": "erledigt",
"congrats": "Herzlichen Glückwunsch!",
"finish_task_get_reward": "Durch Abschluss erhältst du",
"next_week_do": "Nächste Woche",
"ok": "OK",
"receive": "Einlösen",
"refresh_tomorrow": "Aktualisierung morgen",
"remain_time_text": "Verbleibende Zeit",
"step": "Schritt {{num}}",
"time_d": "{{d}} Tage",
"time_d_h": "{{d}} Tage {{h}} Stunden",
"time_h": "{{h}} Stunden",
"time_h_m": "{{h}} Stunden {{m}} Minuten",
"time_m": "{{m}} Minuten",
"time_m_s": "{{m}} Minuten {{s}} Sekunden",
"time_s": "{{s}} Sekunden",
"to_complete": "Gehen",
"use": "Benutzen",
"week_do_1": "Mo Aktualisieren",
"week_do_2": "Di. Aktualisieren",
"week_do_3": "Mi Aktualisieren",
"week_do_4": "Do Aktualisieren",
"week_do_5": "Fr Aktualisieren",
"week_do_6": "Sa Aktualisieren",
"week_do_7": "So Aktualisieren",
"exchange": "Einlösen",
"exchange_tips": "Möchtest du [[{{coin}}]] ausgeben, um <<{{title}}>> einzulösen?",
"confirm_exchange": "Einlösen bestätigen?",
"exchange_success": "Einlösung erfolgreich",
"cancel": "Abbrechen",
"restock_tips": "Preis wird nachgefüllt...",
"sold_out": "Ausverkauft",
"coming_soon": "Demnächst verfügbar",
"discontinued": "Nicht mehr verfügbar",
"exchange_limit": "Einlösungslimit",
"points_lack": "Nicht genügend Punkte",
"exchange_middle": "Wird eingelöst",
"exchange_failed": "Einlösen fehlgeschlagen, bitte versuchen Sie es später erneut"
}

@ -0,0 +1,40 @@
{
"completed": "Done",
"congrats": "CONGRATS!",
"finish_task_get_reward": "Completing earns",
"next_week_do": "Next Week",
"ok": "OK",
"receive": "Redeem",
"refresh_tomorrow": "Refresh Tomorrow",
"remain_time_text": "Remaining Time",
"step": "Step {{num}}",
"time_d": "{{d}} days",
"time_d_h": "{{d}} days {{h}} hours",
"time_h": "{{h}} hours",
"time_h_m": "{{h}} hours {{m}} minutes",
"time_m": "{{m}} minutes",
"time_m_s": "{{m}} minutes {{s}} seconds",
"time_s": "{{s}} seconds",
"to_complete": "Go",
"use": "Use",
"week_do_1": "Refresh On Mon",
"week_do_2": "Refresh On Tue",
"week_do_3": "Refresh On Wed",
"week_do_4": "Refresh On Thu",
"week_do_5": "Refresh On Fri",
"week_do_6": "Refresh On Sat",
"week_do_7": "Refresh On Sun",
"exchange": "Exchange",
"exchange_tips": "Spend [[{{coin}}]] to redeem <<{{title}}>>?",
"confirm_exchange": "Confirm exchange?",
"exchange_success": "Exchange successful",
"cancel": "Cancel",
"restock_tips": "Prize restocking...",
"sold_out": "Sold out",
"coming_soon": "Coming soon",
"discontinued": "Discontinued",
"exchange_limit": "Exchange limit",
"points_lack": "Insufficient points",
"exchange_middle": "Exchanging",
"exchange_failed": "Exchange failed, please try again later"
}

@ -0,0 +1,40 @@
{
"completed": "hecho",
"congrats": "¡Felicidades!",
"finish_task_get_reward": "Completar te da",
"next_week_do": "La Próxima Semana",
"ok": "Está bien",
"receive": "Canjear",
"refresh_tomorrow": "Actualizar mañana",
"remain_time_text": "Tiempo restante",
"step": "Paso {{num}}",
"time_d": "{{d}} días",
"time_d_h": "{{d}} días {{h}} horas",
"time_h": "{{h}} horas",
"time_h_m": "{{h}} horas {{m}} minutos",
"time_m": "{{m}} minutos",
"time_m_s": "{{m}} minutos {{s}} segundos",
"time_s": "{{s}} segundos",
"to_complete": "Ir",
"use": "Usar",
"week_do_1": "Actualizar El Lun",
"week_do_2": "Actualizar El Mar",
"week_do_3": "Actualizar El Mié",
"week_do_4": "Actualizar El Jue",
"week_do_5": "Actualizar El Vie",
"week_do_6": "Actualizar El Sáb",
"week_do_7": "Actualizar El Dom",
"exchange": "Canjear",
"exchange_tips": "¿Estás seguro de gastar [[{{coin}}]] para canjear <<{{title}}>>?",
"confirm_exchange": "¿Confirmar canje?",
"exchange_success": "Canje exitoso",
"cancel": "Cancelar",
"restock_tips": "Reabasteciendo premio...",
"sold_out": "Agotado",
"coming_soon": "Próximamente",
"discontinued": "Descatalogado",
"exchange_limit": "Límite de canje",
"points_lack": "Puntos insuficientes",
"exchange_middle": "Canjeando",
"exchange_failed": "Canje fallido, inténtalo de nuevo más tarde"
}

@ -0,0 +1,40 @@
{
"completed": "fait",
"congrats": "Félicitations !",
"finish_task_get_reward": "Compléter vous rapporte",
"next_week_do": "La Semaine Prochaine",
"ok": "D'accord",
"receive": "Racheter",
"refresh_tomorrow": "Actualiser demain",
"remain_time_text": "Temps restant",
"step": "Étape {{num}}",
"time_d": "{{d}} jours",
"time_d_h": "{{d}} jours {{h}} heures",
"time_h": "{{h}} heures",
"time_h_m": "{{h}} heures {{m}} minutes",
"time_m": "{{m}} minutes",
"time_m_s": "{{m}} minutes {{s}} secondes",
"time_s": "{{s}} secondes",
"to_complete": "Aller",
"use": "Utiliser",
"week_do_1": "Actualiser Lun",
"week_do_2": "Actualiser Mar",
"week_do_3": "Actualiser Mer",
"week_do_4": "Actualiser Jeu",
"week_do_5": "Actualiser Ven",
"week_do_6": "Actualiser Sam",
"week_do_7": "Actualiser Dim",
"exchange": "Échanger",
"exchange_tips": "Voulez-vous dépenser [[{{coin}}]] pour échanger <<{{title}}>> ?",
"confirm_exchange": "Confirmer l'échange ?",
"exchange_success": "Échange réussi",
"cancel": "Annuler",
"restock_tips": "Réapprovisionnement du lot...",
"sold_out": "Épuisé",
"coming_soon": "Bientôt disponible",
"discontinued": "Retiré de la vente",
"exchange_limit": "Limite d'échange",
"points_lack": "Points insuffisants",
"exchange_middle": "En cours d'échange",
"exchange_failed": "Échange échoué, veuillez réessayer plus tard"
}

@ -0,0 +1,40 @@
{
"completed": "Kész",
"congrats": "Gratulálok!",
"finish_task_get_reward": "A befejezéssel -t kapsz",
"next_week_do": "Jövő hét",
"ok": "Rendben",
"receive": "Beváltás",
"refresh_tomorrow": "Frissítés holnap",
"remain_time_text": "Hátralévő idő",
"step": "{{num}}. lépés",
"time_d": "{{d}} nap",
"time_d_h": "{{d}} nap {{h}} óra",
"time_h": "{{h}} óra",
"time_h_m": "{{h}} óra {{m}} perc",
"time_m": "{{m}} perc",
"time_m_s": "{{m}} perc {{s}} másodperc",
"time_s": "{{s}} másodperc",
"to_complete": "Menj",
"use": "Használ",
"week_do_1": "Hétfőn frissül",
"week_do_2": "Kedden frissül",
"week_do_3": "Szerdán frissül",
"week_do_4": "Csütörtökön frissül",
"week_do_5": "Pénteken frissül",
"week_do_6": "Szombaton frissül",
"week_do_7": "Vasárnap frissül",
"exchange": "Beváltás",
"exchange_tips": "Biztosan elköltöd [[{{coin}}]]-t, hogy beváltsd <<{{title}}>>?",
"confirm_exchange": "Megerősíted a beváltást?",
"exchange_success": "Beváltás sikeres",
"cancel": "Mégse",
"restock_tips": "Nyeremény feltöltése...",
"sold_out": "Elfogyott",
"coming_soon": "Hamarosan",
"discontinued": "Kivonva",
"exchange_limit": "Beváltási korlát",
"points_lack": "Nem elegendő pont",
"exchange_middle": "Beváltás folyamatban",
"exchange_failed": "A beváltás sikertelen, próbálja újra később"
}

@ -0,0 +1,40 @@
{
"completed": "selesai",
"congrats": "Selamat!",
"finish_task_get_reward": "Menyelesaikan akan memberi Anda",
"next_week_do": "Minggu Depan",
"ok": "Oke",
"receive": "Menebus",
"refresh_tomorrow": "Segarkan Besok",
"remain_time_text": "Waktu tersisa",
"step": "Langkah {{num}}",
"time_d": "{{d}} hari",
"time_d_h": "{{d}} hari {{h}} jam",
"time_h": "{{h}} jam",
"time_h_m": "{{h}} jam {{m}} menit",
"time_m": "{{m}} menit",
"time_m_s": "{{m}} menit {{s}} detik",
"time_s": "{{s}} detik",
"to_complete": "Pergi",
"use": "Gunakan",
"week_do_1": "Segarkan Pada Sen",
"week_do_2": "Segarkan Pada Sel",
"week_do_3": "Segarkan Pada Rab",
"week_do_4": "Segarkan Pada Kam",
"week_do_5": "Segarkan Pada Jum",
"week_do_6": "Segarkan Pada Sab",
"week_do_7": "Segarkan Pada Min",
"exchange": "Tukar",
"exchange_tips": "Yakin ingin mengeluarkan [[{{coin}}]] untuk menukar <<{{title}}>>?",
"confirm_exchange": "Konfirmasi penukaran?",
"exchange_success": "Penukaran berhasil",
"cancel": "Batal",
"restock_tips": "Hadiah sedang diisi ulang...",
"sold_out": "Habis",
"coming_soon": "Segera hadir",
"discontinued": "Dihentikan",
"exchange_limit": "Batas penukaran",
"points_lack": "Poin tidak mencukupi",
"exchange_middle": "Sedang menukar",
"exchange_failed": "Penukaran gagal, silakan coba lagi nanti"
}

@ -0,0 +1,40 @@
{
"completed": "fatto",
"congrats": "Congratulazioni!",
"finish_task_get_reward": "Completare ti farà guadagnare",
"next_week_do": "La Prossima Settimana",
"ok": "Va bene",
"receive": "Riscattare",
"refresh_tomorrow": "Aggiorna domani",
"remain_time_text": "Tempo rimanente",
"step": "Passo {{num}}",
"time_d": "{{d}} giorni",
"time_d_h": "{{d}} giorni {{h}} ore",
"time_h": "{{h}} ore",
"time_h_m": "{{h}} ore {{m}} minuti",
"time_m": "{{m}} minuti",
"time_m_s": "{{m}} minuti {{s}} secondi",
"time_s": "{{s}} secondi",
"to_complete": "Andare",
"use": "Usare",
"week_do_1": "Aggiorna Lun",
"week_do_2": "Aggiorna Mar",
"week_do_3": "Aggiorna Mer",
"week_do_4": "Aggiorna Gio",
"week_do_5": "Aggiorna Ven",
"week_do_6": "Aggiorna Sab",
"week_do_7": "Aggiorna Dom",
"exchange": "Scambia",
"exchange_tips": "Sei sicuro di spendere [[{{coin}}]] per riscattare <<{{title}}>>?",
"confirm_exchange": "Confermare lo scambio?",
"exchange_success": "Riscatto riuscito",
"cancel": "Annulla",
"restock_tips": "Premio in riassortimento...",
"sold_out": "Esaurito",
"coming_soon": "In arrivo",
"discontinued": "Fuori produzione",
"exchange_limit": "Limite di riscatto",
"points_lack": "Punti insufficienti",
"exchange_middle": "Riscatto in corso",
"exchange_failed": "Riscatto fallito, riprova più tardi"
}

@ -0,0 +1,40 @@
{
"completed": "完了しました",
"congrats": "おめでとうございます!",
"finish_task_get_reward": "完了するとが得られます",
"next_week_do": "来週更新",
"ok": "OK",
"receive": "償還する",
"refresh_tomorrow": "明日更新",
"remain_time_text": "残り時間",
"step": "{{num}}ステップ",
"time_d": "{{d}} 日",
"time_d_h": "{{d}} 日 {{h}} 時間",
"time_h": "{{h}} 時間",
"time_h_m": "{{h}} 時間 {{m}} 分",
"time_m": "{{m}} 分",
"time_m_s": "{{m}} 分 {{s}} 秒",
"time_s": "{{s}} 秒",
"to_complete": "行く",
"use": "使用する",
"week_do_1": "月曜日に更新",
"week_do_2": "火曜日に更新",
"week_do_3": "水曜日に更新",
"week_do_4": "木曜日に更新",
"week_do_5": "金曜日に更新",
"week_do_6": "土曜日に更新",
"week_do_7": "日曜日に更新",
"exchange": "交換",
"exchange_tips": "[[{{coin}}]]を使って「<<{{title}}>>」を交換しますか?",
"confirm_exchange": "交換を確定しますか?",
"exchange_success": "交換成功",
"cancel": "キャンセル",
"restock_tips": "景品を補充しています...",
"sold_out": "売り切れ",
"coming_soon": "近日登場",
"discontinued": "販売終了",
"exchange_limit": "交換上限",
"points_lack": "ポイント不足",
"exchange_middle": "交換中",
"exchange_failed": "交換に失敗しました。後ほど再度お試しください"
}

@ -0,0 +1,40 @@
{
"completed": "완료됨",
"congrats": "축하합니다!",
"finish_task_get_reward": "완료하면 을(를) 얻습니다",
"next_week_do": "다음 주",
"ok": "좋아요",
"receive": "수령",
"refresh_tomorrow": "내일 새로 고침",
"remain_time_text": "남은 시간",
"step": "단계 {{num}}",
"time_d": "{{d}} 일",
"time_d_h": "{{d}} 일 {{h}} 시간",
"time_h": "{{h}} 시간",
"time_h_m": "{{h}} 시간 {{m}} 분",
"time_m": "{{m}} 분",
"time_m_s": "{{m}} 분 {{s}} 초",
"time_s": "{{s}} 초",
"to_complete": "가다",
"use": "사용하다",
"week_do_1": "월요일 새로 고침",
"week_do_2": "화요일 새로 고침",
"week_do_3": "수요일 새로 고침",
"week_do_4": "목요일 새로 고침",
"week_do_5": "금요일 새로 고침",
"week_do_6": "토요일 새로 고침",
"week_do_7": "일요일 새로 고침",
"exchange": "교환",
"exchange_tips": "[[{{coin}}]]을(를) 사용하여 <<{{title}}>> 을(를) 교환하시겠습니까?",
"confirm_exchange": "교환을 확인하시겠습니까?",
"exchange_success": "교환 성공",
"cancel": "취소",
"restock_tips": "상품을 재입고 중...",
"sold_out": "품절",
"coming_soon": "곧 출시",
"discontinued": "판매 중단",
"exchange_limit": "교환 한도",
"points_lack": "포인트 부족",
"exchange_middle": "교환 중",
"exchange_failed": "교환에 실패했습니다. 나중에 다시 시도해 주세요"
}

@ -0,0 +1,297 @@
package lang
import (
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils/verify"
"encoding/json"
"fmt"
"os"
"strings"
"testing"
)
var aa = map[string]string{
"德语": "de",
"英语": "en",
"西班牙语": "es",
"法语": "fr",
"印尼语": "id",
"意大利语": "it",
"日语": "ja",
"韩语": "ko",
"葡萄牙语": "pt",
"俄语": "ru",
"泰语": "th",
"土耳其语": "tr",
"中文": "zh",
"繁体中文": "zh-TW",
"越南语": "vi",
"匈牙利语": "hu",
"荷兰语": "nl",
"波兰语": "pl",
"罗马尼亚语": "ro",
}
func TestName(t *testing.T) {
var data = `德语: Herzlichen Glückwunsch!
西班牙语: ¡Felicidades!
法语: Félicitations !
印尼语: Selamat!
意大利语: Congratulazioni!
日语: おめでとうございます!
韩语: 축하합니다!
葡萄牙语: Parabéns!
俄语: Поздравляю!
泰语: ขอแสดงความยินดี!
土耳其语: Tebrikler!
繁体中文: 恭喜!
越南语: Chúc mừng!
匈牙利语: Gratulálok!`
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
langData[mark] = ddd
}
ak := "congrats"
var arr = strings.Split(data, "\n")
for _, v := range arr {
key, val, _ := strings.Cut(v, ":")
mark := aa[strings.TrimSpace(key)]
if _, ok := langData[mark][ak]; !ok {
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
langData[mark][ak] = strings.TrimSpace(val)
adata, _ := json.Marshal(langData[mark])
file.Write(adata)
file.Close()
fmt.Printf("%s: %s->%s \n", key, ak, langData[mark][ak])
}
}
}
func TestRemoveKey(t *testing.T) {
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var keys = []string{"help_wait"}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
for _, key := range keys {
delete(ddd, key)
}
langData[mark] = ddd
}
for mark, data := range langData {
if verify.InArray(mark, "en", "zh", "ar") {
continue
}
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(data)
file.Write(adata)
file.Close()
}
}
func TestCopyKey(t *testing.T) {
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var key = map[string]string{
"help_fail": "distribution_failed",
}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
for cp, to := range key {
_, ok1 := ddd[cp]
if !ok1 {
t.Logf("[%s]没有[%s]", mark, cp)
continue
}
ddd[to] = ddd[cp]
}
langData[mark] = ddd
}
for mark, data := range langData {
if verify.InArray(mark, "en", "zh", "ar", "zh-TW") {
continue
}
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(data)
file.Write(adata)
file.Close()
}
}
func TestCopyCampaignKey(t *testing.T) {
entrys, err := os.ReadDir("./")
if err != nil {
return
}
var key = map[string]string{
"next_week_do": "next_week_do",
"week_do_1": "week_do_1",
"week_do_2": "week_do_2",
"week_do_3": "week_do_3",
"week_do_4": "week_do_4",
"week_do_5": "week_do_5",
"week_do_6": "week_do_6",
"week_do_7": "week_do_7",
}
var langData = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
var source = make(map[string]string)
var sb []byte
sb, err = os.ReadFile(fmt.Sprintf("../campaign/lang/%s.json", mark))
if err != nil {
return
}
_ = json.Unmarshal(sb, &source)
for cp, to := range key {
_, ok1 := source[cp]
if !ok1 {
t.Logf("[%s]没有[%s]", mark, cp)
continue
}
ddd[to] = source[cp]
}
langData[mark] = ddd
}
for mark, data := range langData {
file, _ := os.OpenFile(mark+".json", os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(data)
file.Write(adata)
file.Close()
}
}
func TestUpdateKey(t *testing.T) {
var fname = "./es.json"
b, err := os.ReadFile(fname)
if err != nil {
t.Log(err)
return
}
var ddd = make(map[string]string)
_ = json.Unmarshal(b, &ddd)
val := "Girar"
key := []string{"spin", "lottery"}
var do bool
for _, v := range key {
old, ok := ddd[v]
if !ok || old == val {
continue
}
ddd[v] = val
do = true
fmt.Printf("%s: %s->%s \n", v, old, val)
}
if !do {
t.Log("not done ")
return
}
file, _ := os.OpenFile(fname, os.O_RDWR|os.O_TRUNC, 0666)
adata, _ := json.Marshal(ddd)
file.Write(adata)
file.Close()
}

@ -0,0 +1,40 @@
{
"completed": "Voltooid",
"congrats": "GEFELICITEERD!",
"finish_task_get_reward": "Voltooien levert op",
"next_week_do": "Volgende week",
"ok": "OK",
"receive": "Inwisselen",
"refresh_tomorrow": "Kom morgen terug",
"remain_time_text": "Resterende tijd",
"step": "Stap {{num}}",
"time_d": "{{d}} dagen",
"time_d_h": "{{d}} dagen {{h}} uur",
"time_h": "{{h}} uur",
"time_h_m": "{{h}} uur {{m}} minuten",
"time_m": "{{m}} minuten",
"time_m_s": "{{m}} minuten {{s}} seconden",
"time_s": "{{s}} seconden",
"to_complete": "Voltooien",
"use": "Gebruiken",
"week_do_1": "Kom maandag terug",
"week_do_2": "Kom dinsdag terug",
"week_do_3": "Kom woensdag terug",
"week_do_4": "Kom donderdag terug",
"week_do_5": "Kom vrijdag terug",
"week_do_6": "Kom zaterdag terug",
"week_do_7": "Kom zondag terug",
"exchange": "Inwisselen",
"exchange_tips": "[[{{coin}}]] uitgeven om <<{{title}}>> in te wisselen?",
"confirm_exchange": "Inwisseling bevestigen?",
"exchange_success": "Inwisseling geslaagd",
"cancel": "Annuleren",
"restock_tips": "Prijs wordt aangevuld...",
"sold_out": "Uitverkocht",
"coming_soon": "Binnenkort beschikbaar",
"discontinued": "Niet meer beschikbaar",
"exchange_limit": "Inwissellimiet",
"points_lack": "Onvoldoende punten",
"exchange_middle": "Bezig met inwisselen",
"exchange_failed": "Inwisselen mislukt, probeer het later opnieuw"
}

@ -0,0 +1,40 @@
{
"completed": "feito",
"congrats": "Parabéns!",
"finish_task_get_reward": "Completar ganha",
"next_week_do": "Na Próxima Semana",
"ok": "OK",
"receive": "Resgatar",
"refresh_tomorrow": "Atualizar amanhã",
"remain_time_text": "Tempo restante",
"step": "Etapa {{num}}",
"time_d": "{{d}} dias",
"time_d_h": "{{d}} dias {{h}} horas",
"time_h": "{{h}} horas",
"time_h_m": "{{h}} horas {{m}} minutos",
"time_m": "{{m}} minutos",
"time_m_s": "{{m}} minutos {{s}} segundos",
"time_s": "{{s}} segundos",
"to_complete": "Ir",
"use": "Usar",
"week_do_1": "Atualizar Na Seg",
"week_do_2": "Atualizar Na Ter",
"week_do_3": "Atualizar Na Qua",
"week_do_4": "Atualizar Na Qui",
"week_do_5": "Atualizar Na Sex",
"week_do_6": "Atualizar No Sáb",
"week_do_7": "Atualizar No Dom",
"exchange": "Trocar",
"exchange_tips": "Tem certeza de gastar [[{{coin}}]] para resgatar <<{{title}}>>?",
"confirm_exchange": "Confirmar troca?",
"exchange_success": "Troca bem-sucedida",
"cancel": "Cancelar",
"restock_tips": "Reabastecendo prêmio...",
"sold_out": "Esgotado",
"coming_soon": "Em breve",
"discontinued": "Descontinuado",
"exchange_limit": "Limite de troca",
"points_lack": "Pontos insuficientes",
"exchange_middle": "Trocando",
"exchange_failed": "Troca falhou, tente novamente mais tarde"
}

@ -0,0 +1,40 @@
{
"completed": "сделано",
"congrats": "Поздравляю!",
"finish_task_get_reward": "Завершение приносит",
"next_week_do": "На Следующей Неделе",
"ok": "Хорошо",
"receive": "Погашать",
"refresh_tomorrow": "Обновить завтра",
"remain_time_text": "Оставшееся время",
"step": "Шаг {{num}}",
"time_d": "{{d}} дней",
"time_d_h": "{{d}} дней {{h}} часов",
"time_h": "{{h}} часов",
"time_h_m": "{{h}} часов {{m}} минут",
"time_m": "{{m}} минут",
"time_m_s": "{{m}} минут {{s}} секунд",
"time_s": "{{s}} секунд",
"to_complete": "Идти",
"use": "Использовать",
"week_do_1": "Обновление В Пн",
"week_do_2": "Обновление В Вт",
"week_do_3": "Обновление В Ср",
"week_do_4": "Обновление В Чт",
"week_do_5": "Обновление В Пт",
"week_do_6": "Обновление В Сб",
"week_do_7": "Обновление В Вс",
"exchange": "Обмен",
"exchange_tips": "Вы уверены, что хотите потратить [[{{coin}}]] чтобы обменять <<{{title}}>>?",
"confirm_exchange": "Подтвердить обмен?",
"exchange_success": "Обмен выполнен",
"cancel": "Отмена",
"restock_tips": "Пополнение приза...",
"sold_out": "Распродано",
"coming_soon": "Скоро",
"discontinued": "Снято с продаж",
"exchange_limit": "Лимит обмена",
"points_lack": "Недостаточно очков",
"exchange_middle": "Обмен в процессе",
"exchange_failed": "Обмен не удался, повторите попытку позже"
}

@ -0,0 +1,40 @@
{
"completed": "เสร็จสิ้นแล้ว",
"congrats": "ขอแสดงความยินดี!",
"finish_task_get_reward": "การเสร็จสิ้นจะได้รับ",
"next_week_do": "สัปดาห์หน้า",
"ok": "ตกลง",
"receive": "รับ",
"refresh_tomorrow": "รีเฟรชพรุ่งนี้",
"remain_time_text": "เวลาที่เหลือ",
"step": "ขั้นตอน {{num}}",
"time_d": "{{d}} วัน",
"time_d_h": "{{d}} วัน {{h}} ชั่วโมง",
"time_h": "{{h}} ชั่วโมง",
"time_h_m": "{{h}} ชั่วโมง {{m}} นาที",
"time_m": "{{m}} นาที",
"time_m_s": "{{m}} นาที {{s}} วินาที",
"time_s": "{{s}} วินาที",
"to_complete": "ไป",
"use": "ใช้",
"week_do_1": "อัปเดตวันจันทร์",
"week_do_2": "อัปเดตวันอังคาร",
"week_do_3": "อัปเดตวันพุธ",
"week_do_4": "อัปเดตวันพฤหัสบดี",
"week_do_5": "อัปเดตวันศุกร์",
"week_do_6": "อัปเดตวันเสาร์",
"week_do_7": "อัปเดตวันอาทิตย์",
"exchange": "แลก",
"exchange_tips": "คุณแน่ใจหรือไม่ว่าจะใช้ [[{{coin}}]] เพื่อแลก <<{{title}}>>?",
"confirm_exchange": "ยืนยันการแลก?",
"exchange_success": "แลกสำเร็จ",
"cancel": "ยกเลิก",
"restock_tips": "กำลังเติมของรางวัล...",
"sold_out": "สินค้าหมด",
"coming_soon": "เร็วๆ นี้",
"discontinued": "ยกเลิกการวางจำหน่าย",
"exchange_limit": "ขีดจำกัดการแลก",
"points_lack": "คะแนนไม่เพียงพอ",
"exchange_middle": "กำลังแลก",
"exchange_failed": "การแลกล้มเหลว โปรดลองอีกครั้งในภายหลัง"
}

@ -0,0 +1,40 @@
{
"completed": "tamam",
"congrats": "Tebrikler!",
"finish_task_get_reward": "Tamamlama ile kazanırsınız",
"next_week_do": "Gelecek Hafta",
"ok": "Tamam",
"receive": "Kullanmak",
"refresh_tomorrow": "Yarın Yenile",
"remain_time_text": "Kalan süre",
"step": "Adım {{num}}",
"time_d": "{{d}} gün",
"time_d_h": "{{d}} gün {{h}} saat",
"time_h": "{{h}} saat",
"time_h_m": "{{h}} saat {{m}} dakika",
"time_m": "{{m}} dakika",
"time_m_s": "{{m}} dakika {{s}} saniye",
"time_s": "{{s}} saniye",
"to_complete": "Git",
"use": "Kullanmak",
"week_do_1": "Pazartesi Yenile",
"week_do_2": "Salı Yenile",
"week_do_3": "Çarşamba Yenile",
"week_do_4": "Perşembe Yenile",
"week_do_5": "Cuma Yenile",
"week_do_6": "Cumartesi Yenile",
"week_do_7": "Pazar Yenile",
"exchange": "Takas",
"exchange_tips": "<<{{title}}>> için [[{{coin}}]] harcamak istediğinize emin misiniz?",
"confirm_exchange": "Takası onaylıyor musunuz?",
"exchange_success": "Takas başarılı",
"cancel": "İptal",
"restock_tips": "Ödül yeniden stoklanıyor...",
"sold_out": "Tükendi",
"coming_soon": "Yakında",
"discontinued": "Satıştan kaldırıldı",
"exchange_limit": "Takas limiti",
"points_lack": "Yetersiz puan",
"exchange_middle": "Takas ediliyor",
"exchange_failed": "Takas başarısız oldu, lütfen daha sonra tekrar deneyin"
}

@ -0,0 +1,40 @@
{
"completed": "hoàn thành",
"congrats": "Chúc mừng!",
"finish_task_get_reward": "Hoàn thành sẽ nhận được",
"next_week_do": "Tuần tới",
"ok": "Được rồi",
"receive": "Đổi thưởng",
"refresh_tomorrow": "Làm mới vào ngày mai",
"remain_time_text": "Thời gian còn lại",
"step": "Bước {{num}}",
"time_d": "{{d}} ngày",
"time_d_h": "{{d}} ngày {{h}} giờ",
"time_h": "{{h}} giờ",
"time_h_m": "{{h}} giờ {{m}} phút",
"time_m": "{{m}} phút",
"time_m_s": "{{m}} phút {{s}} giây",
"time_s": "{{s}} giây",
"to_complete": "Đi",
"use": "Sử dụng",
"week_do_1": "Làm mới vào thứ Hai",
"week_do_2": "Làm mới vào thứ Ba",
"week_do_3": "Làm mới vào thứ Tư",
"week_do_4": "Làm mới vào thứ Năm",
"week_do_5": "Làm mới vào thứ Sáu",
"week_do_6": "Làm mới vào thứ Bảy",
"week_do_7": "Làm mới vào Chủ Nhật",
"exchange": "Đổi",
"exchange_tips": "Bạn có chắc muốn tiêu [[{{coin}}]] để đổi <<{{title}}>> không?",
"confirm_exchange": "Xác nhận đổi?",
"exchange_success": "Đổi thành công",
"cancel": "Hủy",
"restock_tips": "Đang bổ sung phần thưởng...",
"sold_out": "Hết hàng",
"coming_soon": "Sắp ra mắt",
"discontinued": "Ngừng cung cấp",
"exchange_limit": "Giới hạn đổi thưởng",
"points_lack": "Không đủ điểm",
"exchange_middle": "Đang đổi thưởng",
"exchange_failed": "Đổi thưởng thất bại, vui lòng thử lại sau"
}

@ -0,0 +1,40 @@
{
"completed": "已完成",
"congrats": "恭喜您!",
"finish_task_get_reward": "完成可獲得",
"next_week_do": "下週再來",
"ok": "確認",
"receive": "領取",
"refresh_tomorrow": "明天再來",
"remain_time_text": "剩餘時間",
"step": "第{{num}}步",
"time_d": "{{d}}天",
"time_d_h": "{{d}}天{{h}}小時",
"time_h": "{{h}}小時",
"time_h_m": "{{h}}小時{{m}}分鐘",
"time_m": "{{m}}分鐘",
"time_m_s": "{{m}}分鐘{{s}}秒",
"time_s": "{{s}}秒",
"to_complete": "去完成",
"use": "使用",
"week_do_1": "週一再來",
"week_do_2": "週二再來",
"week_do_3": "週三再來",
"week_do_4": "週四再來",
"week_do_5": "週五再來",
"week_do_6": "週六再來",
"week_do_7": "週天再來",
"exchange": "兌換",
"exchange_tips": "確定要花費[[{{coin}}]]兌換 <<{{title}}>> 嗎?",
"confirm_exchange": "確認兌換?",
"exchange_success": "兌換成功",
"cancel": "取消",
"restock_tips": "獎品補貨中...",
"sold_out": "售罄",
"coming_soon": "即將上架",
"discontinued": "已下架",
"exchange_limit": "兌換上限",
"points_lack": "點數不足",
"exchange_middle": "兌換中",
"exchange_failed": "兌換失敗,請稍後再試"
}

@ -0,0 +1,40 @@
{
"completed": "已完成",
"congrats": "恭喜您!",
"finish_task_get_reward": "完成可获得",
"next_week_do": "下周再来",
"ok": "确定",
"receive": "领取",
"refresh_tomorrow": "明天再来",
"remain_time_text": "剩余时间",
"step": "第{{num}}步",
"time_d": "{{d}}天",
"time_d_h": "{{d}}天{{h}}小时",
"time_h": "{{h}}小时",
"time_h_m": "{{h}}小时{{m}}分钟",
"time_m": "{{m}}分钟",
"time_m_s": "{{m}}分钟{{s}}秒",
"time_s": "{{s}}秒",
"to_complete": "去完成",
"use": "使用",
"week_do_1": "周一再来",
"week_do_2": "周二再来",
"week_do_3": "周三再来",
"week_do_4": "周四再来",
"week_do_5": "周五再来",
"week_do_6": "周六再来",
"week_do_7": "周天再来",
"exchange": "兑换",
"exchange_tips": "确定要花费[[{{coin}}]]兑换<<{{title}}>>吗?",
"confirm_exchange": "确认兑换?",
"exchange_success": "兑换成功",
"cancel": "取消",
"restock_tips": "奖品补货中...",
"sold_out": "售罄",
"coming_soon": "即将上架",
"discontinued": "已下架",
"exchange_limit": "兑换上限",
"points_lack": "积分不足",
"exchange_middle": "兑换中",
"exchange_failed": "兑换失败,请稍后再试"
}

@ -0,0 +1,36 @@
package main
import (
"context"
"joybuywork/internal/app"
"joybuywork/internal/boot"
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
defer func() {
if err := recover(); err != nil {
app.Logger.Error(context.Background(), fmt.Sprintf("panic: %v", err))
}
}()
err := boot.Init()
if err != nil {
panic(err)
}
boot.Run()
//监听程序退出
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGHUP)
select {
case <-ch:
defer close(ch)
}
boot.Shutdown()
}

@ -0,0 +1,49 @@
database:
url: root:branchcn_dev2@2023@tcp(120.79.90.126:3307)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
max_idle_conn: 10
max_open_conn: 20
conn_max_lifetime: 1h0m0s
slow_threshold: 300ms
etcd:
address:
- 192.168.0.153:12379
kafka:
brokers:
- 120.79.90.126:9093
logger:
std_out: true
file_out: true
path: ./logs/server.log
max_size: 10
max_backups: 5
max_age: 30
compress: false
redis:
addr: 120.79.90.126:6380
password: branchcn_dev2@redis
db: 0
sentinel: ""
sentinel_master_name: ""
server:
env: dev
link_domain: .c.allapp.link
link_domain_proto: https://
ladder_host: https://proxy.branchcn.com:8977
ads_domain: .a.allapp.link
ads_domain_proto: https://
ads_jump: "https://test-moads.allapp.link/ad"
alert:
feishu:
url: "https://open.feishu.cn/open-apis/bot/v2/hook/747c9575-66cd-4701-a691-cdf544056683"
secret: "KcATHHyFtGp7BUPfRW465e"
scenes:
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "normal" }
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "notice" }
upload:
endpoint: "https://oss-cn-shenzhen.aliyuncs.com"
upload_url: "https://client-project-resource.oss-cn-shenzhen.aliyuncs.com"
access_key: "LTAI5tNvMLF181bTb3qCZxk4"
secret: "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A"
bucket_name: "client-project-resource"
prefix: "resource/"
host: "https://i1.branchcn.com"

@ -0,0 +1,51 @@
database:
url: dplk_normal:DPLKnormal321@tcp(pc-wz99ok336msd23893.rwlb.rds.aliyuncs.com:3306)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
max_idle_conn: 100
max_open_conn: 800
conn_max_lifetime: 1h0m0s
slow_threshold: 300ms
etcd:
address:
- 192.168.2.96:12379
kafka:
brokers:
- "alikafka-post-cn-20p37xyih001-1-vpc.alikafka.aliyuncs.com:9092"
- "alikafka-post-cn-20p37xyih001-2-vpc.alikafka.aliyuncs.com:9092"
- "alikafka-post-cn-20p37xyih001-3-vpc.alikafka.aliyuncs.com:9092"
logger:
std_out: false
file_out: true
path: ./logs/server.log
max_size: 10
max_backups: 5
max_age: 30
compress: false
redis:
addr: r-wz98ium6mmr6ho5nk6.redis.rds.aliyuncs.com:6379
password: DPLKnormal321
db: 0
sentinel: ""
sentinel_master_name: ""
server:
env: prod
link_domain: .c.allapp.link
link_domain_proto: https://
ladder_host: https://proxy.branchcn.com:8977
ads_domain: .allappf.link
ads_domain_proto: https://
ads_jump: "https://moads.allapp.link/ad"
alert:
feishu:
url: "https://open.feishu.cn/open-apis/bot/v2/hook/ffc935d6-698a-4206-9781-cd5d11a1378c"
secret: "apxjmywNPecErVM04hGBrc"
scenes:
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/3c3b0907-7fe3-47bd-951e-1ff4f995fd5c", secret: "O8mHHEkKBjN3H95XuVWW3g", scene: "normal" }
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/bc93441a-ffb8-429e-985c-9c952758ebb8", secret: "MzYOBFmnDMNM0s1SUo3GQh", scene: "notice" }
upload:
endpoint: "https://oss-cn-shenzhen.aliyuncs.com"
upload_url: "https://client-project-resource.oss-cn-shenzhen.aliyuncs.com"
access_key: "LTAI5tNvMLF181bTb3qCZxk4"
secret: "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A"
bucket_name: "client-project-resource"
prefix: "resource/"
host: "https://i1.branchcn.com"

@ -0,0 +1,49 @@
database:
url: root:branchcn_dev2@2023@tcp(120.79.90.126:3307)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
max_idle_conn: 100
max_open_conn: 100
conn_max_lifetime: 1h0m0s
slow_threshold: 300ms
etcd:
address:
- 127.0.0.1:2379
kafka:
brokers:
- 127.0.0.1:9093
logger:
std_out: true
file_out: true
path: ./logs/server.log
max_size: 10
max_backups: 5
max_age: 30
compress: false
redis:
addr: 127.0.0.1:6379
password: secret_redis
db: 0
sentinel: ""
sentinel_master_name: ""
server:
env: test
link_domain: .c.allapp.link
link_domain_proto: https://
ladder_host: https://proxy.branchcn.com:8977
ads_domain: .a.allapp.link
ads_domain_proto: https://
ads_jump: "https://test-moads.allapp.link/ad"
alert:
feishu:
url: "https://open.feishu.cn/open-apis/bot/v2/hook/747c9575-66cd-4701-a691-cdf544056683"
secret: "KcATHHyFtGp7BUPfRW465e"
scenes:
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "normal" }
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "notice" }
upload:
endpoint: "https://oss-cn-shenzhen.aliyuncs.com"
upload_url: "https://client-project-resource.oss-cn-shenzhen.aliyuncs.com"
access_key: "LTAI5tNvMLF181bTb3qCZxk4"
secret: "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A"
bucket_name: "client-project-resource"
prefix: "resource/"
host: "https://i1.branchcn.com"

@ -0,0 +1,32 @@
alert:
feishu:
url: ""
secret: ""
database:
url: root:123456@tcp(127.0.0.1:3306)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
max_idle_conn: 100
max_open_conn: 100
conn_max_lifetime: 1h0m0s
slow_threshold: 300ms
etcd:
address:
- 127.0.0.1:2379
kafka:
brokers:
- 127.0.0.1:9093
logger:
std_out: true
file_out: true
path: ./logs/server.log
max_size: 10
max_backups: 5
max_age: 30
compress: false
redis:
addr: 127.0.0.1:6379
password: secret_redis
db: 0
sentinel: ""
sentinel_master_name: ""
server:
service_name: joybuywork

136
go.mod

@ -0,0 +1,136 @@
module joybuywork
go 1.23.0
require (
joybuywork/proto/go_proto v0.0.0-00010101000000-000000000000
github.com/Shopify/sarama v1.38.1
github.com/alexandrevicenzi/unchained v1.3.0
github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible
github.com/bwmarrin/snowflake v0.3.0
github.com/go-redis/redis/v8 v8.11.5
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/golang-module/carbon/v2 v2.2.3
github.com/orcaman/concurrent-map/v2 v2.0.1
github.com/panjf2000/ants/v2 v2.10.0
github.com/robfig/cron/v3 v3.0.1
github.com/rs/xid v1.5.0
github.com/shopspring/decimal v1.4.0
github.com/sony/sonyflake v1.2.1
github.com/valyala/fasthttp v1.48.0
github.com/xuri/excelize/v2 v2.8.0
gits.branchcn.com/backend/certified/proto/go_proto v0.0.0-20260615071616-c023fd0c5586
gits.branchcn.com/backend/deepai/proto/go_proto v0.0.0-20260311111512-9ae266ff282b
gits.branchcn.com/backend/deeplink/proto/go_proto v0.0.0-20250818063346-f60f47f335af
gits.branchcn.com/backend/joybuywork/proto/go_proto v0.0.0-20250401063414-20cf6e26db1a
gits.branchcn.com/backend/fissionbi/proto/go_proto v0.0.0-20260528070429-e19531fb99fa
gits.branchcn.com/backend/microcode/micro v0.0.0-20250328073905-6ff169811aa1
gits.branchcn.com/backend/microcode/plugins v0.0.0-20250918022229-32994257abc5
gits.branchcn.com/backend/oplatform/proto/go_proto v0.0.0-20250402095105-d679a51b4c9f
gits.branchcn.com/backend/shortlink/proto/go_proto v0.0.0-20230831015347-65eb821f4a0e
gits.branchcn.com/backend/taskcenter/proto/go_proto v0.0.0-20260810091734-b7661d6d0055
go-micro.dev/v4 v4.11.0
go.etcd.io/etcd/api/v3 v3.5.15
go.etcd.io/etcd/client/v3 v3.5.15
go.uber.org/atomic v1.7.0
go.uber.org/zap v1.24.0
gopkg.in/yaml.v3 v3.0.1
gorm.io/datatypes v1.2.4
gorm.io/gen v0.3.27
gorm.io/gorm v1.25.11
gorm.io/plugin/dbresolver v1.5.0
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/Microsoft/go-winio v0.6.0 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
github.com/acomagu/bufpipe v1.0.3 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/bitly/go-simplejson v0.5.0 // indirect
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/eapache/go-resiliency v1.3.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect
github.com/eapache/queue v1.1.0 // indirect
github.com/emirpasic/gods v1.12.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-acme/lego/v4 v4.17.4 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.3.1 // indirect
github.com/go-git/go-git/v5 v5.4.2 // indirect
github.com/go-micro/plugins/v4/client/grpc v1.2.0 // indirect
github.com/go-micro/plugins/v4/registry/etcd v1.2.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gobwas/ws v1.4.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/handlers v1.5.2 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
github.com/jcmturner/gofork v1.7.6 // indirect
github.com/jcmturner/gokrb5/v8 v8.4.3 // indirect
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
github.com/klauspost/compress v1.16.3 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/hashstructure v1.1.0 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
github.com/nxadm/tail v1.4.8 // indirect
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/pierrec/lz4/v4 v4.1.17 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/urfave/cli/v2 v2.27.2 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/xanzy/ssh-agent v0.3.0 // indirect
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect
github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect
github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.28.0 // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/text v0.19.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.26.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
google.golang.org/grpc v1.63.1 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gorm.io/driver/mysql v1.5.6 // indirect
gorm.io/hints v1.1.0 // indirect
)
replace joybuywork/proto/go_proto => ./proto/go_proto

@ -0,0 +1,242 @@
package app
import (
"crypto/sha1"
"joybuywork/internal/config"
"joybuywork/internal/consts"
"joybuywork/internal/plugins/jsonm"
"encoding/hex"
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"runtime"
"sync"
)
type Ads struct {
lc sync.RWMutex
Ad Ad
}
type Ad struct {
Webs []*Web `json:"webs"`
Accounts struct {
Test string `json:"test"`
Prod string `json:"prod"`
} `json:"accounts"`
}
type Web struct {
Host string `json:"host"`
Uris []struct {
Uri string `json:"uri"`
} `json:"uris"`
}
var ads = &Ads{}
// AdsInit 初始化数据
func AdsInit(yun string) (err error) {
var data []byte
if yun == "" {
filename := fmt.Sprintf("%s/ads_%s.json", GetAdsFilePath(), config.Config.Server.Env)
data, err = os.ReadFile(filename)
if err != nil {
return
}
} else {
var resp *http.Response
resp, err = http.Get(yun)
if err != nil {
return
}
defer resp.Body.Close()
data, err = io.ReadAll(resp.Body)
if err != nil {
return
}
}
ads.lc.Lock()
ads.Ad = Ad{}
err = jsonm.Unmarshal(data, &ads.Ad)
ads.lc.Unlock()
err = jsonm.Unmarshal([]byte(j1), &ads1.Ad)
err = jsonm.Unmarshal([]byte(j2), &ads2.Ad)
return
}
// jr
var ids1 = []int64{143, 374}
var ads1 = &Ads{}
var j1 = `{
"accounts": {
"test": "ca-pub-2821871715805907",
"prod": "ca-pub-2821871715805907"
},
"webs": [
{
"host": "https://moads-r.allapp.link",
"uris": [
{
"uri": "/business/helldivers-2-and-dead-island-2-support-studio-toadman-interactive-confirms-layoffs/"
},
{
"uri": "/business/report-until-dawn-remake-developer-ballistic-moon-is-making-layoffs/"
},
{
"uri": "/business/creative-uks-latest-fund-offers-up-to-25k-to-north-east-teams/"
},
{
"uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages/"
},
{
"uri": "/business/mental-health-in-games-charity-take-this-is-facing-extinction/"
},
{
"uri": "/finance/yes-network-msg-networks-to-launch-combined-new-york-regional-sports-app/"
},
{
"uri": "/finance/nvidia-announces-50-billion-stock-buyback/"
},
{
"uri": "/finance/nvidia-reports-122-revenue-growth-on-surging-demand-for-data-center-chips/"
},
{
"uri": "/finance/ford-joins-list-of-companies-walking-back-dei-policies/"
},
{
"uri": "/finance/lego-revenue-jumps-13-in-first-half-of-2024-boosted-by-lego-fortnite-and-diverse-brick-sets/"
},
{
"uri": "/finance/nordstrom-shares-climb-5-as-earnings-top-estimates-but-retailer-issues-cautious-guidance/"
},
{
"uri": "/news/civilization-7-interview-firaxis-answers-all-of-our-questions-about-the-anticipated-sequel-gamescom-2024/"
},
{
"uri": "/news/crimson-desert-is-like-god-of-war-and-dragons-dogma-had-a-baby-gamescom-2024/"
},
{
"uri": "/news/borderlands-4-announced-with-teaser-trailer-at-opening-night-live-gamescom-2024/"
},
{
"uri": "/news/indiana-jones-and-the-great-circle-finally-gets-a-release-date-for-xboxand-playstation-gamescom-2024/"
},
{
"uri": "/news/secret-level-every-video-game-in-the-new-gamescom-trailer/"
},
{
"uri": "/news/ign-uk-podcast-762-the-best-of-gamescom-2024/"
}
]
}
]
}`
// dhg
var ids2 = []int64{361}
var ads2 = &Ads{}
var j2 = `{
"accounts": {
"test": "ca-pub-2821871715805907",
"prod": "ca-pub-2821871715805907"
},
"webs": [
{
"host": "https://moads-dh.branchcn.com",
"uris": [
{
"uri": "/post/the-cost-of-temptation/"
},
{
"uri": "/post/the-temptation-within-a-tale-of-infidelity/"
},
{
"uri": "/unexpected-encounter/sweet-deceptions-the-story-of-athena-and-dax/"
}
]
}
]
}`
// AdsRandOne 随便选一个
func AdsRandOne(prod bool, projectId int64) (act, host, uri string) {
var obj = ads
for _, id := range ids1 {
if id == projectId {
obj = ads1
break
}
}
for _, id := range ids2 {
if id == projectId {
obj = ads2
break
}
}
obj.lc.RLock()
defer obj.lc.RUnlock()
if prod {
act = obj.Ad.Accounts.Prod
} else {
act = obj.Ad.Accounts.Test
}
var hostMap = make(map[string]*Web, len(obj.Ad.Webs))
for _, web := range obj.Ad.Webs {
hostMap[web.Host] = web
}
for _, web := range hostMap {
host = web.Host
var uriMap = make(map[string]struct{}, len(web.Uris))
for _, v := range web.Uris {
uriMap[v.Uri] = struct{}{}
}
for v := range uriMap {
uri = v
break
}
return
}
return
}
const ens = "cr6798rdervj4d3ekub0"
func Encode(userId, event, key, val string, t int64) string {
v := fmt.Sprintf("%s:%s:%s:%s:%d:%s", userId, event, key, val, t, ens)
hash := sha1.New()
hash.Write([]byte(v))
b := hash.Sum(nil)
return hex.EncodeToString(b)
}
func TokenOk(token, userId, event, key, val string, t int64) bool {
return token == Encode(userId, event, key, val, t)
}
// GetAdsFilePath 获取ads文件路径
func GetAdsFilePath() string {
if !consts.RunTest {
dir, _ := os.Getwd()
return fmt.Sprintf("%s/asset/ads", dir)
}
_, filename, _, _ := runtime.Caller(0)
current := filepath.Dir(filename)
return fmt.Sprintf("%s/../../asset/ads", current)
}

@ -0,0 +1,26 @@
// Code generated by gen. DO NOT EDIT.
package app
import (
"joybuywork/internal/config"
"gits.branchcn.com/backend/microcode/plugins/orm"
)
var DB orm.Plugin
func InitDB() (err error) {
dbConfig := orm.PluginConfig{
URL: config.Config.Database.URL,
MaxIdleConn: config.Config.Database.MaxIdleConn,
MaxOpenConn: config.Config.Database.MaxOpenConn,
ConnMaxLifetime: config.Config.Database.ConnMaxLifetime,
Logger: Logger,
SlowThreshold: config.Config.Database.SlowThreshold,
}
DB, err = orm.NewPlugin(dbConfig)
if err != nil {
return
}
return
}

@ -0,0 +1,56 @@
package app
import (
"context"
"joybuywork/internal/config"
"time"
"go.etcd.io/etcd/api/v3/mvccpb"
clientv3 "go.etcd.io/etcd/client/v3"
)
const (
EtcdPrefix = "/joybuywork"
EtcdConfig = EtcdPrefix + "/config"
)
var EtcdCli *clientv3.Client
func InitEtcdCli() (err error) {
EtcdCli, err = clientv3.New(clientv3.Config{
Endpoints: config.Config.Etcd.Address,
DialTimeout: 10 * time.Second,
})
if err != nil {
return
}
watch()
return
}
func watch() {
GoSafe(func() {
for {
data, ok := <-EtcdCli.Watch(context.Background(), EtcdConfig, clientv3.WithPrefix(), clientv3.WithPrevKV())
if !ok || data.Canceled {
FeishuNormalSend("etcd 退出了, 数据 %+v, 错误:%v", data, ok)
return
}
for _, ev := range data.Events {
switch ev.Type {
case mvccpb.PUT:
switch string(ev.Kv.Key) {
case EtcdConfig + "/ads":
err := AdsInit(string(ev.Kv.Value))
FeishuNormalSend("重制广告配置[%s],错误:%v", string(ev.Kv.Value), err)
}
}
}
}
})
}

@ -0,0 +1,66 @@
package app
import (
"joybuywork/internal/config"
"fmt"
"gits.branchcn.com/backend/microcode/plugins/alert"
)
var FeiShu alert.Plugin
func InitFeiShu() (err error) {
if config.Config.Alert.FeiShu.Url != "" {
alertConfig := alert.PluginConfig{
Type: alert.PluginConfigTypeFeiShu,
Url: config.Config.Alert.FeiShu.Url,
Secret: config.Config.Alert.FeiShu.Secret,
}
for _, v := range config.Config.Alert.Scenes {
alertConfig.Scenes = append(alertConfig.Scenes, &alert.Conf{
Type: alert.PluginConfigTypeFeiShu,
Url: v.Url,
Secret: v.Secret,
Scene: v.Scene,
})
}
FeiShu, err = alert.NewPlugin(alertConfig)
}
return
}
const (
normal = "normal"
notice = "notice"
)
// FeishuNormalSend 发送普通消息,这个给自己监听用的
func FeishuNormalSend(format string, a ...any) {
h, ok := FeiShu.Scenes[normal]
if !ok {
return
}
if len(a) > 0 {
h.SendText(fmt.Sprintf(format, a...))
return
}
h.SendText(format)
}
// FeishuNoticeSend 发送通知消息,这个是一些业务通知用的
func FeishuNoticeSend(format string, a ...any) {
h, ok := FeiShu.Scenes[notice]
if !ok {
return
}
if len(a) > 0 {
h.SendText(fmt.Sprintf(format, a...))
return
}
h.SendText(format)
}

@ -0,0 +1,20 @@
// Code generated by gen. DO NOT EDIT.
package app
import (
"joybuywork/internal/config"
"gits.branchcn.com/backend/microcode/plugins/kafka"
)
var Kafka kafka.Plugin
func InitKafka() (err error) {
kafkaConfig := kafka.PluginConfig{
Brokers: config.Config.Kafka.Brokers,
}
Kafka, err = kafka.NewPlugin(kafkaConfig)
if err != nil {
return
}
return
}

@ -0,0 +1,155 @@
package app
import (
"joybuywork/internal/consts"
"encoding/json"
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
)
const (
FixRewardsIdThank = -1
FixRewardsIdChallengeFailed = -2
FixRewardsIdEggFailed = -3
)
type FixReward struct {
langKey string
Id int64 `json:"id"`
RewardTitle string `json:"reward_title"`
Langs []*FixRewardLang `json:"langs"`
}
type FixRewardLang struct {
Title string `json:"title"`
ImgUrl string `json:"img_url"`
Mark string `json:"mark"`
IsDefault bool `json:"is_default"`
}
var FissionFixRewards []*FixReward
// LangDataInit 初始化固定奖品
func LangDataInit() (err error) {
FissionFixRewards = append(FissionFixRewards, &FixReward{
langKey: "thank",
Id: FixRewardsIdThank,
RewardTitle: "NEXT TIME",
Langs: nil,
}, &FixReward{
langKey: "challenge_failed",
RewardTitle: "FAILED",
Id: FixRewardsIdChallengeFailed,
Langs: nil,
}, &FixReward{
langKey: "thank",
Id: FixRewardsIdEggFailed,
RewardTitle: "NEXT TIME",
Langs: nil,
})
path := GetI18nFilePath()
entrys, err := os.ReadDir(path)
if err != nil {
return
}
var langMap = make(map[string]map[string]string)
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(path + "/" + entry.Name())
if err != nil {
return
}
err = json.Unmarshal(b, &ddd)
if err != nil {
return
}
langMap[mark] = ddd
}
for _, reward := range FissionFixRewards {
imgUrl := consts.TempInfoImgDefaultValue
switch reward.Id {
case -3:
imgUrl = "ftg/gashapon/default_thank.png"
}
for mark, ddd := range langMap {
reward.Langs = append(reward.Langs, &FixRewardLang{
Title: ddd[reward.langKey],
ImgUrl: imgUrl,
Mark: mark,
IsDefault: mark == consts.LangEn,
})
TalkMap.set(mark, ddd)
}
}
return
}
type TalkMapType map[string]map[string]string
var TalkMap TalkMapType = make(map[string]map[string]string)
func (t TalkMapType) val(lang, mark string) string {
langs, ok := t[lang]
if !ok {
return ""
}
return langs[mark]
}
func (t TalkMapType) set(lang string, data map[string]string) {
if _, ok := t[lang]; !ok {
t[lang] = make(map[string]string)
}
for k, v := range data {
switch k {
case "active_talk", "complete_task_talk", "task_reset_talk", "dog_offline_talk":
t[lang][k] = v
}
}
}
func (t TalkMapType) DogOffline(lang string) string {
return t.val(lang, "dog_offline_talk")
}
func (t TalkMapType) TaskReset(lang string) string {
return t.val(lang, "task_reset_talk")
}
func (t TalkMapType) Active(lang string) string {
return t.val(lang, "active_talk")
}
func (t TalkMapType) CompeteTask(lang string) string {
return t.val(lang, "complete_task_talk")
}
// GetI18nFilePath 获取i18n文件路径
func GetI18nFilePath() string {
if !consts.RunTest {
dir, _ := os.Getwd()
return fmt.Sprintf("%s/asset/campaign/lang", dir)
}
_, filename, _, _ := runtime.Caller(0)
current := filepath.Dir(filename)
return fmt.Sprintf("%s/../../asset/campaign/lang", current)
}

@ -0,0 +1,108 @@
package app
import (
"context"
"fmt"
"time"
cmap "github.com/orcaman/concurrent-map/v2"
_ "net/http/pprof"
)
var Listen = NewListener()
const defaultT = time.Second
type Listener struct {
ctx context.Context
d time.Duration
}
func NewListener() *Listener {
return &Listener{
ctx: context.Background(),
d: defaultT,
}
}
// Listen 监听
func (l *Listener) Listen(fn func() (messages []string), ds ...time.Duration) {
d := l.d
if len(ds) > 0 {
d = ds[0]
}
GoSafe(func() {
t := time.NewTicker(d)
defer t.Stop()
for {
select {
case <-l.ctx.Done():
return
case <-t.C:
messages := fn()
if len(messages) == 0 {
continue
}
for _, msg := range messages {
FeishuNormalSend(msg)
}
}
}
})
}
func (l *Listener) Stop() {
l.ctx.Done()
}
// ListenPush 全局监听并推送
func ListenPush(fn func() (messages []string), ds ...time.Duration) {
Listen.Listen(fn, ds...)
}
var collect = cmap.New[cmap.ConcurrentMap[string, int64]]()
func InitCollect() {
go func() {
t := time.NewTicker(15 * time.Second)
defer t.Stop()
for {
select {
case <-t.C:
for i := 2; i < 17; i++ {
collect.Remove(fmt.Sprintf("%d", time.Now().Unix()-int64(i)))
}
}
}
}()
}
func Collect(name string) {
for i := 0; i < 15; i++ {
key := fmt.Sprintf("%d", time.Now().Unix()+int64(i))
v := cmap.New[int64]()
collect.Upsert(key, v, func(exist bool, valueInMap cmap.ConcurrentMap[string, int64], newValue cmap.ConcurrentMap[string, int64]) cmap.ConcurrentMap[string, int64] {
if !exist {
v.Set(name, 1)
return v
}
valueInMap.Upsert(name, 1, func(exist bool, valueInMap int64, newValue int64) int64 {
if exist {
return valueInMap + 1
}
return newValue
})
return valueInMap
})
}
}
func GetCollect() (cmap.ConcurrentMap[string, int64], bool) {
key := fmt.Sprintf("%d", time.Now().Unix()-1)
return collect.Pop(key)
}

@ -0,0 +1,43 @@
package app
import (
"context"
"joybuywork/internal/config"
"joybuywork/internal/consts"
"fmt"
"gits.branchcn.com/backend/microcode/plugins/logger"
"go.uber.org/zap/zapcore"
)
var Logger logger.Plugin
func InitLogger() {
loggerConfig := logger.PluginConfig{
ModeProd: config.Config.Server.Env == "prod",
Level: zapcore.InfoLevel,
StdOut: config.Config.Logger.StdOut,
FileOut: config.Config.Logger.FileOut,
JsonEncode: false,
StackTraceLevel: zapcore.ErrorLevel,
FileConfig: logger.FileConfig{
Path: config.Config.Logger.Path,
MaxSize: config.Config.Logger.MaxSize,
MaxBackups: config.Config.Logger.MaxBackups,
MaxAge: config.Config.Logger.MaxAge,
LocalTime: true,
Compress: config.Config.Logger.Compress,
},
AlarmWriter: FeiShu.Alert,
Env: config.Config.Server.Env,
ContextTraceKey: consts.TraceIdKey,
ContextKey: []string{consts.CtxReqId, consts.CtxBootId, consts.CtxMsgId},
}
Logger = logger.NewPlugin(loggerConfig)
}
func TryCatch(ctx context.Context, msg string) {
if err := recover(); err != nil {
Logger.Error(ctx, fmt.Sprintf("%s, 错误信息:%v", msg, err))
}
}

@ -0,0 +1,169 @@
package app
import (
"joybuywork/internal/server/depend"
c_fuserpb "gits.branchcn.com/backend/certified/proto/go_proto/c_fuser"
c_guserpb "gits.branchcn.com/backend/certified/proto/go_proto/c_guser"
c_userpb "gits.branchcn.com/backend/certified/proto/go_proto/c_user"
chatpb "gits.branchcn.com/backend/deepai/proto/go_proto/ai_chat"
ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice"
deventpb "gits.branchcn.com/backend/deeplink/proto/go_proto/devent"
dlinkpb "gits.branchcn.com/backend/deeplink/proto/go_proto/dlink"
analyzepb "gits.branchcn.com/backend/fissionbi/proto/go_proto/bi_analyze"
factionpb "gits.branchcn.com/backend/fissionbi/proto/go_proto/bi_fission_action"
oprojectpb "gits.branchcn.com/backend/oplatform/proto/go_proto/oproject"
linkpb "gits.branchcn.com/backend/shortlink/proto/go_proto/link"
t_centerpb "gits.branchcn.com/backend/taskcenter/proto/go_proto/t_center"
t_center_statpb "gits.branchcn.com/backend/taskcenter/proto/go_proto/t_center_stat"
)
const (
certifiedName = "certified"
deepLinkName = "deeplink"
shortLinkName = "shortlink"
fissionBiName = "fissionbi"
oplatformName = "oplatform"
deepAiName = "deepai"
taskcenterName = "taskcenter"
)
func InitMicro() {
certified = certifiedService{
cUser: c_userpb.NewCUserService(certifiedName, depend.M.Client()),
fUser: c_fuserpb.NewCFUserService(certifiedName, depend.M.Client()),
gUser: c_guserpb.NewCGUserService(certifiedName, depend.M.Client()),
}
deepLink = deepLinkService{
link: dlinkpb.NewDLinkService(deepLinkName, depend.M.Client()),
event: deventpb.NewDEventService(deepLinkName, depend.M.Client()),
device: ddevicepb.NewDDeviceService(deepLinkName, depend.M.Client()),
}
shortLink = shortLinkService{
link: linkpb.NewLinkService(shortLinkName, depend.M.Client()),
}
fissionBi = fissionBiService{
analyze: analyzepb.NewBiAnalyzeService(fissionBiName, depend.M.Client()),
faction: factionpb.NewBiFissionActionService(fissionBiName, depend.M.Client()),
}
oplatform = oplatformService{
oproject: oprojectpb.NewOProjectService(oplatformName, depend.M.Client()),
}
deepAi = deepAiService{
chat: chatpb.NewChatService(deepAiName, depend.M.Client()),
}
taskcenter = taskcenterService{
center: t_centerpb.NewTCenterService(taskcenterName, depend.M.Client()),
centerStat: t_center_statpb.NewTCenterStatService(taskcenterName, depend.M.Client()),
}
}
// 认证
type certifiedService struct {
cUser c_userpb.CUserService
fUser c_fuserpb.CFUserService
gUser c_guserpb.CGUserService
}
var certified certifiedService
func NewCertifiedUser() c_userpb.CUserService {
return certified.cUser
}
func NewCertifiedFUser() c_fuserpb.CFUserService {
return certified.fUser
}
func NewCertifiedGUser() c_guserpb.CGUserService {
return certified.gUser
}
// 深度链接
type deepLinkService struct {
link dlinkpb.DLinkService
event deventpb.DEventService
device ddevicepb.DDeviceService
}
var deepLink deepLinkService
func NewDeepLinkLink() dlinkpb.DLinkService {
return deepLink.link
}
func NewDeepLinkEvent() deventpb.DEventService {
return deepLink.event
}
func NewDeepLinkDevice() ddevicepb.DDeviceService {
return deepLink.device
}
// 短链
type shortLinkService struct {
link linkpb.LinkService
}
var shortLink shortLinkService
func NewShortLinkNameLink() linkpb.LinkService {
return shortLink.link
}
// 玩法报表
type fissionBiService struct {
analyze analyzepb.BiAnalyzeService
faction factionpb.BiFissionActionService
}
var fissionBi fissionBiService
func NewFissionBiAnalyze() analyzepb.BiAnalyzeService {
return fissionBi.analyze
}
func NewFissionBiFissionAction() factionpb.BiFissionActionService {
return fissionBi.faction
}
// 开放平台
type oplatformService struct {
oproject oprojectpb.OProjectService
}
var oplatform oplatformService
func NewOProject() oprojectpb.OProjectService {
return oplatform.oproject
}
type deepAiService struct {
chat chatpb.ChatService
}
var deepAi deepAiService
func NewDeepAiChat() chatpb.ChatService {
return deepAi.chat
}
type taskcenterService struct {
centerStat t_center_statpb.TCenterStatService
center t_centerpb.TCenterService
}
var taskcenter taskcenterService
func NewTaskcenterCenterStat() t_center_statpb.TCenterStatService {
return taskcenter.centerStat
}
func NewTaskcenterCenter() t_centerpb.TCenterService {
return taskcenter.center
}

@ -0,0 +1,159 @@
package app
import (
"bytes"
"context"
"joybuywork/internal/consts"
"encoding/json"
"fmt"
"net"
"runtime"
"runtime/pprof"
"time"
)
var Info ServiceInfo
func SetUpCollector() {
Info = ServiceInfo{
Name: consts.ServiceName,
NodeId: fmt.Sprint(NodeId),
GoVersion: runtime.Version(),
StartAt: time.Now().Unix(),
LastReportAt: time.Now().Unix(),
Ip: GetLocalIP(),
}
}
type PProfCollector struct {
}
// 初始化采集器
func NewPProfCollector() *PProfCollector {
return &PProfCollector{}
}
// 采集运行时指标
func (c *PProfCollector) collectRuntimeMetrics() map[string]any {
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
return map[string]any{
"timestamp": time.Now().Unix(),
"heap_alloc": memStats.HeapAlloc, // 当前堆内存分配(字节)
"heap_sys": memStats.HeapSys, // 堆内存总申请量
"goroutines": runtime.NumGoroutine(), // Goroutine 数量
"gc_count": memStats.NumGC, // GC 次数
"gc_pause_ns": memStats.PauseTotalNs, // GC 总暂停时间(纳秒)
}
}
// 采集 Heap Profile 并存储到 Redis
func (c *PProfCollector) saveHeapProfile() {
var buf bytes.Buffer
if err := pprof.WriteHeapProfile(&buf); err != nil {
Logger.Error(context.Background(), fmt.Sprintf("Failed to collect heap profile: %v", err))
return
}
// 存储为 Redis String(二进制数据)
key := fmt.Sprintf("joybuywork:app:heap:%v:%s", NodeId, time.Now().Format("20060102_1504"))
if err := Redis.Cache.Set(context.Background(), key, buf.Bytes(), 30*time.Minute).Err(); err != nil {
Logger.Error(context.Background(), fmt.Sprintf("Failed to save heap profile to Redis: %v", err))
} else {
Logger.Info(context.Background(), fmt.Sprintf("Heap profile saved: %s", key))
}
}
// 采集 CPU Profile(需谨慎,仅在必要时启用)
func (c *PProfCollector) saveCPUProfile(duration time.Duration) {
var buf bytes.Buffer
if err := pprof.StartCPUProfile(&buf); err != nil {
Logger.Error(context.Background(), fmt.Sprintf("Failed to start CPU profile: %v", err))
return
}
time.Sleep(duration)
pprof.StopCPUProfile()
key := fmt.Sprintf("joybuywork:app:cpu:%v:%s", NodeId, time.Now().Format("20060102_1504"))
if err := Redis.Cache.Set(context.Background(), key, buf.Bytes(), 30*time.Minute).Err(); err != nil {
Logger.Error(context.Background(), fmt.Sprintf("Failed to save CPU profile to Redis: %v", err))
} else {
Logger.Info(context.Background(), fmt.Sprintf("CPU profile saved: %s", key))
}
}
// 存储运行时指标到 Redis(JSON 格式)
func (c *PProfCollector) saveRuntimeMetrics() {
ctx := context.Background()
// 指标存储
metrics := c.collectRuntimeMetrics()
jsonData, err := json.Marshal(metrics)
if err != nil {
Logger.Error(ctx, fmt.Sprintf("Failed to marshal metrics: %v", err))
return
}
key := fmt.Sprintf("joybuywork:app:metrics:%v:%s", NodeId, time.Now().Format("20060102"))
if err := Redis.Cache.HSet(context.Background(), key, time.Now().Format("1504"), jsonData).Err(); err != nil {
Logger.Error(context.Background(), fmt.Sprintf("Failed to save metrics to Redis: %v", err))
} else {
Redis.Cache.Expire(ctx, key, 24*time.Hour)
Logger.Info(context.Background(), fmt.Sprintf("Metrics saved: %s", key))
}
}
// 启动定时采集任务
func (c *PProfCollector) Start() {
c.saveRuntimeMetrics()
c.saveHeapProfile()
c.saveCPUProfile(30 * time.Second) // 可选:采集 10 秒 CPU 数据
}
type ServiceInfo struct {
Name string `json:"name"` //服务名称
NodeId string `json:"node_id"` //节点id
GoVersion string `json:"go_version"` //GO版本
StartAt int64 `json:"start_at"` //启动时间戳
LastReportAt int64 `json:"last_report_at"` //最后上报时间戳
Ip string `json:"ip"`
}
func HeartBeat() {
ctx := context.Background()
// 服务存储
Info.LastReportAt = time.Now().Unix()
jsonInfo, err := json.Marshal(Info)
if err != nil {
Logger.Error(ctx, fmt.Sprintf("Failed to collect service info to json: %v\n", err))
return
}
infokey := fmt.Sprintf("service_info:%s", Info.Name)
err = Redis.Cache.HSet(ctx, infokey, Info.NodeId, string(jsonInfo)).Err()
if err != nil {
Logger.Error(ctx, fmt.Sprintf("Failed to report service info to Redis: %v\n", err))
}
Redis.Cache.Expire(ctx, infokey, 1*time.Hour)
}
func GetLocalIP() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, addr := range addrs {
ipNet, ok := addr.(*net.IPNet)
if ok && !ipNet.IP.IsLoopback() {
if ipNet.IP.To4() != nil {
return ipNet.IP.String()
}
}
}
return ""
}

@ -0,0 +1,67 @@
package app
import (
"context"
"joybuywork/internal/consts/ckey"
"fmt"
"gits.branchcn.com/backend/microcode/plugins/derivative/bucket"
"gits.branchcn.com/backend/microcode/plugins/derivative/lock"
"gits.branchcn.com/backend/microcode/plugins/derivative/progress"
"gits.branchcn.com/backend/microcode/plugins/derivative/task"
"gits.branchcn.com/backend/microcode/plugins/derivative/vercontrol"
"sync"
)
type SubLock struct {
once sync.Once
lock *lock.SubLock
}
var subLock = &SubLock{}
// InitSubLock 初始化关注锁
func InitSubLock() {
subLock.once.Do(func() {
subLock.lock = lock.NewSubLock(context.Background(), Redis.Cache, ckey.SubLockCommon(), lock.SetLogger(RedisLog{}))
})
}
// NewFollower redis订阅锁记录
func NewFollower(ctx context.Context, key string, opts ...lock.Option) *lock.Follower {
return subLock.lock.NewFollower(ctx, key, opts...)
}
// NewRedisLock redis锁记录
func NewRedisLock(ctx context.Context, key string, opts ...lock.Option) *lock.RedisLock {
return lock.NewRedisLock(ctx, Redis.Cache, key, opts...)
}
// NewLastingBucket redis桶
func NewLastingBucket(ctx context.Context, key string, val bucket.Value, opts ...bucket.LastingOption) *bucket.LastingBucket {
return bucket.NewLastingBucket(ctx, Redis.Cache, key, val, opts...)
}
// NewRedisProgress redis进度
func NewRedisProgress(ctx context.Context, key string, opts ...progress.Option) *progress.Progress {
return progress.NewRedisProgress(ctx, Redis.Cache, key, opts...)
}
// NewRedisTask redis任务
func NewRedisTask(ctx context.Context, key string) *task.RedisTask {
return task.NewRedisTask(ctx, Redis.Cache, key)
}
// NewVerControl redis版本
func NewVerControl(ctx context.Context, key string, opts ...vercontrol.Option) *vercontrol.VerControl {
return vercontrol.NewRedisVerControl(ctx, Redis.Cache, key, opts...)
}
type RedisLog struct {
}
func (RedisLog) Print(ctx context.Context, format string, args ...interface{}) {
Logger.Info(ctx, fmt.Sprintf(format, args...))
}
func (RedisLog) Panic(ctx context.Context, format string, args ...interface{}) {
Logger.Error(ctx, fmt.Sprintf(format, args...))
}

@ -0,0 +1,21 @@
// Code generated by gen. DO NOT EDIT.
package app
import (
"joybuywork/internal/config"
"gits.branchcn.com/backend/microcode/plugins/cache"
)
var Redis cache.Plugin
func InitRedis() (err error) {
cacheConfig := cache.PluginConfig{
Host: config.Config.Redis.Addr,
Password: config.Config.Redis.Password,
DbNum: config.Config.Redis.DB,
Sentinel: config.Config.Redis.Sentinel,
SentinelMasterName: config.Config.Redis.SentinelMasterName,
}
Redis, err = cache.NewPlugin(cacheConfig)
return
}

@ -0,0 +1,72 @@
package app
import (
"context"
"sync"
"time"
"github.com/bwmarrin/snowflake"
)
var SnowFlakeNode *snowflake.Node
var SnowFlake11Node *snowflake11
var NodeId int64
func InitNode() (err error) {
NodeId, err = Redis.Incr(context.Background(), "joybuywork:snow_flake_node")
if err != nil {
return
}
NodeId = NodeId % 1000
snowflake.Epoch = 1687190400000
SnowFlakeNode, _ = snowflake.NewNode(NodeId)
SnowFlake11Node = newSnowflake11(NodeId)
return
}
const (
epoch = 1609459200000 // 2021-01-01 00:00:00 UTC
nodeBits = 4 // 节点ID位数
stepBits = 7 // 序列号位数
)
type snowflake11 struct {
mu sync.Mutex
node int64
step int64
time int64
}
func newSnowflake11(node int64) *snowflake11 {
return &snowflake11{
node: node % (1 << nodeBits),
}
}
func (s *snowflake11) ID() int64 {
s.mu.Lock()
defer s.mu.Unlock()
now := time.Now().UnixNano() / 1e6 // 毫秒时间戳
if s.time == now {
s.step = (s.step + 1) & ((1 << stepBits) - 1)
if s.step == 0 {
for now <= s.time {
now = time.Now().UnixNano() / 1e6
}
}
} else {
s.step = 0
}
s.time = now
// 组成11位ID: 时间差(24位) + 节点(4位) + 序列号(7位)
// 但实际计算会压缩到11位十进制
id := (now-epoch)<<(nodeBits+stepBits) | (s.node << stepBits) | s.step
// 转换为11位十进制数
return id % 1e11
}

@ -0,0 +1,59 @@
package app
import (
"context"
"fmt"
"github.com/panjf2000/ants/v2"
)
type AntsLog struct {
}
func (AntsLog) Printf(format string, args ...interface{}) {
Logger.Error(context.Background(), fmt.Sprintf(format, args...))
}
// 队列消费者池
var QueueConsumerPool, _ = ants.NewMultiPool(
50, // 50个池
60, // 每个池60个任务
ants.RoundRobin,
ants.WithPreAlloc(true),
ants.WithPanicHandler(func(i interface{}) {
Logger.Error(context.Background(), fmt.Sprintf("ants task panic: %v", i))
}),
ants.WithLogger(AntsLog{}),
)
func GoSafe(fn func(), msg ...any) {
go func() {
defer func() {
if re := recover(); re != nil {
//协程异常捕捉及重试
if len(msg) > 0 {
Logger.Error(context.Background(), fmt.Sprint(fmt.Sprint(msg...), fmt.Sprintf("协程捕捉到异常:%v", re)))
} else {
Logger.Error(context.Background(), fmt.Sprintf("协程捕捉到异常:%v", re))
}
}
}()
fn()
}()
}
func GoSafeRetry(fn func(), retryFn func(), msg ...any) {
go func() {
defer func() {
if re := recover(); re != nil {
//协程异常捕捉及重试
if len(msg) > 0 {
Logger.Error(context.Background(), fmt.Sprint(fmt.Sprint(msg...), fmt.Sprintf("协程捕捉到异常:%v", re)))
} else {
Logger.Error(context.Background(), fmt.Sprintf("协程捕捉到异常:%v", re))
}
retryFn()
}
}()
fn()
}()
}

@ -0,0 +1,148 @@
package boot
import (
"joybuywork/internal/app"
"joybuywork/internal/config"
"joybuywork/internal/consts"
"joybuywork/internal/repository/dao"
"joybuywork/internal/server"
"joybuywork/internal/service/crons"
"joybuywork/internal/service/queue/consumer"
"joybuywork/internal/service/queue/consumer/campaignnotice"
"joybuywork/internal/service/queue/consumer/statcampaign"
"joybuywork/internal/service/queue/delay"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/utils"
"flag"
"fmt"
"time"
)
// Init 初始化活动配置和全局变量
func Init() (err error) {
// 启动环境获取
env := flag.String("env", "local", "environment, can be 'dev', 'test' or 'prod'")
flag.Parse()
var filePath = config.FilePath{
ConfigName: fmt.Sprintf("config-%s", *env),
ConfigType: "yaml",
ConfigPath: "./etc",
}
err = config.LoadConfig(filePath)
if err != nil {
return
}
//报警推送,一定要先初始化推送再开启日志
err = app.InitFeiShu()
if err != nil {
return
}
//日志
app.InitLogger()
//mysql
err = app.InitDB()
if err != nil {
return
}
// 设置dao的数据库
dao.SetDefault(app.DB.Client)
//redis
err = app.InitRedis()
if err != nil {
return
}
err = app.InitNode()
if err != nil {
return
}
app.InitSubLock()
// 采集
app.SetUpCollector()
err = app.InitEtcdCli()
if err != nil {
return
}
//kafka
err = app.InitKafka()
if err != nil {
return
}
//定时任务
crons.SetUp()
//队列生产者
producer.SetUp()
//队列消费者
err = queue()
if err != nil {
return
}
// 固定的奖品数据
err = app.LangDataInit()
if err != nil {
return
}
err = app.AdsInit("")
if err != nil {
return
}
app.InitCollect()
return
}
// Run 服务启动
func Run() {
_ = server.Run()
// 初始化micro的一些服务
app.InitMicro()
app.FeishuNormalSend("[%s]「%s」[%s] 服务启动", utils.GetIp(), config.Config.Server.Env, consts.ServiceName)
}
func Shutdown() {
consumer.Stop()
delay.Stop()
time.Sleep(5 * time.Second)
}
func queue() (err error) {
err = campaignnotice.Run()
if err != nil {
return
}
err = statcampaign.Run()
if err != nil {
return
}
err = delay.Setup()
if err != nil {
return
}
return
}

@ -0,0 +1,180 @@
package boot
import (
"joybuywork/internal/app"
"joybuywork/internal/config"
"joybuywork/internal/utils"
"fmt"
"runtime"
"time"
"gits.branchcn.com/backend/microcode/plugins/derivative/lock"
)
// ListenMysqlLink 监听mysql连接数
func ListenMysqlLink() {
var cycTimes = 10
var idx, mysqlLink int
var p90 bool // 是否超过了90%
var p90Time time.Time // 第一次超过90%的时间
app.ListenPush(func() (messages []string) {
db, _ := app.DB.Client.DB()
nc := db.Stats().OpenConnections // 当前使用的连接数
maxConn := config.Config.Database.MaxOpenConn // 最大可使用的连接数
percent := float64(nc) / float64(maxConn) // 使用率
// 使用率大于90%
if percent > 0.9 && !p90 {
messages = append(messages, fmt.Sprintf("[%s]的mysql连接使用已经超过设置90%%(%d/%d)", utils.GetIp(), nc, maxConn))
p90 = true
p90Time = time.Now()
}
// 如果之前是超过90%使用率,现在下降至80%以下
if p90 && percent < 0.8 {
// 90%使用率占用超过10秒,会同送消息
if time.Since(p90Time).Seconds() >= 10 {
messages = append(messages, fmt.Sprintf("[%s]的mysql连接使用已经下降低于80%%(%d/%d), 持续时间%.3f(s)", utils.GetIp(), nc, maxConn, time.Since(p90Time).Seconds()))
}
// 使用率下降了至正常范围了
p90 = false
}
mysqlLink += nc // 每执行一次都加个总数
idx++ // 叠加次数
// 叠加到一个轮循,就推送一次消息
if idx == cycTimes {
if float64(mysqlLink)/float64(maxConn*cycTimes) > 0.8 && !p90 {
messages = append(messages, fmt.Sprintf("近10秒时间[%s]的mysql连接使用已经超过设置80%%(%d/%d)", utils.GetIp(), mysqlLink, maxConn*cycTimes))
}
// 重制一下
idx, mysqlLink = 0, 0
}
return
})
}
// ListenSubRedisMap 关注锁的情况
func ListenSubRedisMap() {
app.ListenPush(func() (messages []string) {
var str = fmt.Sprintf("%s关注锁情况", utils.GetIp())
l := len(str)
for key, num := range lock.GetSubContent() {
str += fmt.Sprintf("\r\n 关注key:%s,关注剩余数:%d", key, num)
}
if l == len(str) {
return
}
return []string{str}
}, 30*time.Second)
}
// ListenQueueConsumerPoolUse 队列携程使用情况
func ListenQueueConsumerPoolUse() {
var cycTimes = 10
var idx, mysqlLink int
var p90 bool // 是否超过了90%
var p90Time time.Time // 第一次超过90%的时间
var maxConn = 5000
app.ListenPush(func() (messages []string) {
nc := app.QueueConsumerPool.Running()
percent := float64(nc) / float64(maxConn) // 使用率
// 使用率大于90%
if percent > 0.9 && !p90 {
messages = append(messages, fmt.Sprintf("[%s]的队列携程使用已经超过设置90%%(%d/%d)", utils.GetIp(), nc, maxConn))
p90 = true
p90Time = time.Now()
}
// 如果之前是超过90%使用率,现在下降至80%以下
if p90 && percent < 0.8 {
// 90%使用率占用超过10秒,会同送消息
if time.Since(p90Time).Seconds() >= 10 {
messages = append(messages, fmt.Sprintf("[%s]的队列携程使用已经下降低于80%%(%d/%d), 持续时间%.3f(s)", utils.GetIp(), nc, maxConn, time.Since(p90Time).Seconds()))
}
// 使用率下降了至正常范围了
p90 = false
}
mysqlLink += nc // 每执行一次都加个总数
idx++ // 叠加次数
// 叠加到一个轮循,就推送一次消息
if idx == cycTimes {
if float64(mysqlLink)/float64(maxConn*cycTimes) > 0.8 && !p90 {
messages = append(messages, fmt.Sprintf("近10秒时间[%s]的队列携程使用已经超过设置80%%(%d/%d)", utils.GetIp(), mysqlLink, maxConn*cycTimes))
}
// 重制一下
idx, mysqlLink = 0, 0
}
return
})
}
// ListenMemStats 关注内存情况
func ListenMemStats() {
var idx int
var clearIdx int
var pushMsg = true
app.ListenPush(func() (messages []string) {
var m runtime.MemStats
runtime.ReadMemStats(&m)
alloc := float64(m.Alloc) / 1024 / 1024 / 1024
totalAlloc := float64(m.TotalAlloc) / 1024 / 1024 / 1024
tSys := float64(m.Sys) / 1024 / 1024 / 1024
tNumGc := m.NumGC
if alloc > 0.512 {
idx++
clearIdx = 0
if pushMsg {
ip := utils.GetIp()
data, ok := app.GetCollect()
var num int64
var dataMsg string
if ok {
dataMsg += fmt.Sprintf("[%s]\r\n", ip)
for v := range data.IterBuffered() {
dataMsg += fmt.Sprintf("%s: %d; ", v.Key, v.Val)
num += v.Val
}
}
msg := fmt.Sprintf("[%s], Alloc = %.4f GB, TotalAlloc = %.4f GB, Sys = %.4f GB, NumGC = %v, 近15s业务量:%d", ip, alloc, totalAlloc, tSys, tNumGc, num)
messages = append(messages, msg)
if dataMsg != "" {
messages = append(messages, dataMsg)
}
}
if idx == 10 {
pushMsg = false
}
} else {
clearIdx++
if clearIdx == 300 {
clearIdx, idx, pushMsg = 0, 0, true
}
}
return
}, time.Second)
}

@ -0,0 +1,121 @@
package config
import (
"fmt"
"gopkg.in/yaml.v3"
"os"
"time"
)
var Config = &AllConfig{}
// AllConfig 应用程序配置结构体
type AllConfig struct {
Server ServerConfig `yaml:"server"`
Etcd EtcdConfig `yaml:"etcd"`
Logger LoggerConfig `yaml:"logger"`
Database DatabaseConfig `yaml:"database"`
Redis RedisConfig `yaml:"redis"`
Kafka KafkaConfig `yaml:"kafka"`
Alert AlertConfig `yaml:"alert"`
Upload Oss `yaml:"upload"` //上传配置
}
// ServerConfig defines the configuration for the server.
type ServerConfig struct {
Env string `yaml:"env"` // 动环境,取值为 "dev"、"test" 或 "prod",默认为 "dev"
LinkDomain string `yaml:"link_domain"` //链接的域名
LinkDomainProto string `yaml:"link_domain_proto"` //链接的域名协议
LadderHost string `yaml:"ladder_host"` //转发地址
AdsDomain string `yaml:"ads_domain"` //广告活动的域名
AdsDomainProto string `yaml:"ads_domain_proto"` //广告活动的域名协议
AdsJump string `yaml:"ads_jump"` //广告策略调整地址
}
// EtcdConfig defines the configuration for etcd
type EtcdConfig struct {
Address []string `yaml:"address"`
}
// LoggerConfig defines the configuration for logging.
type LoggerConfig struct {
StdOut bool `yaml:"std_out"`
FileOut bool `yaml:"file_out"`
Path string `yaml:"path"`
MaxSize int `yaml:"max_size"`
MaxBackups int `yaml:"max_backups"`
MaxAge int `yaml:"max_age"`
Compress bool `yaml:"compress"`
}
// DatabaseConfig defines the configuration for the database.
type DatabaseConfig struct {
URL string `yaml:"url"` // 数据库连接地址
MaxIdleConn int `yaml:"max_idle_conn"` // 最大空闲连接数,默认为10
MaxOpenConn int `yaml:"max_open_conn"` // 最大活动连接数,默认为100
ConnMaxLifetime time.Duration `yaml:"conn_max_lifetime"` // 连接最大生命周期(单位:秒) 默认为3600
SlowThreshold time.Duration `yaml:"slow_threshold"` //慢sql警告阈值(单位:毫秒)
}
// RedisConfig defines the configuration for Redis.
type RedisConfig struct {
Addr string `yaml:"addr"` // Redis连接地址
Password string `yaml:"password"` // Redis连接密码
DB int `yaml:"db"` // 连接库
Sentinel string `yaml:"sentinel"` // 哨兵模式时 哨兵地址,没有则不填
SentinelMasterName string `yaml:"sentinel_master_name"` // 哨兵模式下master名称,没有则不填
}
// KafkaConfig defines the configuration for Kafka.
type KafkaConfig struct {
Brokers []string `yaml:"brokers"` // Kafka连接地址,格式为 "host1:port1,host2:port2,...",也支持多行格式
}
// AlertConfig defines the configuration for alerting.
type AlertConfig struct {
FeiShu FeiShuConfig `yaml:"feishu"` // 飞书告警配置
Scenes []FeiShuScenesConfig `yaml:"scenes"` // 场景配置
}
type FeiShuConfig struct {
Url string `yaml:"url"` // 告警地址
Secret string `yaml:"secret"` // 告警地址密码
}
type FeiShuScenesConfig struct {
Url string `yaml:"url"` // 告警地址
Secret string `yaml:"secret"` // 告警地址密码
Scene string `yaml:"scene"` //场景
}
// FilePath 配置文件路径信息
type FilePath struct {
ConfigName string // 设置配置文件名 (不需要后缀)
ConfigType string // 设置配置文件类型
ConfigPath string // 设置配置文件路径
}
type Oss struct {
AccessKey string `yaml:"access_key"` //AccessKeyId
Secret string `yaml:"secret"` //AccessKeySecret
UploadUrl string `yaml:"upload_url"` //阿里云上传地址
Endpoint string `yaml:"endpoint"` //访问 OSS 服务的时候使用的域名
BucketName string `yaml:"bucket_name"` //存储空间名称
Prefix string `yaml:"prefix"` //上传文件路径前缀
Host string `yaml:"host"` //全球访问host
}
// LoadConfig 从文件中加载配置
func LoadConfig(filepath FilePath) error {
gByte, err := os.ReadFile(fmt.Sprintf("%v/%v.yaml", filepath.ConfigPath, filepath.ConfigName))
if err != nil {
panic(err)
}
err = yaml.Unmarshal(gByte, &Config) // 将读取的配置映射到 Config 结构体中
if err != nil {
return fmt.Errorf("failed to unmarshal config file: %s", err)
}
return nil
}

@ -0,0 +1,54 @@
package ckey
import "fmt"
const (
ProjectPrefix = "joybuywork:" //项目前缀
RedisTableFormat = ProjectPrefix + "redis_table:%s" //redis_table组件缓存format
TaskPrefix = ProjectPrefix + "task:"
CronPrefix = ProjectPrefix + "cron:"
User = ProjectPrefix + "user:" //用户模块前缀
Project = ProjectPrefix + "project:" //项目模块前缀
Company = ProjectPrefix + "company:" //企业模块前缀
Fission = ProjectPrefix + "fission:" //玩法模块前缀
Export = ProjectPrefix + "export:" // 导出任务
SubLock = ProjectPrefix + "sublock:" // 关注锁
DataCache = ProjectPrefix + "data_cache:" // 临时数据缓存
Delay = ProjectPrefix + "delay:" // 延时对列
Mall = ProjectPrefix + "mall:" //兑换商城模块前缀
ProjectUser = ProjectPrefix + "project_user:" //项目用户模块前缀
Game = ProjectPrefix + "game:" //游戏模块前缀
)
// ForLock 用来做临时锁
func ForLock(key string) string {
return key + ":for_lock"
}
// RedisTableKey redis_table组件hash key名称
func RedisTableKey(key string) string {
return fmt.Sprintf(RedisTableFormat, key)
}
// ExportKey 导出的缓存key
func ExportKey(hashMark string) string {
return fmt.Sprintf("%s%s", Export, hashMark)
}
func SubLockCommon() string {
return fmt.Sprintf("%scommon", SubLock)
}

@ -0,0 +1,17 @@
package ckey
import "fmt"
func CompanyKey(format string, a ...any) string {
return Company + fmt.Sprintf(format, a...)
}
// CompanyMade 企业
func CompanyMade(companyId int64, mark string) string {
return CompanyKey("made:%d_%s", companyId, mark)
}
// CompanyMadeStoreOnce 自定义组件创建标识
func CompanyMadeStoreOnce(companyId int64, mark string) string {
return CompanyKey("made_store_once:%d_%s", companyId, mark)
}

@ -0,0 +1,115 @@
package ckey
import "fmt"
func cronKey(format string, a ...any) string {
return CronPrefix + fmt.Sprintf(format, a...)
}
// CronCampaignStart 活动开启
func CronCampaignStart() string {
return cronKey("campaign_start")
}
// CronCampaignEnd 活动结束
func CronCampaignEnd() string {
return cronKey("campaign_end")
}
// CronCampaignRewardAdd 活动奖品追加库存
func CronCampaignRewardAdd() string {
return cronKey("campaign_reward_add")
}
// CronCampaignQuizOpen 有奖竞猜开奖
func CronCampaignQuizOpen() string {
return cronKey("campaign_quiz_open")
}
// CronCampaignCompensateReward 活动奖品补偿
func CronCampaignCompensateReward() string {
return cronKey("campaign_compensate_reward")
}
// CronNotifyReward 玩法奖品回调
func CronNotifyReward() string {
return cronKey("notify_reward")
}
// CronGlobalRewardPushNotify 全局奖品回调
func CronGlobalRewardPushNotify() string {
return cronKey("global_reward_push_notify")
}
// CronPushNotify 玩法奖品回调
func CronPushNotify() string {
return cronKey("push_notify")
}
// CronStatHour 活动小时统计
func CronStatHour() string {
return cronKey("stat_hour")
}
// CronStatDay 活动天统计
func CronStatDay() string {
return cronKey("stat_day")
}
// CronCondHour 活条件小时统计
func CronCondHour() string {
return cronKey("cond_hour")
}
// CronCondDay 活动条件天统计
func CronCondDay() string {
return cronKey("cond_day")
}
// CronAdsDay 广告活动天统计
func CronAdsDay() string {
return cronKey("ads_day")
}
// CronAdsHour 广告活动小时统计
func CronAdsHour() string {
return cronKey("ads_hour")
}
// CronCampaignPreToTun 预发布转正式发布
func CronCampaignPreToTun() string {
return cronKey("campaign_pre_to_run")
}
// CronCampaignCancelReward 活动任务过期奖杯要取消
func CronCampaignCancelReward() string {
return cronKey("campaign_cancel_reward")
}
// CronCampaignCoinScene 活动金币池场次追加
func CronCampaignCoinScene() string {
return cronKey("campaign_coin_scene")
}
// CronCampaignCoinSceneSettlement 活动金币池场次结算
func CronCampaignCoinSceneSettlement() string {
return cronKey("campaign_coin_scene_settlement")
}
// CronErrLog 清理错误日志
func CronErrLog() string {
return cronKey("err_log")
}
// CronSlowLog 清理慢业务日志
func CronSlowLog() string {
return cronKey("slow_log")
}
func CronMallItemTask() string {
return cronKey("mall_item_task")
}
func CronProjectUserCoinExpiredTask() string {
return cronKey("project_user_coin_expired_task")
}

@ -0,0 +1,14 @@
package ckey
import "fmt"
func dataCacheKey(format string, a ...any) string {
return DataCache + fmt.Sprintf(format, a...)
}
func DataUserAppReward(cpnId int64, mark string) string {
if mark == "" {
return dataCacheKey("data_user_app_reward_%d", cpnId)
}
return dataCacheKey("data_user_app_reward_%d:%s", cpnId, mark)
}

@ -0,0 +1,11 @@
package ckey
import "fmt"
func delayKey(format string, a ...any) string {
return Delay + fmt.Sprintf(format, a...)
}
func DelayCommonKey() string {
return delayKey("common")
}

@ -0,0 +1,615 @@
package ckey
import "fmt"
func fissionKey(format string, a ...any) string {
return Fission + fmt.Sprintf(format, a...)
}
// FissionTempGroupStoreOnce 保证mark同时创建一个
func FissionTempGroupStoreOnce(mark string) string {
return fissionKey("temp_group_store_once:%s", mark)
}
// FissionUserStoreOnce 保证一个用户ID同时创建一个
func FissionUserStoreOnce(campaignId int64, subUserId string) string {
return fissionKey("user_store_once:%d_%s", campaignId, subUserId)
}
// FissionUserPlayOnce 保证一个只能有一个用户访问玩家接口
func FissionUserPlayOnce(userId int64) string {
return fissionKey("user_play_once:%d", userId)
}
// FissionUserStoreDeviceOnce 保证一个deviceID同时创建一个
func FissionUserStoreDeviceOnce(campaignId int64, deviceId string) string {
return fissionKey("user_store_device_once:%d_%s", campaignId, deviceId)
}
// FissionCampaignRewardLimitPool 活动总领奖限制池
func FissionCampaignRewardLimitPool(campaignId int64) string {
return fissionKey("campaign_reward_limit_pool:%d", campaignId)
}
// FissionCampaignPool 活动总领奖限制池(新)
func FissionCampaignPool(campaignId int64) string {
return fissionKey("campaign_pool:%d", campaignId)
}
// FissionCampaignRewardPool 活动奖品池
func FissionCampaignRewardPool(rewardId int64) string {
return fissionKey("campaign_reward_pool:%d", rewardId)
}
// FissionCampaignPreRewardPool 活动预发放奖品池
func FissionCampaignPreRewardPool(rewardId int64) string {
return fissionKey("campaign_reward_pre_pool:%d", rewardId)
}
// FissionUserLotteryOnce 参与用户抽奖只能有一个在抽
func FissionUserLotteryOnce(userId int64) string {
return fissionKey("user_lottery_once:%d", userId)
}
// FissionUserAnswerOnce 参与用户答题只能有一个在答
func FissionUserAnswerOnce(userId int64) string {
return fissionKey("user_answer_once:%d", userId)
}
// FissionUserVoteOnce 参与用户投票只能有一个在投
func FissionUserVoteOnce(userId int64) string {
return fissionKey("user_vote_once:%d", userId)
}
// FissionUserInviteStat 参与用户邀请统计
func FissionUserInviteStat(userId int64) string {
return fissionKey("user_invite_stat:%d", userId)
}
// FissionUserTaskValidStat 参与用户任务有效统计
func FissionUserTaskValidStat(userId, taskId int64) string {
return fissionKey("user_task_valid_stat:%d_%d", userId, taskId)
}
// FissionStatOtherRecord 缓存活动中的用户其他行为记录
func FissionStatOtherRecord(cpnId int64, mark string) string {
return fissionKey("stat_other_record:%d_%s", cpnId, mark)
}
// FissionStatOther 缓存活动中的用户其他行为
func FissionStatOther(cpnId int64) string {
return fissionKey("stat_other:%d", cpnId)
}
// FissionParentInviteOnce 上级用户邀请成功要锁住,保证后面的操作串行
func FissionParentInviteOnce(userId int64) string {
return fissionKey("parent_invite_once:%d", userId)
}
// FissionUserWebRewardOnce 用户站外奖品领取锁
func FissionUserWebRewardOnce(webId string) string {
return fissionKey("user_web_reward_once:%s", webId)
}
// FissionWebLastChannel 站外用户最后访问的站外渠道key
func FissionWebLastChannel(campaignId int64, webId string) string {
return fissionKey("web_last_channel:%d_%s", campaignId, webId)
}
// FissionAcceptRewardOnce 防止并发领取窗口奖品
func FissionAcceptRewardOnce(campaignId int64, rewardHashId string) string {
return fissionKey("accept_reward_once:%d_%s", campaignId, rewardHashId)
}
// FissionWinNewcomerOnce 一起赢奖励用户新人奖并发锁
func FissionWinNewcomerOnce(userId int64) string {
return fissionKey("win_newcomer_once:%d", userId)
}
// FissionCustomEffectiveOnce 自定义事件有效计算锁
func FissionCustomEffectiveOnce(userId int64) string {
return fissionKey("customer_effective_once:%d", userId)
}
// FissionRegisterOnce 一个活动只允许一次注册
func FissionRegisterOnce(userId int64) string {
return fissionKey("register_once:%d", userId)
}
// FissionEventEffectiveOnce 一个活动只允许一次事件触发
func FissionEventEffectiveOnce(userId int64) string {
return fissionKey("event_effective_once:%d", userId)
}
// FissionBehaviorTotalCreateOnce 行为活动统计只有能同时创建一个
func FissionBehaviorTotalCreateOnce(campaignId int64, mark string) string {
return fissionKey("behavior_total_create_once:%d_%s", campaignId, mark)
}
// FissionUserTargetNum 活动用户达标次数
func FissionUserTargetNum(userId int64) string {
return fissionKey("user_target_num:%d", userId)
}
// FissionUserCondFirst 用户第一次触发条件
func FissionUserCondFirst(userId, condId int64) string {
return fissionKey("user_cond_first:%d_%d", userId, condId)
}
// FissionUserFirstBehavior 活动用户第一次行为
func FissionUserFirstBehavior(cpnId int64, userMark, mark string) string {
return fissionKey("user_first_behavior:%d_%s_%s", cpnId, userMark, mark)
}
// FissionBehaviorTotalCycleHour 行为小时实时次数
func FissionBehaviorTotalCycleHour(cpnId int64, hour string) string {
return fissionKey("behavior_total_cycle_hour:%d_%s", cpnId, hour)
}
// FissionBehaviorTotalCycleHourUser 行为小时实时人数
func FissionBehaviorTotalCycleHourUser(cpnId int64, hour, mark string) string {
return fissionKey("behavior_total_cycle_hour_user:%d_%s_%s", cpnId, hour, mark)
}
// FissionBehaviorTotalCycleDay 行为天实时次数
func FissionBehaviorTotalCycleDay(cpnId int64, day string) string {
return fissionKey("behavior_total_cycle_day:%d_%s", cpnId, day)
}
// FissionBehaviorTotalCycleDayUser 行为天实时人数
func FissionBehaviorTotalCycleDayUser(cpnId int64, day, mark string) string {
return fissionKey("behavior_total_cycle_day_user:%d_%s_%s", cpnId, day, mark)
}
// FissionRewardResendOnce 防止并发请求重发奖品
func FissionRewardResendOnce(hashId string) string {
return fissionKey("reward_resend_once:%s", hashId)
}
// FissionConfigOnce 防止并发创建玩法配置
func FissionConfigOnce(projectId int64) string {
return fissionKey("config_once:%d", projectId)
}
// FissionUserDyLinkOnce 防止并发创建动态链接
func FissionUserDyLinkOnce(userId int64, mark string) string {
return fissionKey("user_dy_link_one:%d_%s", userId, mark)
}
// FissionUserSignOnce 活动用户签到锁
func FissionUserSignOnce(userId int64) string {
return fissionKey("campaign_sign_once:%d", userId)
}
// FissionCampaignSignState 活动用户签到状态
func FissionCampaignSignState(campaignId int64, date string) string {
return fissionKey("campaign_sign_state:%d_%s", campaignId, date)
}
// FissionDiceOnce 大富翁骰骰子锁
func FissionDiceOnce(userId int64) string {
return fissionKey("dice_once:%d", userId)
}
// FissionGrowGetOnce 用户领取成长生命体锁
func FissionGrowGetOnce(userId int64) string {
return fissionKey("grow_get_once:%d", userId)
}
// FissionGrowFeedOnce 用户喂养成长生命体锁
func FissionGrowFeedOnce(userId int64) string {
return fissionKey("grow_feed_once:%d", userId)
}
// FissionGrowGetFeedOnce 用户获取喂养道具锁
func FissionGrowGetFeedOnce(userId int64, mark string) string {
return fissionKey("grow_get_feed_once:%d_%s", userId, mark)
}
// FissionUserContentLinkStoreOnce 创建内容链接锁
func FissionUserContentLinkStoreOnce(userId, markId int64, mark string) string {
return fissionKey("user_content_link_store_once:%d_%d_%s", userId, markId, mark)
}
// FissionChopHelpUserReward 砍一刀奖品助力人次
func FissionChopHelpUserReward(chopRewardId int64) string {
return fissionKey("chop_help_user_reward:%d", chopRewardId)
}
// FissionChopHelpUser 砍一刀助力人次
func FissionChopHelpUser(uniqMark any) string {
return fissionKey("chop_help_user:%v", uniqMark)
}
// FissionChopHelpOnce 砍一刀奖品助力锁
func FissionChopHelpOnce(chopRewardId int64) string {
return fissionKey("chop_help_once:%d", chopRewardId)
}
// FissionChopHelpPercent 砍一刀奖品助力进度
func FissionChopHelpPercent(chopRewardId int64) string {
return fissionKey("chop_help_percent:%d", chopRewardId)
}
// FissionChopHelpMarkPercent 砍一刀奖品标识助力进度
func FissionChopHelpMarkPercent(chopRewardId int64, mark string) string {
return fissionKey("chop_help_percent:%d_%s", chopRewardId, mark)
}
// FissionCampaignLangSaveOnce 活动玩法语言保存锁
func FissionCampaignLangSaveOnce(cpnHashId, mark string) string {
return fissionKey("campaign_lang_save_once:%s_%s", cpnHashId, mark)
}
// FissionUserLevelOperateOnce 用户等级操作锁
func FissionUserLevelOperateOnce(projectId int64, mark string) string {
return fissionKey("user_level_operate_once:%d_%s", projectId, mark)
}
// FissionCampaignRewardUseStock 活动奖品已使用的库存
func FissionCampaignRewardUseStock(rewardId int64) string {
return fissionKey("campaign_reward_use_stock:%d", rewardId)
}
// FissionCampaignRewardPreUseStock 活动奖品预使用的库存
func FissionCampaignRewardPreUseStock(rewardId int64) string {
return fissionKey("campaign_reward_pre_use_stock:%d", rewardId)
}
// FissionCampaignRewardStock 活动奖品已使用的库存
func FissionCampaignRewardStock(rewardId int64) string {
return fissionKey("campaign_reward_stock:%d", rewardId)
}
// FissionCampaignRewardSelectStock 活动奖品选择的库存
func FissionCampaignRewardSelectStock(rewardId int64) string {
return fissionKey("campaign_reward_select_stock:%d", rewardId)
}
// FissionUserFinishStepOnce 用户完成现金抽奖阶段操作锁
func FissionUserFinishStepOnce(userId int64) string {
return fissionKey("user_finish_step_once:%d_%s", userId)
}
// FissionUserSpinOnce 用户现金抽奖玩法抽奖操作锁
func FissionUserSpinOnce(userId int64) string {
return fissionKey("user_spin_once:%d_%s", userId)
}
// FissionUserCashPercent 用户现金抽奖玩法抽奖进度数据
func FissionUserCashPercent(cashId int64) string {
return fissionKey("user_cash_percent:%d", cashId)
}
// FissionUserCashAgain 用户再次玩游戏
func FissionUserCashAgain(userId int64) string {
return fissionKey("user_cash_again:%d", userId)
}
// FissionAdsHourStat 广告小时归档统计锁
func FissionAdsHourStat(cpnId int64, hourStr string) string {
return fissionKey("ads_hour_stat:%d_%s", cpnId, hourStr)
}
// FissionAdsDayStat 广告天归档统计锁
func FissionAdsDayStat(cpnId int64, dayStr string) string {
return fissionKey("ads_day_stat:%d_%s", cpnId, dayStr)
}
// FissionUserMixReward 参与用户合成奖品锁
func FissionUserMixReward(userId int64) string {
return fissionKey("user_mix_reward:%d", userId)
}
// FissionUserTaskDayLimit 用户每日任务限制
func FissionUserTaskDayLimit(day string, userId, taskId int64) string {
return fissionKey("user_task_day_limit:%s_%d_%d", day, userId, taskId)
}
// FissionUserTaskCpnLimit 任务活动周期内限制
func FissionUserTaskCpnLimit(userId, taskId int64) string {
return fissionKey("user_task_cpn_limit:%d_%d", userId, taskId)
}
// FissionUserCondDayLimit 用户每日任务限制
func FissionUserCondDayLimit(day string, userId, condId int64) string {
return fissionKey("user_cond_day_limit:%s_%d_%d", day, userId, condId)
}
// FissionUserCondCpnLimit 任务活动周期内限制
func FissionUserCondCpnLimit(userId, condId int64) string {
return fissionKey("user_cond_cpn_limit:%d_%d", userId, condId)
}
// FissionDefaultAppChannel 活动默认站内渠道缓存
func FissionDefaultAppChannel(cpnId int64) string {
return fissionKey("default_app_channel:%d", cpnId)
}
// FissionUserAdsOnce 活动默认站内渠道缓存
func FissionUserAdsOnce(token string) string {
return fissionKey("default_app_channel:%s", token)
}
// FissionChanceNotify 中奖次数获得通知
func FissionChanceNotify(userId int64) string {
return fissionKey("chance_notify:%d", userId)
}
// FissionNewcomerRewardNotify 新人奖品通知
func FissionNewcomerRewardNotify(userId int64) string {
return fissionKey("newcomer_reward_notify:%d", userId)
}
// FissionUserWeekLimit 用户每周任务限制
func FissionUserWeekLimit(start, userId, taskId int64) string {
return fissionKey("user_task_week_limit:%d_%d_%d", start, userId, taskId)
}
// FissionUserCondWeekLimit 用户每周任务限制
func FissionUserCondWeekLimit(start, userId, condId int64) string {
return fissionKey("user_cond_week_limit:%d_%d_%d", start, userId, condId)
}
// FissionUserRunCreateOnce 用户绑定地图锁
func FissionUserRunCreateOnce(userId int64) string {
return fissionKey("user_run_create_once:%d", userId)
}
// FissionUserUniqMark 触发事件用户唯一标识
func FissionUserUniqMark(campaignId int64, userMark string) string {
return fissionKey("user_uniq_mark:%d_%s", campaignId, userMark)
}
// FissionUserIovdMark 用户的iovd标识
func FissionUserIovdMark(userId int64) string {
return fissionKey("user_iovd_mark:%d", userId)
}
// FissionProjectUserUniq 项目用户处理锁
func FissionProjectUserUniq(projectId int64, userId string) string {
return fissionKey("project_user_uniq:%d_%s", projectId, userId)
}
// FissionHelpPercentAdd 助力进度追加关键字
func FissionHelpPercentAdd(userId int64) string {
return fissionKey("help_percent_add:%d", userId)
}
// FissionUserGetRewardNum 用户获得奖品的数量
func FissionUserGetRewardNum(userId int64) string {
return fissionKey("user_get_reward_num:%d", userId)
}
// FissionRewardLimitUpVer 奖品限制
func FissionRewardLimitUpVer(cpnId int64) string {
return fissionKey("reward_limit_up_ver:%d", cpnId)
}
// FissionUserHelpFailMark 用户助力失败原因
func FissionUserHelpFailMark(cpnId int64) string {
return fissionKey("user_help_fail_mark:%d", cpnId)
}
// FissionUserPropFeedNum 获得道具任务已经喂养的次数
func FissionUserPropFeedNum(keepId int64) string {
return fissionKey("user_prop_feed_num:%d", keepId)
}
// FissionUserDayFirstInvite 用户是否是当天首次邀请
func FissionUserDayFirstInvite(userId int64) string {
return fissionKey("user_day_first_invite:%d", userId)
}
// FissionUserKeepDoingOnce 激励养成正在进行一些操作d
func FissionUserKeepDoingOnce(userId int64) string {
return fissionKey("user_keep_doing_once:%d", userId)
}
// FissionUserDayFirstInviteUser 用户当天邀请的第一个用户
func FissionUserDayFirstInviteUser(day string, userId int64) string {
return fissionKey("user_day_first_invite_user:%s_%d", day, userId)
}
// FissionUserDayFirstFeed 用户当天邀请的第一个用户
func FissionUserDayFirstFeed(day string, userId int64) string {
return fissionKey("user_day_first_feed:%s_%d", day, userId)
}
// FissionUserCreatePlayerOnce 用户创建一个玩家数据
func FissionUserCreatePlayerOnce(userId int64) string {
return fissionKey("user_create_player_once:%d", userId)
}
// FissionUserKeepGetMachineLast 用户最后一次获取机器狗粮的时间
func FissionUserKeepGetMachineLast(keepId int64) string {
return fissionKey("user_keep_get_machine_last:%d", keepId)
}
// FissionUserKeepMachineSave 保存狗粮机的狗粮锁
func FissionUserKeepMachineSave(keepId int64) string {
return fissionKey("user_keep_machine_save:%d", keepId)
}
// FissionUserKeepMachineNotSave 收狗粮机之后不保存狗粮的时间
func FissionUserKeepMachineNotSave(keepId int64) string {
return fissionKey("user_keep_machine_not_save:%d", keepId)
}
// FissionUserKeepInviteDogFoodLimit 邀请人获得的狗粮数
func FissionUserKeepInviteDogFoodLimit(userId int64) string {
return fissionKey("user_invite_dog_food_limit:%d", userId)
}
// FissionUserTaskPreCond 用户完成的前置任务标识
func FissionUserTaskPreCond(userId int64) string {
return fissionKey("user_task_pre_cond:%d", userId)
}
// FissionKeepRewardSelectedUser 养狗奖品选择人数统计
func FissionKeepRewardSelectedUser(cpnId int64) string {
return fissionKey("keep_reward_selected_user:%d", cpnId)
}
// FissionPushUserGroup 推送缓存组
func FissionPushUserGroup(cpnId int64, mark string, group int) string {
return fissionKey("push_user:%d_%s_%d", cpnId, mark, group)
}
// FissionChildRank 子活动排行榜
func FissionChildRank(cpnId int64) string {
return fissionKey("child_rank:%d", cpnId)
}
// FissionStatActiveOnce 记录活跃请求处理
func FissionStatActiveOnce(userId int64) string {
return fissionKey("stat_active_once:%d", userId)
}
// FissionPlayerSetInitOnce 活动玩家设置初始次数锁
func FissionPlayerSetInitOnce(userId int64) string {
return fissionKey("player_set_init:%d", userId)
}
// FissionKeepMachineDayLimit 养狗狗粮机每日上限
func FissionKeepMachineDayLimit(day string, userId int64) string {
return fissionKey("keep_machine_day_limit:%s_%d", day, userId)
}
// FissionClueMapData 通知hash数据
func FissionClueMapData(userId int64) string {
return fissionKey("clue_map_data:%d", userId)
}
// FissionPushLimit push通知限制
func FissionPushLimit(projectId int64, mark, subUserId string) string {
return fissionKey("push_limit:%d_%s_%s", projectId, mark, subUserId)
}
// FissionUserKeepOfflineGetNum 用户离线
func FissionUserKeepOfflineGetNum(day string, userId int64) string {
return fissionKey("user_keep_offline_get_num:%s_%d", day, userId)
}
// FissionCoinSceneData 用户每场投放的数据
func FissionCoinSceneData(sceneId int64) string {
return fissionKey("coin_scene_total:%d", sceneId)
}
// FissionCoinLack 用户s2s请求扣除返回不足状态key
func FissionCoinLack(userId int64) string {
return fissionKey("coin_lack:%d", userId)
}
// FissionCoinChangeLock 金币池金币修改锁
func FissionCoinChangeLock(userId int64) string {
return fissionKey("coin_change_lock:%d", userId)
}
// FissionSignData 签到玩家数据
func FissionSignData(signId int64) string {
return fissionKey("sign_data:%d", signId)
}
// FissionReceiveRewardLock 任务领奖锁
func FissionReceiveRewardLock(userId, taskId int64) string {
return fissionKey("receive_reward_lock:%d_%d", userId, taskId)
}
// FissionUserAttrCreateOnce 任务用户属性统计锁
func FissionUserAttrCreateOnce(cpnId int64, attr, val string) string {
return fissionKey("user_attr_create:%d_%s_%s", cpnId, attr, val)
}
// FissionUserQaSelect 用户题目选择数据
func FissionUserQaSelect(userId int64) string {
return fissionKey("user_qa_select:%d", userId)
}
// FissionUserCreateRewardCollect 创建奖品碎片收集数据
func FissionUserCreateRewardCollect(userId, rewardId int64) string {
return fissionKey("user_create_reward_collect:%d_%d", userId, rewardId)
}
// FissionUserCreateDicePropOnce 创建大富翁道具
func FissionUserCreateDicePropOnce(userId int64, mark string) string {
return fissionKey("user_create_dice_prop:%d_%s", userId, mark)
}
// FissionRewardPushTaskOnce 回调任务锁
func FissionRewardPushTaskOnce(notifyId int64) string {
return fissionKey("reward_push_task_once:%d", notifyId)
}
// FissionPushRewardOnce 防止并发领取窗口奖品
func FissionPushRewardOnce(source string, sourceId, sourceSecondId, relateId int64) string {
return fissionKey("push_reward_once:%s_%d_%d_%d", source, sourceId, sourceSecondId, relateId)
}
// FissionRewardPushOpenOnce 任务推送
func FissionRewardPushOpenOnce(campaignId int64, mark string) string {
return fissionKey("reward_push_task_once:%d_%s", campaignId, mark)
}
// FissionLvApiCache lv请求缓存
func FissionLvApiCache(projectId int64, subUserId string) string {
return fissionKey("lv_api_cache:%d_%s", projectId, subUserId)
}
// FissionPointsUseDayNum 积分每日使用次数
func FissionPointsUseDayNum(userId int64, day string) string {
return fissionKey("points_use_day_num:%d_%s", userId, day)
}
// FissionPointsUseNum 积分使用次数
func FissionPointsUseNum(userId int64) string {
return fissionKey("points_use_num:%d", userId)
}
// FissionChatDayTotal 聊天日统计
func FissionChatDayTotal(userId int64, day string) string {
return fissionKey("chat_day_total:%d_%s", userId, day)
}
func FissionVoteAcceptOnce(userId int64) string {
return fissionKey("vote_accept_once:%d", userId)
}
// FissionUserUnoRandCardOnce Uno抽卡只能有一次
func FissionUserUnoRandCardOnce(userId int64) string {
return fissionKey("user_uno_rand_card_once:%d", userId)
}
// FissionUserUnoClaimOnce Uno收集卡只能有一次
func FissionUserUnoClaimOnce(userId int64) string {
return fissionKey("user_uno_claim_once:%d", userId)
}
// FissionUserUnoCollectOnce Uno收集创建只能有一次
func FissionUserUnoCollectOnce(userId int64) string {
return fissionKey("user_uno_collect_once:%d", userId)
}
// FissionUserEventFirstVisit 用户首次访问活动事件
func FissionUserEventFirstVisit(userId int64) string {
return fissionKey("user_event_first_visit:%d", userId)
}
// FissionUserExchangeOnce 交换只能有一次
func FissionUserExchangeOnce(userId int64) string {
return fissionKey("user_exchange_once:%d", userId)
}
// FissionUserTaskTip 任务奖励提示
func FissionUserTaskTip(userId int64) string {
return fissionKey("user_task_tip:%d", userId)
}
func FissionUserRewards(userId int64) string {
return fissionKey("user_reward:%d", userId)
}
// FissionUserUnlockReward 用户解锁奖励
func FissionUserUnlockReward(userId, rewardId int64) string {
return fissionKey("user_unlock_reward:%d_%d", userId, rewardId)
}

@ -0,0 +1,37 @@
package ckey
import "fmt"
func gameKey(format string, a ...any) string {
return Game + fmt.Sprintf(format, a...)
}
// GameLinkInit 初始化游戏默认链接
func GameLinkInit(projectId, gameId int64) string {
return gameKey("link_init:%d_%d", projectId, gameId)
}
// GameTotalCreateOnce 行为统计只有能同时创建一个
func GameTotalCreateOnce(projectId, gameId, linkId int64) string {
return gameKey("total_create_once:%d_%d_%d", projectId, gameId, linkId)
}
// GameTotalCreateOnceDate 行为统计只有能同时创建一个
func GameTotalCreateOnceDate(projectId, gameId, linkId int64, date string) string {
return gameKey("total_create_once_date:%d_%d_%d_%s", projectId, gameId, linkId, date)
}
// GameActionFirst 行为统计只有能同时创建一个
func GameActionFirst(projectId, gameId, linkId, userId int64, t int32) string {
return gameKey("action_first:%d_%d_%d_%d_%d", projectId, gameId, linkId, userId, t)
}
// GameActionFirstDate 行为统计只有能同时创建一个
func GameActionFirstDate(projectId, gameId, linkId, userId int64, t int32, date string) string {
return gameKey("action_first_date:%d_%d_%d_%d_%d_%s", projectId, gameId, linkId, userId, t, date)
}
// GameActionStayId 行为统计只有能同时创建一个
func GameActionStayId(userId, linkId int64) string {
return gameKey("action_stay_id:%d_%d", userId, linkId)
}

@ -0,0 +1,15 @@
package ckey
import "fmt"
func mallKey(format string, a ...any) string {
return Mall + fmt.Sprintf(format, a...)
}
func MallItemStock(mallItemId int64) string {
return mallKey("item_stock:%d", mallItemId)
}
func MallItemExchanging(projectUserId int64) string {
return mallKey("item_exchanging:%d", projectUserId)
}

@ -0,0 +1,32 @@
package ckey
import "fmt"
func projectKey(format string, a ...any) string {
return Project + fmt.Sprintf(format, a...)
}
// ProjectDomainBucket 域名桶
func ProjectDomainBucket() string {
return projectKey("domain_bucket")
}
// ProjectStoreOnce 保证项目创建的时候,域名不被其他企业使用
func ProjectStoreOnce(domain string) string {
return projectKey("store_once:%s", domain)
}
// ProjectSecretOnce 保证项目创建私钥的时候没有并发创建
func ProjectSecretOnce(projectId int64) string {
return projectKey("secret_once:%d", projectId)
}
// ProjectAdsOnce 保证项目创建广告配置的时候没有并发创建
func ProjectAdsOnce(projectHashId string) string {
return projectKey("ads_once:%s", projectHashId)
}
// ProjectCoinCreateOnce 项目积分配置并发处理锁
func ProjectCoinCreateOnce(projectHashId string) string {
return projectKey("coin_once:%s", projectHashId)
}

@ -0,0 +1,22 @@
package ckey
import "fmt"
func projectUserKey(format string, a ...any) string {
return ProjectUser + fmt.Sprintf(format, a...)
}
// ProjectUserCreate 项目用户创建锁
func ProjectUserCreate(projectId int64, appUserId string) string {
return projectUserKey("project_user_create:%d_%s", projectId, appUserId)
}
// ProjectUserCoinNum 项目用户金币
func ProjectUserCoinNum(userId int64) string {
return projectUserKey("coin_num:%d", userId)
}
// ProjectUserCoinLack 项目用户金币api返回不足
func ProjectUserCoinLack(projectId int64, appUserId string) string {
return projectUserKey("project_user_coin_lack:%d_%s", projectId, appUserId)
}

@ -0,0 +1,22 @@
package ckey
import "fmt"
func taskKey(format string, a ...any) string {
return TaskPrefix + fmt.Sprintf(format, a...)
}
// ValidEventsKey 有效事件任务
func ValidEventsKey(userId int64) string {
return taskKey("valid_events:%d", userId)
}
// ValidEventsUserMarkKey 有效事件任务
func ValidEventsUserMarkKey(userMark string) string {
return taskKey("valid_events_user_mark:%s", userMark)
}
// ProjectUserCoinDeduct 项目用户积分扣除
func ProjectUserCoinDeduct(userId int64) string {
return taskKey("project_user_coin_deduct:%d", userId)
}

@ -0,0 +1,12 @@
package ckey
import "fmt"
func userKey(format string, a ...any) string {
return User + fmt.Sprintf(format, a...)
}
// UserStoreOnce 一个账号并发创建锁
func UserStoreOnce(username string) string {
return userKey("store_once:%s", username)
}

@ -0,0 +1,114 @@
package consts
import (
"time"
)
const (
ServiceName = "joybuywork"
TraceIdKey = "trace_id"
XLangKey = "X-Lang"
DebugKey = "__debug__"
)
const (
CtxLangKey = "__ctx_lang__" // 语言ctx key
CtxTimezoneKey = "__ctx_timezone__" // 时区ctx key
CtxReqId = "rid" // 请求id
CtxBootId = "boot_id" // 脚本任务id
CtxMsgId = "mid" // 队列消息id
)
const (
AdminRoleName = "高级用户"
NormalRoleName = "普通用户"
)
const (
KB = 1 << 10 //1KB 字节
MB = 1 << 20 //1MB 字节
GB = 1 << 30 //1GB 字节
)
const (
Local = "local"
Dev = "dev"
Test = "test"
Prod = "prod"
)
const (
LuckyThinkText = "good luck" //谢谢参与文案
LuckyThinkImg = "https://i1.branchcn.com/resource/2023/06/08/ci0t5fki474ceqco5i0g.png" //谢谢参与logo图
)
const (
RandEnStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" //随机英文字符串
RandEnNumberStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" //随机英文数字字符串
)
const (
ChannelMarkLen = 2
ChannelDefaultName = "默认链接"
ChannelWebDefaultName = "活动自分享"
)
const (
TimeDay = time.Hour * 24
TimeWeek = TimeDay * 7
DaySec = 86400 // 一天的秒数字
)
// carbon 组件的format
const (
YmdH = "YmdH"
Ymd = "Ymd"
Ymd_ = "Y-m-d"
His = "His"
His_ = "H:i:s"
YmdHs = "Y/m/d H:i"
)
const (
JoinComma = "," // 逗号切割
)
const (
FissionRankTypeInstall = iota + 1 // 下载
FissionRankTypeRegister // 注册
FissionRankTypeFriendTarget // 好友达标
FissionRankTypeSelfTask // 自己完成任务
FissionRankTypeSign // 签到
FissionRankTypeGrow // 养成
)
const (
LangZhCn = "zh-cn"
LangEn = "en"
)
const Colon = ":"
const (
CampaignTz = "GMT"
CampaignTzOffset = 8
DefaultTz = -100 // 需要去活动的默认时区
)
const (
PlatformAndroid = "android" // 安卓
PlatformIOS = "ios" //ios
PlatformWeb = "web" //网页
PlatformIPad = "ipad" //Ipad
PlatformOther = "other" //其他
)
const (
TblPrefix = "__tbl-" // 一些特殊前缀
)
const (
HelpStatusNotInstall = "not_install" // 未完成安装
HelpStatusNotRegister = "not_register" // 未完成注册
HelpStatusNotTask = "not_task" // 未完成任务
)

@ -0,0 +1,67 @@
package consts
type CurrencyUnit struct {
Id int64 `json:"id"`
Unit string `json:"unit"`
}
const (
IdUSD = iota + 1
IdCNY
IdRUB
IdEUR
IdGBP
IdKRW
IdFR
IdTRY
IdTSAR
IdRs
IdTHB
)
var Currency = []CurrencyUnit{
{
Id: IdUSD,
Unit: "$",
},
{
Id: IdCNY,
Unit: "¥",
},
{
Id: IdRUB,
Unit: "₽",
},
{
Id: IdEUR,
Unit: "€",
},
{
Id: IdGBP,
Unit: "£",
},
{
Id: IdKRW,
Unit: "₩",
},
{
Id: IdFR,
Unit: "Fr",
},
{
Id: IdTRY,
Unit: "₤",
},
{
Id: IdTSAR,
Unit: "ر.س",
},
{
Id: IdRs,
Unit: "₨",
},
{
Id: IdTHB,
Unit: "฿",
},
}

@ -0,0 +1,747 @@
package consts
// fission表对应的数据,因为fission表是系统数据,所以把一些唯一性的数据直接用代码做对应表
const (
FissionTargetApp = iota + 1 // app下载/注册
FissionTargetConvert // 提升in-app
FissionTargetRetain // 留存
FissionTargetAds // 广告互动
FissionTargetChild // 子活动
)
const (
IdReferral = iota + 1 // 老带新
IdWinTogether // 一起赢奖励
IdBlindBox // 盲盒
IdPrizeWheel // 大转盘
IdSlotMachine // 老虎机
IdLuckyGrid // 九宫格
IdPrizeQuiz // 有奖竞猜 (非新报表)
IdPrizeAnswer // 趣味问答
IdSignIn // 签到
IdDice // 骰子大富翁
IdGrow // 快乐农场
IdQa // 智力大考验
IdQaAudio // 我爱记歌词
IdQaVideo // 视频闯关
IdBallot // 抽签
IdChop // 砍一刀
IdCash // 现金抽奖
IdAdsWheel // 广告转盘
IdAdsGrid // 广告九宫格
IdFlip // 翻牌
IdAdsFlip // 广告翻牌
IdKeep // 激励养成
IdGold // 金币任务
IdCoin // 瓜分金币池
IdVs // 赛事竞猜
IdUno // UNO卡牌
IdGashapon // 扭蛋机
)
const (
MarkReferral = "referral" //老带新
MarkWinTogether = "win_together" //一起赢奖励
MarkBlindBox = "blind_box" //盲盒
MarkPrizeWheel = "prize_wheel" //大转盘
MarkSlotMachine = "slot_machine" //老虎机
MarkLuckyGrid = "lucky_grid" //九宫格
MarkPrizeQuiz = "prize_quiz" //有奖竞猜
MarkPrizeAnswer = "prize_answer" //趣味问答
MarkSignIn = "sign_in" //签到
MarkDice = "dice" //骰子大富翁
MarkGrow = "grow" //快乐农场
MarkQa = "qa" //智力大考验
MarkQaAudio = "qa_audio" //我爱记歌词
MarkQaVideo = "qa_video" //视频闯关
MarkBallot = "ballot" //抽签
MarkChop = "chop" //砍一刀
MarkCash = "cash" //现金抽奖
MarkAdsWheel = "ads_wheel" //广告转盘
MarkAdsGrid = "ads_grid" //广告九宫格
MarkFlip = "flip" //翻牌
MarkAdsFlip = "ads_flip" //广告翻牌
MarkKeep = "keep" //激励养成
MarkGold = "gold" //金币任务
MarkCoin = "coin" //瓜分金币池
MarkVs = "vs" //赛事竞猜
MarkUno = "uno" //UNO卡牌
MarkGashapon = "gashapon" // 扭蛋机
)
type Fission struct {
Id int64 `json:"id"`
Mark string `json:"mark"`
Logo string `json:"logo"`
Color []string `json:"color"`
CanUse bool `json:"can_use"`
ConvertLogo string `json:"convert_logo"`
RetainLogo string `json:"retain_logo"`
PushLogo string `json:"push_logo"`
PushConvertLogo string `json:"push_convert_logo"`
PushRetainLogo string `json:"push_retain_logo"`
}
var FissionIdMap = map[int64]string{
IdReferral: MarkReferral,
IdWinTogether: MarkWinTogether,
IdBlindBox: MarkBlindBox,
IdPrizeWheel: MarkPrizeWheel,
IdSlotMachine: MarkSlotMachine,
IdLuckyGrid: MarkLuckyGrid,
IdPrizeQuiz: MarkPrizeQuiz,
IdPrizeAnswer: MarkPrizeAnswer,
IdSignIn: MarkSignIn,
IdDice: MarkDice,
IdGrow: MarkGrow,
IdQa: MarkQa,
IdQaAudio: MarkQaAudio,
IdQaVideo: MarkQaVideo,
IdBallot: MarkBallot,
IdChop: MarkChop,
IdCash: MarkCash,
IdAdsWheel: MarkAdsWheel,
IdAdsGrid: MarkAdsGrid,
IdFlip: MarkFlip,
IdAdsFlip: MarkAdsFlip,
IdKeep: MarkKeep,
IdGold: MarkGold,
IdCoin: MarkCoin,
IdVs: MarkVs,
IdUno: MarkUno,
IdGashapon: MarkGashapon,
}
var FissionMarkMap = map[string]int64{
MarkReferral: IdReferral,
MarkWinTogether: IdWinTogether,
MarkBlindBox: IdBlindBox,
MarkPrizeWheel: IdPrizeWheel,
MarkSlotMachine: IdSlotMachine,
MarkLuckyGrid: IdLuckyGrid,
MarkPrizeQuiz: IdPrizeQuiz,
MarkPrizeAnswer: IdPrizeAnswer,
MarkSignIn: IdSignIn,
MarkDice: IdDice,
MarkGrow: IdGrow,
MarkQa: IdQa,
MarkQaAudio: IdQaAudio,
MarkQaVideo: IdQaVideo,
MarkBallot: IdBallot,
MarkChop: IdChop,
MarkCash: IdCash,
MarkAdsWheel: IdAdsWheel,
MarkAdsGrid: IdAdsGrid,
MarkFlip: IdFlip,
MarkAdsFlip: IdAdsFlip,
MarkKeep: IdKeep,
MarkGold: IdGold,
MarkCoin: IdCoin,
MarkVs: IdVs,
MarkUno: IdUno,
MarkGashapon: IdGashapon,
}
var FissionTitle = map[string]map[string]string{
LangZhCn: {
MarkReferral: "经典老带新",
MarkWinTogether: "一起赢奖励",
MarkBlindBox: "盲盒大拆箱",
MarkPrizeWheel: "轮盘争上游",
MarkSlotMachine: "幸运777",
MarkLuckyGrid: "九宫格解密",
MarkPrizeQuiz: "谁是冠军",
MarkPrizeAnswer: "趣味问答",
MarkSignIn: "每日签到",
MarkDice: "骰子大富翁",
MarkGrow: "快乐农场",
MarkQa: "最强大脑",
MarkQaAudio: "我爱记歌词",
MarkQaVideo: "视频解谜挑战",
MarkBallot: "幸运上上签",
MarkChop: "好友助力狂欢",
MarkCash: "现金大抽奖",
MarkAdsWheel: "转盘抽奖",
MarkAdsGrid: "九宫格抽奖",
MarkFlip: "幸运翻牌",
MarkAdsFlip: "幸运翻牌",
MarkKeep: "激励养成",
MarkGold: "金币任务",
MarkCoin: "金币大派送",
MarkVs: "赛事竞猜",
MarkUno: "UNO卡牌",
MarkGashapon: "扭蛋机",
},
LangEn: {
MarkReferral: "Referral Program",
MarkWinTogether: "Win Together",
MarkBlindBox: "Mystery Box",
MarkPrizeWheel: "Wheel of Fortune",
MarkSlotMachine: "Jackpot",
MarkLuckyGrid: "Lucky Grid",
MarkPrizeQuiz: "Who is Winner",
MarkPrizeAnswer: "Timed Quiz",
MarkSignIn: "Daily check-in",
MarkDice: "Monopoly",
MarkGrow: "Farm Paradise",
MarkQa: "Brain Teaser Quiz Contest",
MarkQaAudio: "Voice Quiz Challenge",
MarkQaVideo: "Video Puzzle Challenge",
MarkBallot: "Lucky Draw Texts Event",
MarkChop: "Friend Boost Fiesta",
MarkCash: "Cash Draw",
MarkAdsWheel: "Ads Wheel",
MarkAdsGrid: "Ads Gird",
MarkFlip: "Lucky Card",
MarkAdsFlip: "Lucky Card",
MarkKeep: "Incentivize",
MarkGold: "Gold Coin Mission",
MarkCoin: "Gold Coins Giveaway",
MarkVs: "Win Forecast",
MarkUno: "UNO Card Game",
MarkGashapon: "Gashapon",
},
}
var FissionDesc = map[string]map[string][]string{
LangZhCn: {
MarkReferral: []string{"老用户人拉人,免费“自来水”", "“病毒”传播,无限裂变新流量"},
MarkWinTogether: []string{"老用户邀请新用户,新老用户皆得奖励"},
MarkBlindBox: []string{"无需开发,快速上线盲盒活动"},
MarkPrizeWheel: []string{"随时随地创建抽奖活动,增长没有天花板"},
MarkSlotMachine: []string{"让用户沉迷的老虎机小游戏"},
MarkLuckyGrid: []string{"完成任务集碎片,趣味无穷赢奖励"},
MarkPrizeQuiz: []string{"热点话题不错过,快速生成打榜竞猜"},
MarkPrizeAnswer: []string{"更多互动,紧张刺激的限时问答活动"},
MarkSignIn: []string{"加入签到挑战,赢取精彩奖品"},
MarkDice: []string{"摇动骰子,穿越大富翁地图,赢取丰厚奖励!"},
MarkGrow: []string{"养狗、种树,与好友们一起分享农场的欢乐与成就"},
MarkQa: []string{"智力问答,挑战巅峰!"},
MarkQaAudio: []string{"听音答题,赢取丰厚奖励"},
MarkQaVideo: []string{"解谜挑战,奖励等你拿!"},
MarkBallot: []string{"抽签赢好礼!参与幸运签文活动,有机会获得丰厚奖品!"},
MarkChop: []string{"邀好友助力下载App,赢免费礼物"},
MarkCash: []string{"现金抽奖,更好的吸引用户分享引流"},
MarkAdsWheel: []string{"互动转盘,用奖品更好的吸引用户下载"},
MarkAdsGrid: []string{"互动九宫格,用奖品更好的吸引用户下载"},
MarkFlip: []string{"翻牌活动,更好的吸引用户分享引流"},
MarkAdsFlip: []string{"翻牌活动,更好的吸引用户分享引流"},
MarkKeep: []string{"邀新好友,完成任务,奖励叠加,拉新/留存/促活都能干"},
MarkGold: []string{"完成任务收集金币,领取超级大奖,更好的促活与转化"},
MarkCoin: []string{"瓜分金币宝箱,更好的促活与转化"},
MarkVs: []string{"玩转热门赛事,增添观赛氛围感,提升日活好帮手"},
MarkUno: []string{"收集UNO卡牌活动,领取超级大奖,更好的促活与转化"},
MarkGashapon: []string{"扭蛋机,更好的促活与转化"},
},
LangEn: {
MarkReferral: []string{"Go viral with your exisiting users. Take advantage of your exisiting users for new user aquisations."},
MarkWinTogether: []string{"Both referrals and referees can get rewards!"},
MarkBlindBox: []string{"Create your own mystery box event in 5 mins.", "Catch the trend, no development needed."},
MarkPrizeWheel: []string{"Use this fun and easy format to entertain your audience, spin to win!"},
MarkSlotMachine: []string{"Match the three, enjoy the captivating slot machine. Let participants be addicted to it!"},
MarkLuckyGrid: []string{"Assign different tasks for users to win the prize."},
MarkPrizeQuiz: []string{"Never miss a popular topic. ID ranking or guessing contest in minutes! "},
MarkPrizeAnswer: []string{"How to make a quiz even more engaging and challenging? Display a countdown and challenge your players and their friends!"},
MarkSignIn: []string{"Join our daily check-in challenge and win exciting rewards!"},
MarkDice: []string{"Roll the dice, traverse the Monopoly board, and win amazing rewards!"},
MarkGrow: []string{"Raise dogs, plant trees, and share the joy and achievements of the farm with friends!"},
MarkQa: []string{"Test Your Brain! Challenge the Summit!"},
MarkQaAudio: []string{"Listen, Answer, Win! Exciting Rewards Await!"},
MarkQaVideo: []string{"Watch & Win: Quiz Fun!"},
MarkBallot: []string{"Win Exciting Prizes! Participate in the Lucky Draw Texts Event for a chance to win amazing rewards!"},
MarkChop: []string{"Invite friends to boost, claim free gifts"},
MarkCash: []string{"Cash lottery to better attract users to share and attract traffic"},
MarkAdsWheel: []string{"Interactive turntable, use prizes to better attract users to download"},
MarkAdsGrid: []string{"Interactive Nine-square grid, use prizes to better attract users to download"},
MarkFlip: []string{"Flip the Card to better encourage users to share and attract traffic"},
MarkAdsFlip: []string{"Flip the Card to better encourage users to share and attract traffic"},
MarkKeep: []string{"Invite new friends, complete tasks, and receive rewards. You can attract new users, retain users, and promote activity"},
MarkGold: []string{"Complete tasks to collect coins and claim super prizes to better promote activation and conversion"},
MarkCoin: []string{"Divide the gold coin treasure box to better promote activation and conversion"},
MarkVs: []string{"Enjoy trending events, enhance match atmosphere, and lift daily active users"},
MarkUno: []string{"Collect UNO cards to win super prizes to better promote activation and conversion"},
MarkGashapon: []string{"Gashapon, better promote activation and conversion"},
},
}
var FissionConvertTitle = map[string]map[string]string{
LangZhCn: {
MarkBlindBox: "神秘宝藏大挑战",
MarkPrizeWheel: "幸运之轮",
MarkSlotMachine: "夺宝奇兵",
MarkLuckyGrid: "抽奖嘉年华",
MarkFlip: "卡牌大师",
MarkGold: "金币任务",
},
LangEn: {
MarkBlindBox: "Mystery Box Bonanza",
MarkPrizeWheel: "Spin to Win",
MarkSlotMachine: "Slot Bonanza TriggerShare",
MarkLuckyGrid: "Prize-Filled Tic-Tac-Toe",
MarkFlip: "Card Master",
MarkGold: "Gold Coin Mission",
},
}
var FissionConvertDesc = map[string]map[string][]string{
LangZhCn: {
MarkBlindBox: []string{"参与盲盒狂欢夺神秘宝藏!"},
MarkPrizeWheel: []string{"做赏金任务抽惊喜大奖"},
MarkSlotMachine: []string{"转动抽奖老虎机赢取幸运大奖"},
MarkLuckyGrid: []string{"挑战夺宝任务赢取神秘宝藏"},
MarkFlip: []string{"做赏金任务实现翻牌自由"},
MarkGold: []string{"完成任务收集金币,领取超级大奖,更好的促活与转化"},
},
LangEn: {
MarkBlindBox: []string{"Rise to the Challenge, Win the Ultimate Prize"},
MarkPrizeWheel: []string{"Turn the Wheel of Fortune, Unlock Your Luck"},
MarkSlotMachine: []string{"Play the Slots, Discover Hidden Treasures"},
MarkLuckyGrid: []string{"Nine Squares of Surprise, Claim Your Reward"},
MarkFlip: []string{"Do bounty tasks to achieve flip freedom"},
MarkGold: []string{"Complete tasks to collect coins and claim super prizes to better promote activation and conversion"},
},
}
func FissionList() []Fission {
return []Fission{
{
Id: IdReferral,
Mark: MarkReferral,
Logo: "resource/2023/07/10/cilsqan70jnpckfrq2jg.svg",
Color: []string{"#EB2224", "#FF7400"},
CanUse: true,
PushLogo: "ftg/logo/logo_referral.png",
},
{
Id: IdWinTogether,
Mark: MarkWinTogether,
Logo: "resource/2023/07/10/cilss4770jnpd9ncs7m0.svg",
Color: []string{"#FE6607", "#FFC300"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "",
PushLogo: "ftg/logo/logo_win.png",
},
{
Id: IdPrizeWheel,
Mark: MarkPrizeWheel,
Logo: "resource/2023/07/10/cilsu4n70jnpe3ah0k1g.svg",
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
ConvertLogo: "ftg/logo/convert_logo_wheel.svg",
PushLogo: "ftg/logo/logo_wheel.png",
PushConvertLogo: "ftg/logo/convert_logo_wheel.png",
},
{
Id: IdSlotMachine,
Mark: MarkSlotMachine,
Logo: "resource/2023/07/10/cilsuvf70jnpenrke5e0.svg",
PushLogo: "ftg/logo/logo_slot.png",
Color: []string{"#0047FF", "#00FFC2"},
CanUse: true,
ConvertLogo: "ftg/logo/convert_logo_slot.svg",
PushConvertLogo: "ftg/logo/convert_logo_slot.png",
},
{
Id: IdBlindBox,
Mark: MarkBlindBox,
Logo: "resource/2023/07/10/cilst0v70jnpdn5080b0.svg",
PushLogo: "ftg/logo/logo_blind.png",
Color: []string{"#8228F6", "#3378FF"},
CanUse: true,
ConvertLogo: "ftg/logo/convert_logo_blind.svg",
PushConvertLogo: "ftg/logo/convert_logo_blind.png",
},
{
Id: IdLuckyGrid,
Mark: MarkLuckyGrid,
Logo: "resource/2023/07/10/cilsvhv70jnpf5l8iqog.svg",
PushLogo: "ftg/logo/logo_grid.png",
Color: []string{"#FA2121", "#BB4DFF"},
CanUse: true,
ConvertLogo: "ftg/logo/convert_logo_grid.svg",
PushConvertLogo: "ftg/logo/convert_logo_grid.png",
},
{
Id: IdPrizeAnswer,
Mark: MarkPrizeAnswer,
Logo: "resource/2023/07/10/cilt0jn70jnpftepg64g.svg",
PushLogo: "ftg/logo/logo_answer.png",
Color: []string{"#0039FF", "#AD00FF"},
CanUse: true,
},
{
Id: IdPrizeQuiz,
Mark: MarkPrizeQuiz,
Logo: "resource/2023/07/10/cilt07f70jnpfitsg2a0.svg",
PushLogo: "ftg/logo/logo_quiz.png",
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
},
{
Id: IdSignIn,
Mark: MarkSignIn,
Logo: "",
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
RetainLogo: "ftg/logo/retain_logo_sign.svg",
PushRetainLogo: "ftg/logo/retain_logo_sign.png",
},
{
Id: IdDice,
Mark: MarkDice,
Logo: "ftg/logo/logo_dice.svg",
PushLogo: "ftg/logo/logo_dice.png",
Color: []string{"#EA5455", "#FF9F43"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_dice.svg",
PushRetainLogo: "ftg/logo/retain_logo_dice.png",
},
{
Id: IdGrow,
Mark: MarkGrow,
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_grow.svg",
PushRetainLogo: "ftg/logo/retain_logo_grow.png",
},
{
Id: IdQa,
Mark: MarkQa,
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_qa.svg",
PushRetainLogo: "ftg/logo/retain_logo_qa.png",
},
{
Id: IdQaAudio,
Mark: MarkQaAudio,
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_qa_audio.svg",
PushRetainLogo: "ftg/logo/retain_logo_qa_audio.png",
},
{
Id: IdQaVideo,
Mark: MarkQaVideo,
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_qa_video.svg",
PushRetainLogo: "ftg/logo/retain_logo_qa_video.png",
},
{
Id: IdBallot,
Mark: MarkBallot,
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_ballot.svg",
PushRetainLogo: "ftg/logo/retain_logo_ballot.png",
},
{
Id: IdChop,
Mark: MarkChop,
Color: []string{"#01EB38", "#00B7FF"},
CanUse: true,
ConvertLogo: "",
RetainLogo: "ftg/logo/retain_logo_chop.svg",
PushRetainLogo: "ftg/logo/retain_logo_chop.png",
},
{
Id: IdCash,
Mark: MarkCash,
Logo: "ftg/logo/logo_cash.svg",
PushLogo: "ftg/logo/logo_cash.png",
Color: []string{"#FE6607", "#FFC300"},
CanUse: true,
},
{
Id: IdAdsWheel,
Mark: MarkAdsWheel,
Logo: "ftg/logo/logo_wheel.svg",
PushLogo: "ftg/logo/logo_wheel.png",
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
},
{
Id: IdAdsGrid,
Mark: MarkAdsGrid,
Logo: "ftg/logo/logo_grid.svg",
PushLogo: "ftg/logo/logo_grid.png",
Color: []string{"#FA2121", "#BB4DFF"},
CanUse: true,
},
{
Id: IdFlip,
Mark: MarkFlip,
Logo: "ftg/logo/logo_flip.svg",
PushLogo: "ftg/logo/logo_flip.png",
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
ConvertLogo: "ftg/logo/logo_flip.svg",
PushConvertLogo: "ftg/logo/logo_flip.png",
},
{
Id: IdAdsFlip,
Mark: MarkAdsFlip,
Logo: "ftg/logo/logo_flip.svg",
PushLogo: "ftg/logo/logo_flip.png",
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
ConvertLogo: "ftg/logo/logo_flip.svg",
PushConvertLogo: "ftg/logo/logo_flip.png",
},
{
Id: IdKeep,
Mark: MarkKeep,
Logo: "ftg/logo/logo_keep.svg",
PushLogo: "ftg/logo/logo_keep.png",
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
RetainLogo: "ftg/logo/logo_keep.svg",
PushRetainLogo: "ftg/logo/logo_keep.png",
},
{
Id: IdGold,
Mark: MarkGold,
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
ConvertLogo: "ftg/logo/convert_logo_gold.svg",
PushConvertLogo: "ftg/logo/convert_logo_gold.png",
},
{
Id: IdCoin,
Mark: MarkCoin,
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
RetainLogo: "ftg/logo/retain_logo_coin.svg",
PushRetainLogo: "ftg/logo/retain_logo_coin.png",
},
{
Id: IdVs,
Mark: MarkVs,
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
RetainLogo: "ftg/logo/retain_logo_vs.svg",
PushRetainLogo: "ftg/logo/retain_logo_vs.png",
},
{
Id: IdUno,
Mark: MarkUno,
Color: []string{"#00CB5B", "#6CDF16"},
CanUse: true,
RetainLogo: "ftg/logo/retain_logo_uno.svg",
PushRetainLogo: "ftg/logo/retain_logo_uno.png",
},
{
Id: IdGashapon,
Mark: MarkGashapon,
Logo: "ftg/logo/logo_gashapon.svg",
Color: []string{"#0047FF", "#00FFC2"},
CanUse: true,
RetainLogo: "ftg/logo/logo_gashapon.svg",
PushRetainLogo: "ftg/logo/logo_gashapon.png",
},
}
}
func (f Fission) GetTitle(lang string, target int32) string {
var titleMap = FissionTitle
switch target {
case FissionTargetConvert:
titleMap = FissionConvertTitle
}
title, ok := titleMap[lang]
if !ok {
title = titleMap[LangZhCn]
}
return title[f.Mark]
}
func (f Fission) GetDesc(lang string, target int32) []string {
var descMap = FissionDesc
switch target {
case FissionTargetConvert:
descMap = FissionConvertDesc
}
desc, ok := descMap[lang]
if !ok {
desc = descMap[LangZhCn]
}
return desc[f.Mark]
}
func (f Fission) GetPushLogo(target int32) (logo string) {
switch target {
case FissionTargetConvert:
logo = f.PushConvertLogo
case FissionTargetRetain:
logo = f.PushRetainLogo
}
if logo != "" {
return
}
return f.PushLogo
}
func GetPushLogo(fissionId int64, target int32) string {
for _, fission := range FissionList() {
if fission.Id == fissionId {
return fission.GetPushLogo(target)
}
}
return ""
}
const (
TempInfoImgCommon = "ftg/commonimage/"
TempInfoImgAndroidBtnKey = "android_btn"
TempInfoImgAndroidBtnValue = TempInfoImgCommon + TempInfoImgAndroidBtnKey + "%s.png"
TempInfoImgAndroidBtnDesc = "下载引导图-安卓按钮"
TempInfoImgIosBtnKey = "ios_btn"
TempInfoImgIosBtnValue = TempInfoImgCommon + TempInfoImgIosBtnKey + "%s.png"
TempInfoImgIosBtnDesc = "下载引导图-ios按钮"
TempInfoImgWechatBrowserKey = "wechat_browser"
TempInfoImgWechatBrowserValue = TempInfoImgCommon + TempInfoImgWechatBrowserKey + "%s.png"
TempInfoImgWechatBrowserDesc = "微信引导图-拉起浏览器"
TempInfoImgWechatLineKey = "wechat_line"
TempInfoImgWechatLineValue = TempInfoImgCommon + TempInfoImgWechatLineKey + "%s.png"
TempInfoImgWechatLineDesc = "微信引导图-引导线"
TempInfoImgDefaultKey = "default_thank"
TempInfoImgDefaultValue = TempInfoImgCommon + TempInfoImgDefaultKey + ".png"
TempInfoImgDefaultDesc = " 谢谢参与图片"
TempInfoImgAndroidBtnWhiteKey = "android_btn_white"
TempInfoImgAndroidBtnWhiteValue = TempInfoImgCommon + TempInfoImgAndroidBtnWhiteKey + "%s.png"
TempInfoImgAndroidBtnWhiteDesc = "下载引导图-安白底按钮"
TempInfoImgIosBtnWhiteKey = "ios_btn_white"
TempInfoImgIosBtnWhiteValue = TempInfoImgCommon + TempInfoImgIosBtnWhiteKey + "%s.png"
TempInfoImgIosBtnWhiteDesc = "下载引导图-ios白底按钮"
)
const (
FissionCashFixLeft = 22 // 现金抽奖固定还剩余的金额
FissionCashFixEnergy = 499 // 现金抽奖固定能量值
FissionCashFixEnergyUse = 100 // 现金抽奖固定使用的能量值
FissionCashFixShare = 1 // 现金抽奖分享固定给的金额
)
type FissionCashSpinOne struct {
Id int64 `json:"id"`
Cash float64 `json:"cash"`
}
var FissionCashSpin = []FissionCashSpinOne{
{Id: 1, Cash: 0.01},
{Id: 2, Cash: 8},
{Id: 3, Cash: 5},
{Id: 4, Cash: 0.99},
{Id: 5, Cash: 3},
{Id: 6, Cash: 2},
}
var SpinGetId = []int64{2, 3, 3, 6, 4, 1}
const (
PropNameSignCard = "sign_card" // 补签卡
PropNameFixedDice = "fixed_dice" // 幸运骰子(固定点数)
PropNameUnoThree = "uno_three" // uno+3道具
PropNameUnoFive = "uno_five" // uno+5道具
PropNameUnoFix = "uno_fix" // uno+指定颜色道具
)
// NewReportFission 报表玩法
var NewReportFission = []int64{
IdLuckyGrid,
IdSlotMachine,
IdPrizeWheel,
IdBlindBox,
IdFlip,
IdDice,
IdGrow,
IdQa,
IdQaAudio,
IdQaVideo,
IdChop,
IdWinTogether,
IdReferral,
IdCash,
IdKeep,
IdGold,
IdCoin,
IdSignIn,
IdBallot,
IdPrizeAnswer,
IdPrizeQuiz,
IdVs,
IdUno,
IdGashapon,
}
// NewEventCpn 是否不是新版事件驱动的玩法
func NewEventCpn(fissionId int64) bool {
var arr = []int64{
IdDice,
IdCash,
IdGrow,
IdLuckyGrid, IdPrizeWheel, IdBlindBox, IdSlotMachine, IdFlip, IdGashapon,
IdQa, IdQaVideo, IdQaAudio, IdPrizeAnswer,
IdChop,
IdWinTogether, IdReferral,
IdKeep,
IdGold,
IdCoin,
IdSignIn,
IdBallot,
IdPrizeQuiz,
IdVs,
IdUno,
}
for _, v := range arr {
if v == fissionId {
return true
}
}
return false
}
var FissionByTarget = map[int32][]int64{
FissionTargetApp: {
IdReferral, IdWinTogether, IdBlindBox, IdPrizeWheel, IdSlotMachine, IdLuckyGrid, IdPrizeQuiz, IdPrizeAnswer, IdDice, IdCash, IdFlip,
},
FissionTargetConvert: {
IdPrizeWheel, IdSlotMachine, IdBlindBox, IdLuckyGrid, IdFlip, IdGold,
},
FissionTargetRetain: {
IdSignIn, IdDice, IdGrow, IdQaAudio, IdQaVideo, IdQa, IdBallot, IdChop, IdKeep, IdCoin, IdVs, IdUno, IdGashapon,
},
FissionTargetAds: {
IdAdsWheel, IdAdsGrid, IdAdsFlip,
},
}
const (
FissionPropMarkDogFood = "dog_food"
)
var FissionPropMarkTitle = map[string]string{
FissionPropMarkDogFood: "狗粮",
}
// FissionPropMark 玩法道具标识
var FissionPropMark = map[int64]string{
IdKeep: FissionPropMarkDogFood, //狗粮
}

@ -0,0 +1,69 @@
package consts
type Game struct {
ID int64
Title string
Img string
Link string
}
var Games = []Game{
{
ID: 1,
Img: "/resource/2026/06/10/d8keg5p0b4msm624ivcg.png",
Title: "Penalty Champs",
Link: "https://game-paly.playwithwin.com/penaltychamps22/v2/index.html?site-id=24792654",
},
{
ID: 2,
Img: "/resource/2026/06/10/d8keg5progthlcfhvsqg.png",
Title: "Football Legends",
Link: "https://game-paly.playwithwin.com/footballlegends/v7/index.html?site-id=24792654",
},
{
ID: 3,
Img: "/resource/2026/06/10/d8keg5o1bc5r8vr5962g.png",
Title: "Magic and Wizards Match",
Link: "https://game-paly.playwithwin.com/magicandwizardsmatch/v1/index.html?site-id=24792654",
},
{
ID: 4,
Img: "/resource/2026/06/10/d8keg5o1bc5r8vr59670.png",
Title: "Soccer Bubble Shooter",
Link: "https://game-paly.playwithwin.com/soccerbubbleshooter/v3/index.html?site-id=24792654",
},
{
ID: 5,
Img: "/resource/2026/06/16/d8ogirn5ar9vkeoif8n0.png",
Title: "Word City Crossed",
Link: "https://game-paly.playwithwin.com/wordcitycrossed/v2/index.html?site-id=24792654",
},
{
ID: 6,
Img: "/resource/2026/06/10/d8keg5ta5kl0th1o0600.png",
Title: "Word Search",
Link: "https://game-paly.playwithwin.com/wordsearch/v1/index.html?site-id=24792654",
},
{
ID: 7,
Img: "/resource/2026/06/10/d8keg5o1bc5r8vr5963g.png",
Title: "Ultimate Sudoku",
Link: "https://game-paly.playwithwin.com/ultimatesudoku/v2/index.html?site-id=24792654",
},
{
ID: 8,
Img: "/resource/2026/06/10/d8keg5p35bitkaefcfhg.png",
Title: "2048",
Link: "https://game-paly.playwithwin.com/20482/v1/index.html?site-id=24792654",
},
}
func GameLinkMap() (ids []int64, gameMap map[int64]Game) {
ids = make([]int64, 0, len(Games))
gameMap = make(map[int64]Game, len(Games))
for _, v := range Games {
ids = append(ids, v.ID)
gameMap[v.ID] = v
}
return ids, gameMap
}

@ -0,0 +1,279 @@
package consts
const (
//国内
Wechat = 1 //微信
Weibo = 2 //微博
QQ = 3 //QQ
Zhihu = 4 //知乎
BZhan = 5 //B站
HuPu = 6 //虎扑
Douban = 7 //豆瓣
BaiduTieBa = 8 //百度贴吧
JiKe = 9 //即刻
ZhiShiPlanet = 10 //知识星球
PipiXia = 11 //皮皮虾
JianShu = 12 //简书
XiaoHongShu = 13 //小红书
//海外
Facebook = 50 //Facebook
WhatsApp = 51 //WhatsApp
Messenger = 52 //Messenger
Instagram = 53 //Instagram
Snapchat = 54 //Snapchat
Telegram = 55 //Telegram
Line = 56 //LINE
Sms = 57 //SMS
Email = 58 //Email
Linkedin = 59 //Linkedin
Twitter = 60 //Twitter
Youtube = 61 //Youtube
TikTok = 62 //TikTok
Discord = 63 //Discord
Reddit = 64 //Reddit
)
type Share struct {
Id int64
Title string
Logo string
Scheme string
IosScheme string
Close bool
}
var ShareTitleMap = shareTitleMap()
func shareTitleMap() map[int64]string {
list := append(ShareLocList, ShareOverSeaList...)
var data = make(map[int64]string)
for _, v := range list {
data[v.Id] = v.Title
}
return data
}
var ShareMap = shareMap()
func shareMap() map[int64]Share {
list := append(ShareLocList, ShareOverSeaList...)
var data = make(map[int64]Share)
for _, v := range list {
if v.Close {
continue
}
data[v.Id] = v
}
return data
}
var ShareLocList = []Share{
{
Id: Wechat,
Title: "微信",
Logo: "social_media/Wechat2.png",
Scheme: "weixin://",
IosScheme: "weixin://",
},
{
Id: Weibo,
Title: "微博",
Logo: "social_media/Weibo2.png",
Scheme: "sinaweibo://userinfo",
IosScheme: "sinaweibo://",
},
{
Id: Douban,
Title: "豆瓣",
Logo: "social_media/Douban2.png",
Scheme: "douban://douban.com",
IosScheme: "douban://",
},
{
Id: Zhihu,
Title: "知乎",
Logo: "social_media/Zhihu2.png",
Scheme: "zhihu://",
IosScheme: "zhihu://",
},
{
Id: BZhan,
Title: "bilibili",
Logo: "social_media/bilibili2.png",
Scheme: "bilibili://home",
IosScheme: "bilibili://",
},
{
Id: HuPu,
Title: "虎扑",
Logo: "social_media/HuPu.png",
Scheme: "tencent222049://",
IosScheme: "tencent222049://",
Close: true,
},
{
Id: QQ,
Title: "QQ",
Logo: "social_media/QQ2.png",
Scheme: "mqq://",
IosScheme: "mqq://",
},
{
Id: BaiduTieBa,
Title: "百度贴吧",
Logo: "social_media/BaiduTieBa.png",
Scheme: "com.baidu.tieba://",
IosScheme: "com.baidu.tieba://",
Close: true,
},
{
Id: JiKe,
Title: "即刻",
Logo: "social_media/JiKe.png",
Scheme: "com.ruguoapp.jike://",
IosScheme: "com.ruguoapp.jike://",
Close: true,
},
{
Id: ZhiShiPlanet,
Title: "知识星球",
Logo: "social_media/ZhiShiPlanet.png",
Scheme: "xiaomiquan://",
IosScheme: "xiaomiquan://",
Close: true,
},
{
Id: PipiXia,
Title: "皮皮虾",
Logo: "social_media/PipiXia.png",
Scheme: "bds://",
IosScheme: "bds://",
Close: true,
},
{
Id: JianShu,
Title: "简书",
Logo: "social_media/Jianshu2.png",
Scheme: "jianshu://homepage",
IosScheme: "jianshu://",
},
{
Id: XiaoHongShu,
Title: "小红书",
Logo: "social_media/Xiaohongshu2.png",
Scheme: "xhsdiscover://home/",
IosScheme: "xhsdiscover://home/",
},
}
var ShareOverSeaList = []Share{
{
Id: Facebook,
Title: "Facebook",
Logo: "social_media/Facebook2.png",
Scheme: "fb://Fb",
IosScheme: "fb://Fb",
},
{
Id: WhatsApp,
Title: "WhatsApp",
Logo: "social_media/Whatsapp2.png",
Scheme: "whatsapp://send?text=${shareText}",
IosScheme: "whatsapp://send?text=wa",
},
{
Id: Messenger,
Title: "Messenger",
Logo: "social_media/Messenger2.png",
Scheme: "fb-messenger://settings",
IosScheme: "fb-Messenger://",
},
{
Id: Instagram,
Title: "Instagram",
Logo: "social_media/Instagram2.png",
Scheme: "instagram://direct-inbox",
IosScheme: "instagram://direct-inbox",
},
{
Id: Snapchat,
Title: "Snapchat",
Logo: "social_media/Snapchat2.png",
Scheme: "snapchat://",
IosScheme: "Snapchat://",
},
{
Id: Telegram,
Title: "Telegram",
Logo: "social_media/Telegram2.png",
Scheme: "tg://msg?text=${shareText}",
IosScheme: "Telegram://msg?text=${shareText}",
},
{
Id: Line,
Title: "LINE",
Logo: "social_media/Line2.png",
Scheme: "line://",
IosScheme: "line://",
},
{
Id: Sms,
Title: "SMS",
Logo: "social_media/SMS2.png",
Scheme: "sms:?body=${shareText}",
IosScheme: "sms:?body=${shareText}",
},
{
Id: Email,
Title: "Email",
Logo: "social_media/Email.png",
Scheme: "Mailto://",
IosScheme: "Mailto://",
Close: true,
},
{
Id: Linkedin,
Title: "Linkedin",
Logo: "social_media/Linkedin2.png",
Scheme: "linkedin://profile",
IosScheme: "Linkedin://",
},
{
Id: Twitter,
Title: "X",
Logo: "social_media/X2.png",
Scheme: "twitter://post?message=${shareText}",
IosScheme: "Twitter://post?message=${shareText}",
},
{
Id: Youtube,
Title: "YouTube",
Logo: "social_media/Youtube2.png",
Scheme: "vnd.youtube://",
IosScheme: "YouTube://",
},
{
Id: TikTok,
Title: "TikTok",
Logo: "social_media/TikTok2.png",
Scheme: "snssdk1180://",
IosScheme: "snssdk1180://",
},
{
Id: Discord,
Title: "Discord",
Logo: "social_media/Discord2.png",
Scheme: "https://discord.com/app",
IosScheme: "https://discord.com/app",
},
{
Id: Reddit,
Title: "Reddit",
Logo: "social_media/Reddit2.png",
Scheme: "https://www.reddit.com",
IosScheme: "https://www.reddit.com",
},
}

@ -0,0 +1,8 @@
package consts
type CampaignUserType struct {
LangMark string // 语言标识
LevelId int64 // 用户等级id标识
LevelMark string // 用户等级标识
CountryMark string // 国家标识
}

@ -0,0 +1,21 @@
package consts
type IntType interface {
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64
}
type NumberType interface {
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float64 | float32
}
type NormalType interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~string | ~float64 | ~float32
}
type DbIdType interface {
int64 | string
}
type SignNumber interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~float64 | ~float32
}

@ -0,0 +1,22 @@
package consts
import "time"
var (
FissionViewer = "~~view~~" // 活动预览用户id
)
var (
RunTest = false // RunTest 单元测试运行
PrintAllLog = false // PrintAllLog 打印全量日志
CollectSlowLog = false // CollectSlowLog 收集慢业务
)
// RunUnix 程序启动的时间,有时候可以拿来做一些切割点
var RunUnix = time.Now()
var HelpStatusTitle = map[string]string{
HelpStatusNotInstall: "未完成安装",
HelpStatusNotRegister: "未完成注册",
HelpStatusNotTask: "未完成任务",
}

@ -0,0 +1,405 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_campaign"
)
type WCampaignServer struct{}
// List 活动列表
func (s *WCampaignServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.List(req, res)
return err
}
// Share 社媒选项
func (s *WCampaignServer) Share(ctx context.Context, req *pb.ShareReq, res *pb.ShareRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Share(req, res)
return err
}
// Status 修改状态
func (s *WCampaignServer) Status(ctx context.Context, req *pb.StatusReq, res *pb.StatusRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Status(req, res)
return err
}
// Destroy 删除活动
func (s *WCampaignServer) Destroy(ctx context.Context, req *pb.DestroyReq, res *pb.DestroyRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Destroy(req, res)
return err
}
// Store 创建活动
func (s *WCampaignServer) Store(ctx context.Context, req *pb.StoreReq, res *pb.StoreRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Store(req, res)
return err
}
// Update 更新活动
func (s *WCampaignServer) Update(ctx context.Context, req *pb.UpdateReq, res *pb.UpdateRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Update(req, res)
return err
}
// Show 活动详情
func (s *WCampaignServer) Show(ctx context.Context, req *pb.ShowReq, res *pb.ShowRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Show(req, res)
return err
}
// ChannelList 渠道列表
func (s *WCampaignServer) ChannelList(ctx context.Context, req *pb.ChannelListReq, res *pb.ChannelListRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChannelList(req, res)
return err
}
// ChannelCreate 渠道创建
func (s *WCampaignServer) ChannelCreate(ctx context.Context, req *pb.ChannelCreateReq, res *pb.ChannelCreateRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChannelCreate(req, res)
return err
}
// ChannelUpdate 渠道创建
func (s *WCampaignServer) ChannelUpdate(ctx context.Context, req *pb.ChannelUpdateReq, res *pb.ChannelUpdateRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChannelUpdate(req, res)
return err
}
// ChannelDestroy 渠道创建
func (s *WCampaignServer) ChannelDestroy(ctx context.Context, req *pb.ChannelDestroyReq, res *pb.ChannelDestroyRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChannelDestroy(req, res)
return err
}
// KvData 获取活动键值对
func (s *WCampaignServer) KvData(ctx context.Context, req *pb.KvDataReq, res *pb.KvDataRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.KvData(req, res)
return err
}
// Cert 认证活动信息
func (s *WCampaignServer) Cert(ctx context.Context, req *pb.CertReq, res *pb.CertRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Cert(req, res)
return err
}
// Barrage 活动弹幕
func (s *WCampaignServer) Barrage(ctx context.Context, req *pb.BarrageReq, res *pb.BarrageRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Barrage(req, res)
return err
}
// Option 投票选项
func (s *WCampaignServer) Option(ctx context.Context, req *pb.OptionReq, res *pb.OptionRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Option(req, res)
return err
}
// RelateDdl 活动关联动态下载页
func (s *WCampaignServer) RelateDdl(ctx context.Context, req *pb.RelateDdlReq, res *pb.RelateDdlRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.RelateDdl(req, res)
return err
}
// DdlCampaign 关联动态下载页的活动
func (s *WCampaignServer) DdlCampaign(ctx context.Context, req *pb.DdlCampaignReq, res *pb.DdlCampaignRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.DdlCampaign(req, res)
return err
}
// Langs 活动多语言配置信息
func (s *WCampaignServer) Langs(ctx context.Context, req *pb.LangsReq, res *pb.LangsRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Langs(req, res)
return err
}
// Lang 活动语言信息
func (s *WCampaignServer) Lang(ctx context.Context, req *pb.LangReq, res *pb.LangRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Lang(req, res)
return err
}
// SaveLang 保存活动多语言配置信息
func (s *WCampaignServer) SaveLang(ctx context.Context, req *pb.SaveLangReq, res *pb.SaveLangRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.SaveLang(req, res)
return err
}
// DestroyLang 删除活动语言配置信息
func (s *WCampaignServer) DestroyLang(ctx context.Context, req *pb.DestroyLangReq, res *pb.DestroyLangRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.DestroyLang(req, res)
return err
}
// LangSelect 活动语言选择
func (s *WCampaignServer) LangSelect(ctx context.Context, req *pb.LangSelectReq, res *pb.LangSelectRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.LangSelect(req, res)
return err
}
// CampaignInfo 活动信息
func (s *WCampaignServer) CampaignInfo(ctx context.Context, req *pb.CampaignInfoReq, res *pb.CampaignInfoRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.CampaignInfo(req, res)
return err
}
// ShowReward 显示的奖品数据
func (s *WCampaignServer) ShowReward(ctx context.Context, req *pb.ShowRewardReq, res *pb.ShowRewardRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ShowReward(req, res)
return err
}
// AdsStore 创建Ads活动
func (s *WCampaignServer) AdsStore(ctx context.Context, req *pb.AdsStoreReq, res *pb.AdsStoreRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.AdsStore(req, res)
return err
}
// AdsUpdate 更新Ads活动
func (s *WCampaignServer) AdsUpdate(ctx context.Context, req *pb.AdsUpdateReq, res *pb.AdsUpdateRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.AdsUpdate(req, res)
return err
}
// AdsShow Ads活动详情
func (s *WCampaignServer) AdsShow(ctx context.Context, req *pb.AdsShowReq, res *pb.AdsShowRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.AdsShow(req, res)
return err
}
// CampaignSelect 活动列表
func (s *WCampaignServer) CampaignSelect(ctx context.Context, req *pb.CampaignSelectReq, res *pb.CampaignSelectRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.CampaignSelect(req, res)
return err
}
// RewardDetail 奖品详情
func (s *WCampaignServer) RewardDetail(ctx context.Context, req *pb.RewardDetailReq, res *pb.RewardDetailRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.RewardDetail(req, res)
return err
}
// UpdateStock 修改奖品库存
func (s *WCampaignServer) UpdateStock(ctx context.Context, req *pb.UpdateStockReq, res *pb.UpdateStockRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.UpdateStock(req, res)
return err
}
// CampaignTz 活动时区数据
func (s *WCampaignServer) CampaignTz(ctx context.Context, req *pb.CampaignTzReq, res *pb.CampaignTzRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.CampaignTz(req, res)
return err
}
// CampaignRewardType 活动奖品类型
func (s *WCampaignServer) CampaignRewardType(ctx context.Context, req *pb.CampaignRewardTypeReq, res *pb.CampaignRewardTypeRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.CampaignRewardType(req, res)
return err
}
// ChildList 子活动列表
func (s *WCampaignServer) ChildList(ctx context.Context, req *pb.ChildListReq, res *pb.ChildListRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChildList(req, res)
return err
}
// ChildStore 子活动列表
func (s *WCampaignServer) ChildStore(ctx context.Context, req *pb.ChildStoreReq, res *pb.ChildStoreRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChildStore(req, res)
return err
}
// ChildUpdate 更新子活动
func (s *WCampaignServer) ChildUpdate(ctx context.Context, req *pb.ChildUpdateReq, res *pb.ChildUpdateRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChildUpdate(req, res)
return err
}
// ChildShow 子活动活动
func (s *WCampaignServer) ChildShow(ctx context.Context, req *pb.ChildShowReq, res *pb.ChildShowRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ChildShow(req, res)
return err
}
// TaskCenterJump 子活动列表
func (s *WCampaignServer) TaskCenterJump(ctx context.Context, req *pb.TaskCenterJumpReq, res *pb.TaskCenterJumpRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.TaskCenterJump(req, res)
return err
}
// CondList 活动任务数据
func (s *WCampaignServer) CondList(ctx context.Context, req *pb.CondListReq, res *pb.CondListRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.CondList(req, res)
return err
}
// Campaigns 获取活动数据
func (s *WCampaignServer) Campaigns(ctx context.Context, req *pb.CampaignsReq, res *pb.CampaignsRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.Campaigns(req, res)
return err
}
// SetLvApi 设置动态用户等级动态api
func (s *WCampaignServer) SetLvApi(ctx context.Context, req *pb.SetLvApiReq, res *pb.SetLvApiRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.SetLvApi(req, res)
return err
}
// GetLvApi 设置动态用户等级动态api
func (s *WCampaignServer) GetLvApi(ctx context.Context, req *pb.GetLvApiReq, res *pb.GetLvApiRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.GetLvApi(req, res)
return err
}
// VsSettlement 赛事竞猜结算
func (s *WCampaignServer) VsSettlement(ctx context.Context, req *pb.VsSettlementReq, res *pb.VsSettlementRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.VsSettlement(req, res)
return err
}
// VsSettlementInfo 赛事竞猜结算
func (s *WCampaignServer) VsSettlementInfo(ctx context.Context, req *pb.VsSettlementInfoReq, res *pb.VsSettlementInfoRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.VsSettlementInfo(req, res)
return err
}
// ActionList 行为列表
func (s *WCampaignServer) ActionList(ctx context.Context, req *pb.ActionListReq, res *pb.ActionListRes) (err error) {
//初始化服务
srv := service.WCampaign{}
srv.Init(ctx)
err = srv.ActionList(req, res)
return err
}

@ -0,0 +1,173 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_campaign_stat"
)
type WCampaignStatServer struct {
ser service.WCampaignStat
}
// Summary 活动概览数据
func (s *WCampaignStatServer) Summary(ctx context.Context, req *pb.SummaryReq, res *pb.SummaryRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.Summary(req, res)
return err
}
// Campaign 活动数据
func (s *WCampaignStatServer) Campaign(ctx context.Context, req *pb.CampaignReq, res *pb.CampaignRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.Campaign(req, res)
return err
}
// Related 裂变数据
func (s *WCampaignStatServer) Related(ctx context.Context, req *pb.RelatedReq, res *pb.RelatedRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.Related(req, res)
return err
}
// Stat 统计事件数据
func (s *WCampaignStatServer) Stat(ctx context.Context, req *pb.StatReq, res *pb.StatRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.Stat(req, res)
return err
}
// Channel 渠道统计
func (s *WCampaignStatServer) Channel(ctx context.Context, req *pb.ChannelReq, res *pb.ChannelRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.Channel(req, res)
return err
}
// AdsSummary Ads总揽数据
func (s *WCampaignStatServer) AdsSummary(ctx context.Context, req *pb.AdsSummaryReq, res *pb.AdsSummaryRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.AdsSummary(req, res)
return err
}
// AdsTable Ads报表
func (s *WCampaignStatServer) AdsTable(ctx context.Context, req *pb.AdsTableReq, res *pb.AdsTableRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.AdsTable(req, res)
return err
}
// AdsReward Ads奖品
func (s *WCampaignStatServer) AdsReward(ctx context.Context, req *pb.AdsRewardReq, res *pb.AdsRewardRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.AdsReward(req, res)
return err
}
// InAppBP 应用内埋点埋点
func (s *WCampaignStatServer) InAppBP(ctx context.Context, req *pb.InAppBPReq, res *pb.InAppBPRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.InAppBP(req, res)
return err
}
// OutAppBP 应用外埋点
func (s *WCampaignStatServer) OutAppBP(ctx context.Context, req *pb.OutAppBPReq, res *pb.OutAppBPRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.OutAppBP(req, res)
return err
}
// ReportInfo 报表信息
func (s *WCampaignStatServer) ReportInfo(ctx context.Context, req *pb.ReportInfoReq, res *pb.ReportInfoRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.ReportInfo(req, res)
return err
}
// StatEvent 活动统计的维度
func (s *WCampaignStatServer) StatEvent(ctx context.Context, req *pb.StatEventReq, res *pb.StatEventRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.StatEvent(req, res)
return err
}
// DemTitle 维度标题数据
func (s *WCampaignStatServer) DemTitle(ctx context.Context, req *pb.DemTitleReq, res *pb.DemTitleRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.DemTitle(req, res)
return err
}
// TopTen 活动前十排行榜
func (s *WCampaignStatServer) TopTen(ctx context.Context, req *pb.TopTenReq, res *pb.TopTenRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.TopTen(req, res)
return err
}
// UserCycle 用户明细占比数据
func (s *WCampaignStatServer) UserCycle(ctx context.Context, req *pb.UserCycleReq, res *pb.UserCycleRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.UserCycle(req, res)
return err
}
// Active 用户活跃
func (s *WCampaignStatServer) Active(ctx context.Context, req *pb.ActiveReq, res *pb.ActiveRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.Active(req, res)
return err
}
// ChildBP 应用内埋点
func (s *WCampaignStatServer) ChildBP(ctx context.Context, req *pb.ChildBPReq, res *pb.ChildBPRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.ChildBP(req, res)
return err
}
// ChildReportInfo 子活动报表信息
func (s *WCampaignStatServer) ChildReportInfo(ctx context.Context, req *pb.ChildReportInfoReq, res *pb.ChildReportInfoRes) (err error) {
//初始化服务
srv := service.WCampaignStat{}
srv.Init(ctx)
err = srv.ChildReportInfo(req, res)
return err
}

@ -0,0 +1,864 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_campaign_user"
)
type WCampaignUserServer struct{}
// List 用户列表
func (s *WCampaignUserServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.List(req, res)
return err
}
// Reward 用户奖励
func (s *WCampaignUserServer) Reward(ctx context.Context, req *pb.RewardReq, res *pb.RewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Reward(req, res)
return err
}
// Visit 访问活动
func (s *WCampaignUserServer) Visit(ctx context.Context, req *pb.VisitReq, res *pb.VisitRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Visit(req, res)
return err
}
// Play 用户活动数据
func (s *WCampaignUserServer) Play(ctx context.Context, req *pb.PlayReq, res *pb.PlayRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Play(req, res)
return err
}
// RewardUser 中奖用户列表
func (s *WCampaignUserServer) RewardUser(ctx context.Context, req *pb.RewardUserReq, res *pb.RewardUserRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.RewardUser(req, res)
return err
}
// Info 用户信息
func (s *WCampaignUserServer) Info(ctx context.Context, req *pb.InfoReq, res *pb.InfoRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Info(req, res)
return err
}
// Rank 排行榜
func (s *WCampaignUserServer) Rank(ctx context.Context, req *pb.RankReq, res *pb.RankRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Rank(req, res)
return err
}
// Lottery 活动抽奖
func (s *WCampaignUserServer) Lottery(ctx context.Context, req *pb.LotteryReq, res *pb.LotteryRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Lottery(req, res)
return err
}
// Answer 活动答题
func (s *WCampaignUserServer) Answer(ctx context.Context, req *pb.AnswerReq, res *pb.AnswerRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Answer(req, res)
return err
}
// Vote 活动投票
func (s *WCampaignUserServer) Vote(ctx context.Context, req *pb.VoteReq, res *pb.VoteRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Vote(req, res)
return err
}
// Notify 客户端回调
func (s *WCampaignUserServer) Notify(ctx context.Context, req *pb.NotifyReq, res *pb.NotifyRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Notify(req, res)
return err
}
// AcceptReward 领取奖品
func (s *WCampaignUserServer) AcceptReward(ctx context.Context, req *pb.AcceptRewardReq, res *pb.AcceptRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.AcceptReward(req, res)
return err
}
// TargetRule 达标规则
func (s *WCampaignUserServer) TargetRule(ctx context.Context, req *pb.TargetRuleReq, res *pb.TargetRuleRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.TargetRule(req, res)
return err
}
// Task 我的任务
func (s *WCampaignUserServer) Task(ctx context.Context, req *pb.TaskReq, res *pb.TaskRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Task(req, res)
return err
}
// Resend 补发奖品
func (s *WCampaignUserServer) Resend(ctx context.Context, req *pb.ResendReq, res *pb.ResendRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Resend(req, res)
return err
}
// DynamicLink 获取用户动态链接
func (s *WCampaignUserServer) DynamicLink(ctx context.Context, req *pb.DynamicLinkReq, res *pb.DynamicLinkRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.DynamicLink(req, res)
return err
}
// DylinkShow 获取用户动态链接详情
func (s *WCampaignUserServer) DylinkShow(ctx context.Context, req *pb.DylinkShowReq, res *pb.DylinkShowRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.DylinkShow(req, res)
return err
}
// SignIn 我的签到板
func (s *WCampaignUserServer) SignIn(ctx context.Context, req *pb.SignInReq, res *pb.SignInRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.SignIn(req, res)
return err
}
// Sign 签到
func (s *WCampaignUserServer) Sign(ctx context.Context, req *pb.SignReq, res *pb.SignRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Sign(req, res)
return err
}
// DiceMap 大富翁地图
func (s *WCampaignUserServer) DiceMap(ctx context.Context, req *pb.DiceMapReq, res *pb.DiceMapRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.DiceMap(req, res)
return err
}
// Dice 大富翁骰子
func (s *WCampaignUserServer) Dice(ctx context.Context, req *pb.DiceReq, res *pb.DiceRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Dice(req, res)
return err
}
// Grow 成长生命体
func (s *WCampaignUserServer) Grow(ctx context.Context, req *pb.GrowReq, res *pb.GrowRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Grow(req, res)
return err
}
// GetGrow 成长生命体
func (s *WCampaignUserServer) GetGrow(ctx context.Context, req *pb.GetGrowReq, res *pb.GetGrowRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GetGrow(req, res)
return err
}
// Feed 饲养生命体
func (s *WCampaignUserServer) Feed(ctx context.Context, req *pb.FeedReq, res *pb.FeedRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Feed(req, res)
return err
}
// GetFeed 领取饲养道具
func (s *WCampaignUserServer) GetFeed(ctx context.Context, req *pb.GetFeedReq, res *pb.GetFeedRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GetFeed(req, res)
return err
}
// GrowRecord 成长记录
func (s *WCampaignUserServer) GrowRecord(ctx context.Context, req *pb.GrowRecordReq, res *pb.GrowRecordRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GrowRecord(req, res)
return err
}
// ContentLink 内容链接
func (s *WCampaignUserServer) ContentLink(ctx context.Context, req *pb.ContentLinkReq, res *pb.ContentLinkRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ContentLink(req, res)
return err
}
// LinkContent 链接内容
func (s *WCampaignUserServer) LinkContent(ctx context.Context, req *pb.LinkContentReq, res *pb.LinkContentRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.LinkContent(req, res)
return err
}
// ChopSelect 选择砍一刀奖品
func (s *WCampaignUserServer) ChopSelect(ctx context.Context, req *pb.ChopSelectReq, res *pb.ChopSelectRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChopSelect(req, res)
return err
}
// ChopReselect 重选砍一刀奖品
func (s *WCampaignUserServer) ChopReselect(ctx context.Context, req *pb.ChopReselectReq, res *pb.ChopReselectRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChopReselect(req, res)
return err
}
// ChopHelp 砍一刀助力记录
func (s *WCampaignUserServer) ChopHelp(ctx context.Context, req *pb.ChopHelpReq, res *pb.ChopHelpRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChopHelp(req, res)
return err
}
// LevelList 用户等级列表
func (s *WCampaignUserServer) LevelList(ctx context.Context, req *pb.LevelListReq, res *pb.LevelListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.LevelList(req, res)
return err
}
// LevelStore 创建用户等级
func (s *WCampaignUserServer) LevelStore(ctx context.Context, req *pb.LevelStoreReq, res *pb.LevelStoreRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.LevelStore(req, res)
return err
}
// LevelEdit 更新用户等级
func (s *WCampaignUserServer) LevelEdit(ctx context.Context, req *pb.LevelEditReq, res *pb.LevelEditRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.LevelEdit(req, res)
return err
}
// LevelDestroy 删除用户等级
func (s *WCampaignUserServer) LevelDestroy(ctx context.Context, req *pb.LevelDestroyReq, res *pb.LevelDestroyRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.LevelDestroy(req, res)
return err
}
// ProjectList 项目参与用户列表
func (s *WCampaignUserServer) ProjectList(ctx context.Context, req *pb.ProjectListReq, res *pb.ProjectListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ProjectList(req, res)
return err
}
// FinishStep 完成现金抽奖阶段
func (s *WCampaignUserServer) FinishStep(ctx context.Context, req *pb.FinishStepReq, res *pb.FinishStepRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.FinishStep(req, res)
return err
}
// Spin 现金转盘抽奖
func (s *WCampaignUserServer) Spin(ctx context.Context, req *pb.SpinReq, res *pb.SpinRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Spin(req, res)
return err
}
// CashRecords 现金转盘记录
func (s *WCampaignUserServer) CashRecords(ctx context.Context, req *pb.CashRecordsReq, res *pb.CashRecordsRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.CashRecords(req, res)
return err
}
// MixReward 合成奖品
func (s *WCampaignUserServer) MixReward(ctx context.Context, req *pb.MixRewardReq, res *pb.MixRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.MixReward(req, res)
return err
}
// DiceRecord 骰子记录
func (s *WCampaignUserServer) DiceRecord(ctx context.Context, req *pb.DiceRecordReq, res *pb.DiceRecordRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.DiceRecord(req, res)
return err
}
// RewardForm 奖品需要填写的表单
func (s *WCampaignUserServer) RewardForm(ctx context.Context, req *pb.RewardFormReq, res *pb.RewardFormRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.RewardForm(req, res)
return err
}
// SubmitForm 提交表单
func (s *WCampaignUserServer) SubmitForm(ctx context.Context, req *pb.SubmitFormReq, res *pb.SubmitFormRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.SubmitForm(req, res)
return err
}
// GetAdsUrl 广告停留回传
func (s *WCampaignUserServer) GetAdsUrl(ctx context.Context, req *pb.GetAdsUrlReq, res *pb.GetAdsUrlRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GetAdsUrl(req, res)
return err
}
// AdsStay 广告停留回传
func (s *WCampaignUserServer) AdsStay(ctx context.Context, req *pb.AdsStayReq, res *pb.AdsStayRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.AdsStay(req, res)
return err
}
// ClueNotified 通知信息已经被接收
func (s *WCampaignUserServer) ClueNotified(ctx context.Context, req *pb.ClueNotifiedReq, res *pb.ClueNotifiedRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ClueNotified(req, res)
return err
}
// ChangeUserLevel 修改用户等级
func (s *WCampaignUserServer) ChangeUserLevel(ctx context.Context, req *pb.ChangeUserLevelReq, res *pb.ChangeUserLevelRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChangeUserLevel(req, res)
return err
}
// ChopReward 砍一刀可选奖品
func (s *WCampaignUserServer) ChopReward(ctx context.Context, req *pb.ChopRewardReq, res *pb.ChopRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChopReward(req, res)
return err
}
// HelpPercent 助力进度
func (s *WCampaignUserServer) HelpPercent(ctx context.Context, req *pb.HelpPercentReq, res *pb.HelpPercentRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.HelpPercent(req, res)
return err
}
// InvokeCond 触发前置条件
func (s *WCampaignUserServer) InvokeCond(ctx context.Context, req *pb.InvokeCondReq, res *pb.InvokeCondRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.InvokeCond(req, res)
return err
}
// KeepReward 激励养成可选奖品
func (s *WCampaignUserServer) KeepReward(ctx context.Context, req *pb.KeepRewardReq, res *pb.KeepRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepReward(req, res)
return err
}
// KeepSelect 选择激励养成奖品
func (s *WCampaignUserServer) KeepSelect(ctx context.Context, req *pb.KeepSelectReq, res *pb.KeepSelectRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepSelect(req, res)
return err
}
// KeepCollect 激励养成收集一级道具
func (s *WCampaignUserServer) KeepCollect(ctx context.Context, req *pb.KeepCollectReq, res *pb.KeepCollectRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepCollect(req, res)
return err
}
// KeepFeed 激励养成收集一级道具
func (s *WCampaignUserServer) KeepFeed(ctx context.Context, req *pb.KeepFeedReq, res *pb.KeepFeedRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepFeed(req, res)
return err
}
// MachineSave 激励养成保存机器道具
func (s *WCampaignUserServer) MachineSave(ctx context.Context, req *pb.MachineSaveReq, res *pb.MachineSaveRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.MachineSave(req, res)
return err
}
// MachineRecycle 激励养成保存机器道具道具
func (s *WCampaignUserServer) MachineRecycle(ctx context.Context, req *pb.MachineRecycleReq, res *pb.MachineRecycleRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.MachineRecycle(req, res)
return err
}
// GetPropFeed 收喂养次数的道具
func (s *WCampaignUserServer) GetPropFeed(ctx context.Context, req *pb.GetPropFeedReq, res *pb.GetPropFeedRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GetPropFeed(req, res)
return err
}
// KeepLog 激励养成记录
func (s *WCampaignUserServer) KeepLog(ctx context.Context, req *pb.KeepLogReq, res *pb.KeepLogRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepLog(req, res)
return err
}
// KeepReselect 激励养成重新选择
func (s *WCampaignUserServer) KeepReselect(ctx context.Context, req *pb.KeepReselectReq, res *pb.KeepReselectRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepReselect(req, res)
return err
}
// KeepGuide 激励养成指引
func (s *WCampaignUserServer) KeepGuide(ctx context.Context, req *pb.KeepGuideReq, res *pb.KeepGuideRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepGuide(req, res)
return err
}
// KeepFirstInvite 激励养成首邀状态
func (s *WCampaignUserServer) KeepFirstInvite(ctx context.Context, req *pb.KeepFirstInviteReq, res *pb.KeepFirstInviteRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.KeepFirstInvite(req, res)
return err
}
// Child 子活动信息
func (s *WCampaignUserServer) Child(ctx context.Context, req *pb.ChildReq, res *pb.ChildRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Child(req, res)
return err
}
// ChildActive 参与子活动
func (s *WCampaignUserServer) ChildActive(ctx context.Context, req *pb.ChildActiveReq, res *pb.ChildActiveRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChildActive(req, res)
return err
}
// GoldFinishStep 完成金币任务阶段
func (s *WCampaignUserServer) GoldFinishStep(ctx context.Context, req *pb.GoldFinishStepReq, res *pb.GoldFinishStepRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GoldFinishStep(req, res)
return err
}
// GoldNotify 金币获取通知
func (s *WCampaignUserServer) GoldNotify(ctx context.Context, req *pb.GoldNotifyReq, res *pb.GoldNotifyRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GoldNotify(req, res)
return err
}
// GoldRecord 金币获取记录
func (s *WCampaignUserServer) GoldRecord(ctx context.Context, req *pb.GoldRecordReq, res *pb.GoldRecordRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.GoldRecord(req, res)
return err
}
// Deduct 扣除积分
func (s *WCampaignUserServer) Deduct(ctx context.Context, req *pb.DeductReq, res *pb.DeductRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Deduct(req, res)
return err
}
// Gain 领取积分
func (s *WCampaignUserServer) Gain(ctx context.Context, req *pb.GainReq, res *pb.GainRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Gain(req, res)
return err
}
// CoinRecord 金币池记录
func (s *WCampaignUserServer) CoinRecord(ctx context.Context, req *pb.CoinRecordReq, res *pb.CoinRecordRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.CoinRecord(req, res)
return err
}
// ChildList 子活动用户列表
func (s *WCampaignUserServer) ChildList(ctx context.Context, req *pb.ChildListReq, res *pb.ChildListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChildList(req, res)
return err
}
// ReceiveReward 领取奖励
func (s *WCampaignUserServer) ReceiveReward(ctx context.Context, req *pb.ReceiveRewardReq, res *pb.ReceiveRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ReceiveReward(req, res)
return err
}
// LotteryLog 抽奖玩法日志
func (s *WCampaignUserServer) LotteryLog(ctx context.Context, req *pb.LotteryLogReq, res *pb.LotteryLogRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.LotteryLog(req, res)
return err
}
// UserList 活动用户数据
func (s *WCampaignUserServer) UserList(ctx context.Context, req *pb.UserListReq, res *pb.UserListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.UserList(req, res)
return err
}
// CashAgain 现金大抽奖再玩一次
func (s *WCampaignUserServer) CashAgain(ctx context.Context, req *pb.CashAgainReq, res *pb.CashAgainRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.CashAgain(req, res)
return err
}
// MarkLevel 用户等级标识列表
func (s *WCampaignUserServer) MarkLevel(ctx context.Context, req *pb.MarkLevelReq, res *pb.MarkLevelRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.MarkLevel(req, res)
return err
}
// DiceCollect 用户手机碎片
func (s *WCampaignUserServer) DiceCollect(ctx context.Context, req *pb.DiceCollectReq, res *pb.DiceCollectRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.DiceCollect(req, res)
return err
}
// ClientReward 用户手机碎片
func (s *WCampaignUserServer) ClientReward(ctx context.Context, req *pb.ClientRewardReq, res *pb.ClientRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ClientReward(req, res)
return err
}
// PointsUse 积分兑换
func (s *WCampaignUserServer) PointsUse(ctx context.Context, req *pb.PointsUseReq, res *pb.PointsUseRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.PointsUse(req, res)
return err
}
// Chat Ai聊天
func (s *WCampaignUserServer) Chat(ctx context.Context, req *pb.ChatReq, res *pb.ChatRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Chat(req, res)
return err
}
// ChatList Ai聊天
func (s *WCampaignUserServer) ChatList(ctx context.Context, req *pb.ChatListReq, res *pb.ChatListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ChatList(req, res)
return err
}
// ScheduleList 赛程信息
func (s *WCampaignUserServer) ScheduleList(ctx context.Context, req *pb.ScheduleListReq, res *pb.ScheduleListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.ScheduleList(req, res)
return err
}
// MallList 用户商城奖品列表
func (s *WCampaignUserServer) MallList(ctx context.Context, req *pb.MallListReq, res *pb.MallListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.MallList(req, res)
return err
}
// Exchange 商城奖品兑换
func (s *WCampaignUserServer) Exchange(ctx context.Context, req *pb.ExchangeReq, res *pb.ExchangeRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Exchange(req, res)
return err
}
// VoteList 投票列表
func (s *WCampaignUserServer) VoteList(ctx context.Context, req *pb.VoteListReq, res *pb.VoteListRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.VoteList(req, res)
return err
}
// VsTipReward 接受投票结果
func (s *WCampaignUserServer) VsTipReward(ctx context.Context, req *pb.VsTipRewardReq, res *pb.VsTipRewardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.VsTipReward(req, res)
return err
}
// UnoRandCard uno随机牌
func (s *WCampaignUserServer) UnoRandCard(ctx context.Context, req *pb.UnoRandCardReq, res *pb.UnoRandCardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.UnoRandCard(req, res)
return err
}
// UnoClaim uno领取牌奖励
func (s *WCampaignUserServer) UnoClaim(ctx context.Context, req *pb.UnoClaimReq, res *pb.UnoClaimRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.UnoClaim(req, res)
return err
}
// UnoCard uno卡牌
func (s *WCampaignUserServer) UnoCard(ctx context.Context, req *pb.UnoCardReq, res *pb.UnoCardRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.UnoCard(req, res)
return err
}
// Show 用户详情
func (s *WCampaignUserServer) Show(ctx context.Context, req *pb.ShowReq, res *pb.ShowRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.Show(req, res)
return err
}
// EventFirstVisit 首次访问活动
func (s *WCampaignUserServer) EventFirstVisit(ctx context.Context, req *pb.EventFirstVisitReq, res *pb.EventFirstVisitRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.EventFirstVisit(req, res)
return err
}
// FindByUniq 通过唯一键找用户id
func (s *WCampaignUserServer) FindByUniq(ctx context.Context, req *pb.FindByUniqReq, res *pb.FindByUniqRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.FindByUniq(req, res)
return err
}
// TaskTip 任务提示
func (s *WCampaignUserServer) TaskTip(ctx context.Context, req *pb.TaskTipReq, res *pb.TaskTipRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.TaskTip(req, res)
return err
}
// TaskTipOk 任务提示完成
func (s *WCampaignUserServer) TaskTipOk(ctx context.Context, req *pb.TaskTipOkReq, res *pb.TaskTipOkRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.TaskTipOk(req, res)
return err
}
// CoinLog 金币日志
func (s *WCampaignUserServer) CoinLog(ctx context.Context, req *pb.CoinLogReq, res *pb.CoinLogRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.CoinLog(req, res)
return err
}
// AnswerHistory 答题历史
func (s *WCampaignUserServer) AnswerHistory(ctx context.Context, req *pb.AnswerHistoryReq, res *pb.AnswerHistoryRes) (err error) {
//初始化服务
srv := service.WCampaignUser{}
srv.Init(ctx)
err = srv.AnswerHistory(req, res)
return err
}

@ -0,0 +1,27 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_coin"
)
type WCoinServer struct{}
// Save 积分配置保存
func (s *WCoinServer) Save(ctx context.Context, req *pb.SaveReq, res *pb.SaveRes) (err error) {
//初始化服务
srv := service.WCoin{}
srv.Init(ctx)
err = srv.Save(req, res)
return err
}
// Show 积分配置展示
func (s *WCoinServer) Show(ctx context.Context, req *pb.ShowReq, res *pb.ShowRes) (err error) {
//初始化服务
srv := service.WCoin{}
srv.Init(ctx)
err = srv.Show(req, res)
return err
}

@ -0,0 +1,81 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_common"
)
type WCommonServer struct{}
// PolicyToken 获取阿里云token
func (s *WCommonServer) PolicyToken(ctx context.Context, req *pb.PolicyTokenReq, res *pb.PolicyTokenRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.PolicyToken(req, res)
return err
}
// Whitelist 服务器白名单
func (s *WCommonServer) Whitelist(ctx context.Context, req *pb.WhitelistReq, res *pb.WhitelistRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.Whitelist(req, res)
return err
}
// Download 下载
func (s *WCommonServer) Download(ctx context.Context, req *pb.DownloadReq, res *pb.DownloadRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.Download(req, res)
return err
}
// DownloadStatus 下载状态
func (s *WCommonServer) DownloadStatus(ctx context.Context, req *pb.DownloadStatusReq, res *pb.DownloadStatusRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.DownloadStatus(req, res)
return err
}
// OperateLog dashboard操作日志
func (s *WCommonServer) OperateLog(ctx context.Context, req *pb.OperateLogReq, res *pb.OperateLogRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.OperateLog(req, res)
return err
}
// SaveMaterial 保存素材
func (s *WCommonServer) SaveMaterial(ctx context.Context, req *pb.SaveMaterialReq, res *pb.SaveMaterialRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.SaveMaterial(req, res)
return err
}
// MaterialList 素材列表
func (s *WCommonServer) MaterialList(ctx context.Context, req *pb.MaterialListReq, res *pb.MaterialListRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.MaterialList(req, res)
return err
}
// CompanyMade 企业定制组件列表
func (s *WCommonServer) CompanyMade(ctx context.Context, req *pb.CompanyMadeReq, res *pb.CompanyMadeRes) (err error) {
//初始化服务
srv := service.WCommon{}
srv.Init(ctx)
err = srv.CompanyMade(req, res)
return err
}

@ -0,0 +1,99 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_fission"
)
type WFissionServer struct{}
// List 玩法列表
func (s *WFissionServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.List(req, res)
return err
}
// TemplateList 玩法模版列表
func (s *WFissionServer) TemplateList(ctx context.Context, req *pb.TemplateListReq, res *pb.TemplateListRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.TemplateList(req, res)
return err
}
// TemplateInfo 玩法模版信息
func (s *WFissionServer) TemplateInfo(ctx context.Context, req *pb.TemplateInfoReq, res *pb.TemplateInfoRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.TemplateInfo(req, res)
return err
}
// CreateTempGroup 创建模板组
func (s *WFissionServer) CreateTempGroup(ctx context.Context, req *pb.CreateTempGroupReq, res *pb.CreateTempGroupRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.CreateTempGroup(req, res)
return err
}
// CreateTemp 玩法模版列表
func (s *WFissionServer) CreateTemp(ctx context.Context, req *pb.CreateTempReq, res *pb.CreateTempRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.CreateTemp(req, res)
return err
}
// CreateTempImg 玩法模版列表
func (s *WFissionServer) CreateTempImg(ctx context.Context, req *pb.CreateTempImgReq, res *pb.CreateTempImgRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.CreateTempImg(req, res)
return err
}
// CreateTempLang 玩法模版列表
func (s *WFissionServer) CreateTempLang(ctx context.Context, req *pb.CreateTempLangReq, res *pb.CreateTempLangRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.CreateTempLang(req, res)
return err
}
// UpdateTempImg 更新玩法图片配置
func (s *WFissionServer) UpdateTempImg(ctx context.Context, req *pb.UpdateTempImgReq, res *pb.UpdateTempImgRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.UpdateTempImg(req, res)
return err
}
// UpdateTempLang 更新玩法语言配置
func (s *WFissionServer) UpdateTempLang(ctx context.Context, req *pb.UpdateTempLangReq, res *pb.UpdateTempLangRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.UpdateTempLang(req, res)
return err
}
// UpdateTempGroup 更新模板组
func (s *WFissionServer) UpdateTempGroup(ctx context.Context, req *pb.UpdateTempGroupReq, res *pb.UpdateTempGroupRes) (err error) {
//初始化服务
srv := service.WFission{}
srv.Init(ctx)
err = srv.UpdateTempGroup(req, res)
return err
}

@ -0,0 +1,63 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_fission_web"
)
type WFissionWebServer struct{}
// GetWebReward 抽取站外奖品
func (s *WFissionWebServer) GetWebReward(ctx context.Context, req *pb.GetWebRewardReq, res *pb.GetWebRewardRes) (err error) {
//初始化服务
srv := service.WFissionWeb{}
srv.Init(ctx)
err = srv.GetWebReward(req, res)
return err
}
// BindWeb 绑定站外活动
func (s *WFissionWebServer) BindWeb(ctx context.Context, req *pb.BindWebReq, res *pb.BindWebRes) (err error) {
//初始化服务
srv := service.WFissionWeb{}
srv.Init(ctx)
err = srv.BindWeb(req, res)
return err
}
// WebReward 用户站外奖
func (s *WFissionWebServer) WebReward(ctx context.Context, req *pb.WebRewardReq, res *pb.WebRewardRes) (err error) {
//初始化服务
srv := service.WFissionWeb{}
srv.Init(ctx)
err = srv.WebReward(req, res)
return err
}
// WebAnswer 用户站外答题
func (s *WFissionWebServer) WebAnswer(ctx context.Context, req *pb.WebAnswerReq, res *pb.WebAnswerRes) (err error) {
//初始化服务
srv := service.WFissionWeb{}
srv.Init(ctx)
err = srv.WebAnswer(req, res)
return err
}
// AdsUser Ads用户数据
func (s *WFissionWebServer) AdsUser(ctx context.Context, req *pb.AdsUserReq, res *pb.AdsUserRes) (err error) {
//初始化服务
srv := service.WFissionWeb{}
srv.Init(ctx)
err = srv.AdsUser(req, res)
return err
}
// AdsLottery Ads抽奖
func (s *WFissionWebServer) AdsLottery(ctx context.Context, req *pb.AdsLotteryReq, res *pb.AdsLotteryRes) (err error) {
//初始化服务
srv := service.WFissionWeb{}
srv.Init(ctx)
err = srv.AdsLottery(req, res)
return err
}

@ -0,0 +1,90 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_games"
)
type WGamesServer struct{}
// LinkList 链接列表
func (s *WGamesServer) LinkList(ctx context.Context, req *pb.LinkListReq, res *pb.LinkListRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.LinkList(req, res)
return err
}
// Visit 访问小游戏
func (s *WGamesServer) Visit(ctx context.Context, req *pb.VisitReq, res *pb.VisitRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.Visit(req, res)
return err
}
// List 游戏列表
func (s *WGamesServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.List(req, res)
return err
}
// LinkStore 创建链接
func (s *WGamesServer) LinkStore(ctx context.Context, req *pb.LinkStoreReq, res *pb.LinkStoreRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.LinkStore(req, res)
return err
}
// LinkUpdate 更新链接
func (s *WGamesServer) LinkUpdate(ctx context.Context, req *pb.LinkUpdateReq, res *pb.LinkUpdateRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.LinkUpdate(req, res)
return err
}
// LinkDestroy 删除链接
func (s *WGamesServer) LinkDestroy(ctx context.Context, req *pb.LinkDestroyReq, res *pb.LinkDestroyRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.LinkDestroy(req, res)
return err
}
// Trace 跟踪小游戏
func (s *WGamesServer) Trace(ctx context.Context, req *pb.TraceReq, res *pb.TraceRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.Trace(req, res)
return err
}
// Overview 小游戏统计
func (s *WGamesServer) Overview(ctx context.Context, req *pb.OverviewReq, res *pb.OverviewRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.Overview(req, res)
return err
}
// Trend 小游戏趋势
func (s *WGamesServer) Trend(ctx context.Context, req *pb.TrendReq, res *pb.TrendRes) (err error) {
//初始化服务
srv := service.WGames{}
srv.Init(ctx)
err = srv.Trend(req, res)
return err
}

@ -0,0 +1,108 @@
package handler
import (
"context"
"joybuywork/internal/service"
pb "joybuywork/proto/go_proto/w_library"
)
type WLibraryServer struct{}
// QaGroup 题库列表
func (s *WLibraryServer) QaGroup(ctx context.Context, req *pb.QaGroupReq, res *pb.QaGroupRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.QaGroup(req, res)
return err
}
// StoreQaGroup 创建题库
func (s *WLibraryServer) StoreQaGroup(ctx context.Context, req *pb.StoreQaGroupReq, res *pb.StoreQaGroupRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.StoreQaGroup(req, res)
return err
}
// UpdateQaGroup 更新题库
func (s *WLibraryServer) UpdateQaGroup(ctx context.Context, req *pb.UpdateQaGroupReq, res *pb.UpdateQaGroupRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.UpdateQaGroup(req, res)
return err
}
// DestroyQaGroup 删除题库
func (s *WLibraryServer) DestroyQaGroup(ctx context.Context, req *pb.DestroyQaGroupReq, res *pb.DestroyQaGroupRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.DestroyQaGroup(req, res)
return err
}
// QaList 问题列表
func (s *WLibraryServer) QaList(ctx context.Context, req *pb.QaListReq, res *pb.QaListRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.QaList(req, res)
return err
}
// StoreQa 创建题目
func (s *WLibraryServer) StoreQa(ctx context.Context, req *pb.StoreQaReq, res *pb.StoreQaRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.StoreQa(req, res)
return err
}
// UpdateQa 更新题目
func (s *WLibraryServer) UpdateQa(ctx context.Context, req *pb.UpdateQaReq, res *pb.UpdateQaRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.UpdateQa(req, res)
return err
}
// DestroyQa 删除题目
func (s *WLibraryServer) DestroyQa(ctx context.Context, req *pb.DestroyQaReq, res *pb.DestroyQaRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.DestroyQa(req, res)
return err
}
// QaGroupSelect 题库选项
func (s *WLibraryServer) QaGroupSelect(ctx context.Context, req *pb.QaGroupSelectReq, res *pb.QaGroupSelectRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.QaGroupSelect(req, res)
return err
}
// QaRand 随机问题
func (s *WLibraryServer) QaRand(ctx context.Context, req *pb.QaRandReq, res *pb.QaRandRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.QaRand(req, res)
return err
}
// QaShow 问题详情
func (s *WLibraryServer) QaShow(ctx context.Context, req *pb.QaShowReq, res *pb.QaShowRes) (err error) {
//初始化服务
srv := service.WLibrary{}
srv.Init(ctx)
err = srv.QaShow(req, res)
return err
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save