WT1.1.8+3 custom plan and training plan fixes

This commit is contained in:
bossanyit 2021-06-02 17:25:35 +02:00
parent 2b206fff49
commit d5deaf48a9
24 changed files with 1561 additions and 614 deletions

View File

@ -45,7 +45,7 @@ android {
defaultConfig {
applicationId "com.aitrainer.aitrainer_app"
minSdkVersion 18
minSdkVersion 20
targetSdkVersion 29
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName

Binary file not shown.

After

(image error) Size: 72 KiB

Binary file not shown.

After

(image error) Size: 103 KiB

View File

@ -12,9 +12,9 @@
"Change Language": "Change Language",
"Password too short": "Password too short (at least 9 characters)",
"Please type an email address": "Please type an email address",
"Exception: Please accept our data policy":"Please accept our data policy",
"Please accept our data protection policy.":"Please accept our data protection policy.",
"For more information please click on 'Privacy'":"For more information please click on 'Privacy'",
"Exception: Please accept our data policy": "Please accept our data policy",
"Please accept our data protection policy.": "Please accept our data protection policy.",
"For more information please click on 'Privacy'": "For more information please click on 'Privacy'",
"SignUp": "SignUp with Email",
"SignUpLink": "SignUp",
"Privacy": "Privacy",
@ -26,23 +26,20 @@
"Settings": "Settings",
"Profile": "Profile",
"Selected Language": "Selected Language",
"Please log in": "Please log in",
"Exception: Please log in": "Please log in",
"Exception: Customer does not exist or the password is wrong": "The email does not exist or the password is wrong",
"Exception: Facebook signup was not successful. Please try another method": "Facebook signup was not successful. Please try another method",
"Exception: Customer exists": "The email address has been registered already",
"Exception: Exception: Facebook login was not successful": "Facebook signin was not successful",
"Exception: The email address has been registered already":"The email address has been registered already",
"Exception: Exception: The email address has been registered already":"The email address has been registered already",
"Exception: The email address has been registered already": "The email address has been registered already",
"Exception: Exception: The email address has been registered already": "The email address has been registered already",
"Exception: Please type an email address": "Please type an email address",
"Exception: Password too short": "Password too short (at least 9 characters)",
"Exception: Google Sign In failed":"Google Sign In failed",
"Exception: Apple Sign-In failed":"Apple Sign-In failed",
"Exception: Apple Sign-In cancelled":"Apple Sign-In cancelled",
"Exception: Google Sign In failed": "Google Sign In failed",
"Exception: Apple Sign-In failed": "Apple Sign-In failed",
"Exception: Apple Sign-In cancelled": "Apple Sign-In cancelled",
"Exception: Apple Sign In failure: email address is necessary": "Apple Sign In failure: email address is necessary",
"There is an error: during registration:": "There is an error: during registration:",
"Please select an exercise": "Please select an exercise",
"Cardio": "Cardio",
@ -51,7 +48,7 @@
"Aerobic": "Aerobic",
"Anaerobic": "Anaerobic",
"Cooper": "Cooper",
"Strength": "Strength",
"Strength": "Strength",
"Pushups": "Pushups",
"Timed Pushups": "Timed Pushups",
"Core": "Core",
@ -70,7 +67,6 @@
"Save Exercise": "Save Exercise of:",
"Save": "Save",
"Delete": "Delete",
"Name": "Name",
"Exercise": "Exercise",
"Quantity": "Quantity",
@ -80,17 +76,15 @@
"Yes": "Yes",
"No": "No",
"with": "with",
"Please repeat as much times as you can! MAXIMIZE it!":"Please repeat as much times as you can! MAXIMIZE it!",
"Please take a relative bigger weight and repeat 12-20 times and do your best! MAXIMIZE it!":"Please take a relative bigger weight and repeat 12-20 times and do your best! MAXIMIZE it!",
"Do you save this exercise with these parameters?":"Do you save this exercise with these parameters?",
"Did you try the MAXIMUM what you can do? Are you sure we save the exercise with ONLY 12 repeats?":"Did you try the MAXIMUM what you can do? Are you sure we save the exercise with ONLY 12 repeats?",
"Please repeat as much times as you can! MAXIMIZE it!": "Please repeat as much times as you can! MAXIMIZE it!",
"Please take a relative bigger weight and repeat 12-20 times and do your best! MAXIMIZE it!": "Please take a relative bigger weight and repeat 12-20 times and do your best! MAXIMIZE it!",
"Do you save this exercise with these parameters?": "Do you save this exercise with these parameters?",
"Did you try the MAXIMUM what you can do? Are you sure we save the exercise with ONLY 12 repeats?": "Did you try the MAXIMUM what you can do? Are you sure we save the exercise with ONLY 12 repeats?",
"The number of the exercise": "The number of the exercise",
"The number of the exercise done with": "The number of the exercise done with",
"Please repeat with": "Please repeat with",
"Execute the": "Execute the",
"set!":"set!",
"set!": "set!",
"repeat": "repeat",
"meter": "meter",
"percent": "percent",
@ -98,11 +92,10 @@
"kilogram": "kilogram",
"lbs": "lbs",
"second": "second",
"Email": "Email",
"Password": "Password",
"OR": "OR",
"Password (Leave empty if no change)":"Password (Leave empty if no change)",
"Password (Leave empty if no change)": "Password (Leave empty if no change)",
"First Name": "First Name",
"Birth Year": "Birth Year",
"Weight": "Weight",
@ -111,13 +104,12 @@
"Woman": "Woman",
"Next": "Next",
"Select a gender": "Select a gender",
"Set Your Primary Goal": "Set Your Primary Goal",
"Gain Muscle": "Gain Muscle",
"Loose Weight": "Loose Weight",
"Your Fitness State": "Your Fitness State",
"Fitness level": "Fitness level",
"Fitness Activity":"Fitness Activity",
"Fitness Activity": "Fitness Activity",
"Beginner": "Beginner",
"I am beginner": "I am beginner",
"Intermediate": "Intermediate",
@ -126,47 +118,39 @@
"I am advanced": "4+ times a week",
"Professional": "Professional",
"I am professional": "I am a professional",
"No item selected":"No item selected",
"No item selected": "No item selected",
"Your Body Type": "Your Body Type",
"Ectomorph": "Ectomorph",
"Endomorph": "Endomorph",
"Mesomorph": "Mesomorph",
"Ecto-Mesomorph": "Ecto-Mesomorph",
"Meso-Endomorph":"Meso-Endomorph",
"Meso-Endomorph": "Meso-Endomorph",
"Ectomorph_desc": "<p>Ectomorph is your body type if:<p><ul><li>You have basically a thin physique like a long-distance runner</li><li>Long limbs and narrow shoulders are typical of you</li><li>You have difficulties to build muscles</li><li>If your chest and waist are almost the same width</li><li>You lose muscle easily</li><li>You have a relatively low body fat percentage</li></ul><br/><br/><p>We cant talk about 100% matching of course but this data is very important for personalization. It happens sometime that an ectomorph can has excess fat. In this case, the thinness of joints and the behaviour of muscles are the crucial aspect.</p>",
"Endomorph_desc":"<p>This is your body type if you feel that your physique is the sharp opposite of ectomorph and:</p><ul><li>Despite of your strong-looking physique, your muscles are less visually outlined</li><li>Getting rid of excess fat is difficult for you</li><li>You get stronger very easily</li><li>Your rib cage is wide and large</li><li>You have thick and strong joints</li><li>If your hips are wide and strong</li></ul><p>We cant talk about 100% matching here too of course but this data is very important for personalization. It can happen that an endomorph is difficult to distinguish from a mesomorph.</p><p>In this case, check the size of the rib cage and the waist. From a side view, a mesomorph may have a flatter chest and abdomen compared to an originally strong and fleshy endomorph. All apple and pear shape are considered as endomorph.</p>",
"Mesomorph_desc":"<p>This is your body type if:</p><ul><li>You have an athletic physique like a sprinter, swimmer or gymnast</li><li>Wide clavicles and shoulders are typical of you</li><li>Your body is symmetrical</li><li>You have narrow hips and sporty, narrow waist</li><li>You have basically thinner joints but strong bones</li><li>Mesomorphs are more muscular than ectomorphs</li><li>You get muscular quickly</li><li>A mesomorph person has thicker bones and joints than an ectomorph</li><li>Your chest is wide compared to your waist</li><li>You have stronger calves and forearms than an ectomorph</li></ul><p>We cant talk about 100% matching here too of course but this data is very important for personalisation. A mesomorph person can also has excess fat. In this case, the hip/chest ratio and behaviour of muscles are the deciding factors.</p>",
"Endomorph_desc": "<p>This is your body type if you feel that your physique is the sharp opposite of ectomorph and:</p><ul><li>Despite of your strong-looking physique, your muscles are less visually outlined</li><li>Getting rid of excess fat is difficult for you</li><li>You get stronger very easily</li><li>Your rib cage is wide and large</li><li>You have thick and strong joints</li><li>If your hips are wide and strong</li></ul><p>We cant talk about 100% matching here too of course but this data is very important for personalization. It can happen that an endomorph is difficult to distinguish from a mesomorph.</p><p>In this case, check the size of the rib cage and the waist. From a side view, a mesomorph may have a flatter chest and abdomen compared to an originally strong and fleshy endomorph. All apple and pear shape are considered as endomorph.</p>",
"Mesomorph_desc": "<p>This is your body type if:</p><ul><li>You have an athletic physique like a sprinter, swimmer or gymnast</li><li>Wide clavicles and shoulders are typical of you</li><li>Your body is symmetrical</li><li>You have narrow hips and sporty, narrow waist</li><li>You have basically thinner joints but strong bones</li><li>Mesomorphs are more muscular than ectomorphs</li><li>You get muscular quickly</li><li>A mesomorph person has thicker bones and joints than an ectomorph</li><li>Your chest is wide compared to your waist</li><li>You have stronger calves and forearms than an ectomorph</li></ul><p>We cant talk about 100% matching here too of course but this data is very important for personalisation. A mesomorph person can also has excess fat. In this case, the hip/chest ratio and behaviour of muscles are the deciding factors.</p>",
"Description": "Description",
"Make your first test": "Make your first test",
"finished": "finished",
"Why do you need Exercise Control?" : "Why do you need Test Exercise?",
"Your 1RM:":"Your 1RM:",
"Your Real 1RM:":"Your Real 1RM:",
"Check":"Check",
"Why do you need Exercise Control?": "Why do you need Test Exercise?",
"Your 1RM:": "Your 1RM:",
"Your Real 1RM:": "Your Real 1RM:",
"Check": "Check",
"Control Exercise:": "Test Exercise:",
"controlexercise_desc":"<p>Why is a test exercise necessary?</p><br/><p>Why do we recommend completing them?</p><p>If you complete the test exercises in a proper way and as described, the application will give you an accurate view of your muscle strength and endurance condition.</p><p> Based on this, you can perform the exercises in a customized way later.</p><p> What does it mean?</p><p> This means that the app can determine the right WEIGHT for you to achieve your goal and the associated number of REPETATIONS. This is the key to success!</p><p> Furthermore, you can also create your own training day in the custom training plan menu within the app.</p><p> Dont forget! The test will provide feedback only about your current condition. If you would like to improve continuously, you need to return to the 1RM or Endurance Tests every 3-6 weeks.</p><p> Cmon go for it!</p>",
"Summary of your test":"Summary of your test",
"Test":"Test",
"controlexercise_desc": "<p>Why is a test exercise necessary?</p><br/><p>Why do we recommend completing them?</p><p>If you complete the test exercises in a proper way and as described, the application will give you an accurate view of your muscle strength and endurance condition.</p><p> Based on this, you can perform the exercises in a customized way later.</p><p> What does it mean?</p><p> This means that the app can determine the right WEIGHT for you to achieve your goal and the associated number of REPETATIONS. This is the key to success!</p><p> Furthermore, you can also create your own training day in the custom training plan menu within the app.</p><p> Dont forget! The test will provide feedback only about your current condition. If you would like to improve continuously, you need to return to the 1RM or Endurance Tests every 3-6 weeks.</p><p> Cmon go for it!</p>",
"Summary of your test": "Summary of your test",
"Test": "Test",
"1st Control": "1st Test Exercise",
"2nd Control": "2nd Test Exercise",
"3rd Control": "3rd Test Exercise",
"My Development":"Development",
"My Training Plan":"Training Plan",
"My Development": "Development",
"My Training Plan": "Training Plan",
"Please add an exercise plan": "Please add an exercise plan",
"Serie": "Serie",
"Repeats": "Repeats",
"Save The Exercise To The Exercise Plan": "Save The Exercise To The Exercise Plan",
"The number of the serie done with":"The number of the serie done with",
"The number of the repeats of one serie":"The number of the repeats of one serie",
"reps":"reps",
"The number of the serie done with": "The number of the serie done with",
"The number of the repeats of one serie": "The number of the repeats of one serie",
"reps": "reps",
"1. Chest": "1. Chest",
"2. Biceps": "2. Biceps",
"3. Triceps": "3. Triceps",
@ -175,29 +159,25 @@
"6. Core": "6. Core",
"7. Thigh": "7. Thigh",
"8. Calf": "8. Calf",
"Execute My Selected Training Plan": "Execute My Selected Training Plan",
"Edit My Custom Plan": "Create My Custom Plan",
"Suggested Training Plan": "Suggested Training Plan",
"My Special Plan": "My Special Plan",
"Training Programs":"Training Programs",
"Training Programs": "Training Programs",
"My Trainee's Plan": "My Trainee's Plan",
"Execute My Trainee's Training Plan": "Execute My Trainee's Training Plan",
"My Exercise Logs": "My Exercise Logs",
"My Whole Body Development": "My Whole Body Development",
"Development Of Muscles": "Development Of Muscles",
"Predictions": "Predictions",
"My Trainee's Exercise Logs": "My Trainee's Exercise Logs",
"My Development By Muscle": "My Development By Muscle",
"Here you see you development in the last period." : "Here you see your development in the last period.",
"Sum Of Mass":"Sum Of Mass",
"Here you see you development in the last period.": "Here you see your development in the last period.",
"Sum Of Mass": "Sum Of Mass",
"Percent": "Percent",
"One Rep Max": "One Rep Max",
"OneRepMax": "One Rep Max",
"onerepmax_desc": "<p>Knowing the maximum of one repetition which also known as 1RM, can be important to you in calculating the right WEIGHT and REPEAT for you. Execute the test correctly!</p><p>This way we can suggest the weights and repetitions that are best for you later. If building muscle or strength is your goal, it is essential to do the 1RM tests!</p><p><b>What is 1RM?</b></p><p>This is the weight what you are able to move at once properly. Upon the maximum weight exercise is performed correctly, we can derive the weight and number of repetitions which fits to your goals.</p>",
"Detailed": "Detailed",
"Weekly": "Weekly",
"Monthly": "Monthly",
@ -205,14 +185,11 @@
"times!": "times!",
"Please repeat with ": "Please repeat with ",
"max times!": "max times!",
"Execute your active Exercise Plan!": "Execute your active Exercise Plan!",
"Select the muscle type and tap on the exercise. One the next page enter the weight and repeat.": "Select the muscle type and tap on the exercise. One the next page enter the weight and repeat.",
"Custom Exercise Plan": "Custom Exercise Plan",
"Select manually the exercises what you would like to have in your plan. At the end don't forget to save.": "Select manually the exercises what you would like to have in your plan. At the end don't forget to save.",
"In this list you will find all your executed exercises grouped by the date.": "In this list you can find all your completed exercises sorted by the date.",
"Persistence!": "Persistence!",
"Greetings!": "Greetings!",
"The purpose is to measure you physical condition": "The purpose is to measure your physical condition. Your first goal is to test all your muscle regions with a 'base' exercise.",
@ -221,7 +198,7 @@
"Please continue your tests with a": "Please continue your tests with a",
"I suggest begin your tests with a": "I suggest begin your tests with a 'chest' exercise",
"Nice! This is a good start": "Nice! This is a good start",
"Go on!":"Go on!",
"Go on!": "Go on!",
"You are on track": "You are on track",
"Not so much left": "Not so much left",
"Almost!": "Almost done!",
@ -232,183 +209,162 @@
"Back": "Back",
"Thigh": "Thigh",
"Calf": "Calf",
"Bring me there": "Bring me there",
"My Body Development": "My Body Development",
"You see here your whole body development by muscle groups.": "You see here your whole body development by muscle groups.",
"Are you sure to logout?": "Are you sure to logout?",
"hu_with": " ",
"Are you sure to delete this exercise?": "Are you sure to delete this exercise?",
"I forgot the password":"I forgot the password",
"I forgot the password": "I forgot the password",
"Exception: Instance of 'NotFoundException'": "Customer with the email not found. Please register or reset your password",
"Customer does not exist or the password is wrong": "Customer does not exist or the password is wrong",
"The email does not exist or the password is wrong": "Customer does not exist or the password is wrong",
"Exception: You have a previous Facebook login operation in progress":"You have a previous Facebook login operation in progress",
"Exception: Facebook login was not successful":"Facebook login was not successful",
"Exception: Facebook login cancelled":"Facebook login cancelled",
"Exception: Facebook login failed":"Facebook login failed",
"Exception: You have a previous Facebook login operation in progress": "You have a previous Facebook login operation in progress",
"Exception: Facebook login was not successful": "Facebook login was not successful",
"Exception: Facebook login cancelled": "Facebook login cancelled",
"Exception: Facebook login failed": "Facebook login failed",
"Exception: The account exists with different credential": "The account exists with different credential",
"More »": "More »",
"Done": "Done",
"Height":"Height",
"Actual Height":"Height",
"Actual Weight":"Bodyweight",
"Bodyweight":"Bodyweight",
"Based on your weight and height your goal for BMI and weight:":"Based on your bodyweight and height your goal for BMI and weight:",
"Body Mass Index":"Body Mass Index",
"first step":"first step",
"Height": "Height",
"Actual Height": "Height",
"Actual Weight": "Bodyweight",
"Bodyweight": "Bodyweight",
"Based on your weight and height your goal for BMI and weight:": "Based on your bodyweight and height your goal for BMI and weight:",
"Body Mass Index": "Body Mass Index",
"first step": "first step",
"Step": "Step",
"goal":"goal",
"Basal Metabolic Rate":"Basal Metabolic Rate",
"Resting Metabolic Rate":"Resting Metabolic Rate",
"Resting metabolic rate is the rate at which your body burns energy when it is at complete rest.":"Resting metabolic rate is the rate at which your body burns energy when it is at complete rest.",
"Based on your weight, height and activity your BMR value":"Based on your bodyweight, height and activity this is your daily calory demand.",
"Your Sizes":"Your Sizes",
"Size Of Your":"Size Of Your",
"Please type the following data:":"Please type the following data:",
"goal": "goal",
"Basal Metabolic Rate": "Basal Metabolic Rate",
"Resting Metabolic Rate": "Resting Metabolic Rate",
"Resting metabolic rate is the rate at which your body burns energy when it is at complete rest.": "Resting metabolic rate is the rate at which your body burns energy when it is at complete rest.",
"Based on your weight, height and activity your BMR value": "Based on your bodyweight, height and activity this is your daily calory demand.",
"Your Sizes": "Your Sizes",
"Size Of Your": "Size Of Your",
"Please type the following data:": "Please type the following data:",
"Cancel": "Cancel",
"Available Devices":"Available Devices",
"select your equipments by tapping":"select your equipments by tapping",
"Available Equipments":"Available Equipments",
"select your places by tapping":"select your places by tapping",
"Available Training Places":"Available Training Places",
"Please take a relative bigger weight and repeat 12-30 times":"Please take a relative bigger weight and repeat 12-30 times",
"Please take a medium weight and repeat 20-30 times":"Please take a medium weight and repeat 20-30 times",
"Equipment Filter":"Equipment Filter",
"Live-Server":"Live-Server",
"Test-Server":"Test-Server",
"All Exercises has been filtered out":"All Exercises has been filtered out",
"base":"base",
"Hypertrophy":"Hypertrophy",
"Gain Strength":"Gain Strength",
"repeats":"repeats",
"minutes":"minutes",
"Rest time":"Rest time",
"Suggestions based on your test":"Suggestions based on your test",
"Repeats volume":"Repeats volume",
"Weight volume":"Weight volume",
"Calorie":"Calorie",
"Max BPM":"Max BPM",
"Min BPM":"Min BPM",
"Average BPM":"Average BPM",
"Fatburn %":"Fatburn %",
"Health Data Summary":"Health Data Summary",
"Congratulation!":"Congratulation!",
"You have achieved to first 100% test-round!":"You have achieved to first 100% test round!",
"Now you unlocked: Development By Muscles and the Suggested Trainings Plan":"Now you have unlocked: Development By Muscles and the Suggested Trainings Plan",
"Available Devices": "Available Devices",
"select your equipments by tapping": "select your equipments by tapping",
"Available Equipments": "Available Equipments",
"select your places by tapping": "select your places by tapping",
"Available Training Places": "Available Training Places",
"Please take a relative bigger weight and repeat 12-30 times": "Please take a relative bigger weight and repeat 12-30 times",
"Please take a medium weight and repeat 20-30 times": "Please take a medium weight and repeat 20-30 times",
"Equipment Filter": "Equipment Filter",
"Live-Server": "Live-Server",
"Test-Server": "Test-Server",
"All Exercises has been filtered out": "All Exercises has been filtered out",
"base": "base",
"Hypertrophy": "Hypertrophy",
"Gain Strength": "Gain Strength",
"repeats": "repeats",
"minutes": "minutes",
"Rest time": "Rest time",
"Suggestions based on your test": "Suggestions based on your test",
"Repeats volume": "Repeats volume",
"Weight volume": "Weight volume",
"Calorie": "Calorie",
"Max BPM": "Max BPM",
"Min BPM": "Min BPM",
"Average BPM": "Average BPM",
"Fatburn %": "Fatburn %",
"Health Data Summary": "Health Data Summary",
"Congratulation!": "Congratulation!",
"You have achieved to first 100% test-round!": "You have achieved to first 100% test round!",
"Now you unlocked: Development By Muscles and the Suggested Trainings Plan": "Now you have unlocked: Development By Muscles and the Suggested Trainings Plan",
"The": "The",
"the first":"the first",
"the second":"the second",
"the third":"the third",
"Go Premium":"Go Premium",
"Unleash your potential with WorkoutTest Premium!":"Unleash your potential with WorkoutTest Premium!",
"feature is reachable after you finished":"feature is reachable after you finished",
"100% test circles":"100% test rounds",
"Keep testing":"Keep Testing",
"Enjoy also this premium fetaure to show all old evaluation data of your successful exercises.":"Enjoy also this premium fetaure to show all old evaluation data of your successful exercises.",
"Please define your Exercise Plan":"Please define your Exercise Plan",
"Go to: 'Training Plan' - 'Edit My Custom Plan'":"Go to: 'Training Plan' - 'Edit My Custom Plan'",
"Jump there »":"Jump there »",
"Exception: Purchase was not successful":"Purchase was not successful",
"Exception: Purchase was cancelled":"Purchase was cancelled",
"the first": "the first",
"the second": "the second",
"the third": "the third",
"Go Premium": "Go Premium",
"Unleash your potential with WorkoutTest Premium!": "Unleash your potential with WorkoutTest Premium!",
"feature is reachable after you finished": "feature is reachable after you finished",
"100% test circles": "100% test rounds",
"Keep testing": "Keep Testing",
"Enjoy also this premium fetaure to show all old evaluation data of your successful exercises.": "Enjoy also this premium fetaure to show all old evaluation data of your successful exercises.",
"Please define your Exercise Plan": "Please define your Exercise Plan",
"Go to: 'Training Plan' - 'Edit My Custom Plan'": "Go to: 'Training Plan' - 'Edit My Custom Plan'",
"Jump there »": "Jump there »",
"Exception: Purchase was not successful": "Purchase was not successful",
"Exception: Purchase was cancelled": "Purchase was cancelled",
"Successful Purchase": "Successful Purchase",
"Now you can use the premium features of WorkoutTest!":"Now you can use the premium features of WorkoutTest!",
"Progressindicator for the tests":"Where do you stand achieving your tests?",
"Progressindicator_desc":"<p>It shows which muscle group test did your achieved already.</p><h2>When do you reach the 100% test round?</h2><br/><p>If you have sucessfully tested one of the <strong>base</strong> exercises of each muscle group</p>",
"Unleash Your Development Now!":"Commit To Your Development",
"Learn about your development, enjoy AI-driven predictions of all of your skills and bodyparts.":"Learn about your development, enjoy AI-driven predictions of all of your skills and bodyparts.",
"Subscription Conditions":"Subscription Conditions",
"Payment will be charged to your account. Subscription automatically renews unless auto-renew is turned off at least 24 hours before the end of the current period":"Payment will be charged to your account. Subscription automatically renews unless auto-renew is turned off at least 24 hours before the end of the current period",
"Account will be charged for renewal within 24 hours prior to the end of the current period":"Account will be charged for renewal within 24 hours prior to the end of the current period",
"Montly":"Montly",
"Annual":"Annual",
"Predictions with Artificial Intelligence":"Predictions with Artificial Intelligence",
"14% discount":"14% discount",
"2 months free":"2 months free",
"Development programs":"Development programs",
"Suggestions based on your actual status":"Suggestions based on your actual status",
"Special customized training plans":"Special customized training plans",
"Or type the time manually:":"Or type the time manually",
"sec":"sec",
"min":"min",
"Edit Profile":"Edit Profile",
"Activity":"Activity",
"Body Type":"Body Type",
"Set your fitness level":"Set your fitness level",
"Set your body type":"Set your body type",
"These equipments and devices are available":"These equipments and devices are available",
"Successful Registration":"Successful Registration",
"Now we would like to know you better to lift the experience of the app.":"Now we would like to know you better to lift the experience of the app.",
"Please go through the pages, it will take couple of minutes!":"Please go through the pages, it will take couple of minutes!",
"Body Type Analyser":"Body Type Analyser",
"How likely is it true about you?":"How likely is it true about you?",
"Very unlikely":"Not True",
"Maybe":"Maybe",
"Very likely":"True",
"« Back":"« Back",
"1. Basicly I am skinny and bonny":"1. I have basically a thin and bony physique",
"2. question":"2. Long limbs and narrow shoulders are typical of me",
"3. question":"3. It is difficult for me to build muscle",
"4. question":"4. My chest and waist are nearly the same width",
"5. question":"5. Chopstick was my nickname in the kindergarten",
"6. question":"6. I easily lose the muscle I built up",
"7. question":"7. To my knowledge, my body fat percentage is low",
"8. question":"8. Basically, I have a sporty and athletic physique",
"9. question":"9. I have a wide collarbone and shoulders",
"10. question":"10. My hips are narrow and my waist is sporty",
"11. question":"11. I get muscular quickly",
"12. question":"12. My chest is wider than my waist",
"13. question":"13. I could be the statue of David",
"14. question":"14. I have a strong calf and forearm",
"15. question":"15. I have a wide rib cage",
"16. question":"16. I have thick and wide joints",
"17. question":"17. My bones are strong",
"18. question":"18. My body is muscular but a little fatter",
"19. question":"19. My hips are wider than my chest",
"20. question":"20. Tun could be my nickname too",
"21. question":"21. I lose weight hard and gain weight more easily",
"22. question":"22. I have a strong and chunky physique",
"Your Bodytype result":"Your Bodytype result",
"Change the weight to":"Change the weight to",
"Search Exercises...":"Search Exercises...",
"No exercise found":"No exercise found",
"Edit Your Training Test Set":"Edit Your Training Test Set",
"Start training":"Start training",
"Enjoy the exercises, good luck with the testing!":"Enjoy the exercises, good luck with the testing!",
"Please continue with the next exercise in the queue:":"Please continue with the next exercise in the queue:",
"Or, you can redifine this exercise queue in the Compact Test menu":"Or, you can redifine this exercise queue in the Compact Test menu",
"you are able to do 12-20 repeats with":"you are able to do 12-20 repeats with",
"You have an active Test Set!":"You have an active Test Set!",
"Do you want to override it?":"Do you want to override it?",
"Press OK to continue":"Press OK to continue",
"Continue":"Continue",
" your ":" your ",
"\nyour plan is available for 24 hours":"\nyour plan is available for 24 hours",
"Start":"Start",
"Compact Test":"Compact Test",
"Custom Test":"Custom Test",
"Now you can use the premium features of WorkoutTest!": "Now you can use the premium features of WorkoutTest!",
"Progressindicator for the tests": "Where do you stand achieving your tests?",
"Progressindicator_desc": "<p>It shows which muscle group test did your achieved already.</p><h2>When do you reach the 100% test round?</h2><br/><p>If you have sucessfully tested one of the <strong>base</strong> exercises of each muscle group</p>",
"Unleash Your Development Now!": "Commit To Your Development",
"Learn about your development, enjoy AI-driven predictions of all of your skills and bodyparts.": "Learn about your development, enjoy AI-driven predictions of all of your skills and bodyparts.",
"Subscription Conditions": "Subscription Conditions",
"Payment will be charged to your account. Subscription automatically renews unless auto-renew is turned off at least 24 hours before the end of the current period": "Payment will be charged to your account. Subscription automatically renews unless auto-renew is turned off at least 24 hours before the end of the current period",
"Account will be charged for renewal within 24 hours prior to the end of the current period": "Account will be charged for renewal within 24 hours prior to the end of the current period",
"Montly": "Montly",
"Annual": "Annual",
"Predictions with Artificial Intelligence": "Predictions with Artificial Intelligence",
"14% discount": "14% discount",
"2 months free": "2 months free",
"Development programs": "Development programs",
"Suggestions based on your actual status": "Suggestions based on your actual status",
"Special customized training plans": "Special customized training plans",
"Or type the time manually:": "Or type the time manually",
"sec": "sec",
"min": "min",
"Edit Profile": "Edit Profile",
"Activity": "Activity",
"Body Type": "Body Type",
"Set your fitness level": "Set your fitness level",
"Set your body type": "Set your body type",
"These equipments and devices are available": "These equipments and devices are available",
"Successful Registration": "Successful Registration",
"Now we would like to know you better to lift the experience of the app.": "Now we would like to know you better to lift the experience of the app.",
"Please go through the pages, it will take couple of minutes!": "Please go through the pages, it will take couple of minutes!",
"Body Type Analyser": "Body Type Analyser",
"How likely is it true about you?": "How likely is it true about you?",
"Very unlikely": "Not True",
"Maybe": "Maybe",
"Very likely": "True",
"« Back": "« Back",
"1. Basicly I am skinny and bonny": "1. I have basically a thin and bony physique",
"2. question": "2. Long limbs and narrow shoulders are typical of me",
"3. question": "3. It is difficult for me to build muscle",
"4. question": "4. My chest and waist are nearly the same width",
"5. question": "5. Chopstick was my nickname in the kindergarten",
"6. question": "6. I easily lose the muscle I built up",
"7. question": "7. To my knowledge, my body fat percentage is low",
"8. question": "8. Basically, I have a sporty and athletic physique",
"9. question": "9. I have a wide collarbone and shoulders",
"10. question": "10. My hips are narrow and my waist is sporty",
"11. question": "11. I get muscular quickly",
"12. question": "12. My chest is wider than my waist",
"13. question": "13. I could be the statue of David",
"14. question": "14. I have a strong calf and forearm",
"15. question": "15. I have a wide rib cage",
"16. question": "16. I have thick and wide joints",
"17. question": "17. My bones are strong",
"18. question": "18. My body is muscular but a little fatter",
"19. question": "19. My hips are wider than my chest",
"20. question": "20. Tun could be my nickname too",
"21. question": "21. I lose weight hard and gain weight more easily",
"22. question": "22. I have a strong and chunky physique",
"Your Bodytype result": "Your Bodytype result",
"Change the weight to": "Change the weight to",
"Search Exercises...": "Search Exercises...",
"No exercise found": "No exercise found",
"Edit Your Training Test Set": "Edit Your Training Test Set",
"Start training": "Start training",
"Enjoy the exercises, good luck with the testing!": "Enjoy the exercises, good luck with the testing!",
"Please continue with the next exercise in the queue:": "Please continue with the next exercise in the queue:",
"Or, you can redifine this exercise queue in the Compact Test menu": "Or, you can redifine this exercise queue in the Compact Test menu",
"you are able to do 12-20 repeats with": "you are able to do 12-20 repeats with",
"You have an active Test Set!": "You have an active Test Set!",
"Do you want to override it?": "Do you want to override it?",
"Press OK to continue": "Press OK to continue",
"Continue": "Continue",
" your ": " your ",
"\nyour plan is available for 24 hours": "\nyour plan is available for 24 hours",
"Start": "Start",
"Compact Test": "Compact Test",
"Custom Test": "Custom Test",
"Set": "Set",
"Add this exercise to execute it paralell":"Add this exercise to execute it paralell",
"Add this exercise to execute it paralell": "Add this exercise to execute it paralell",
"very_poor": "Very Poor",
"poor": "Poor",
"below_average": "Below Average",
@ -417,75 +373,86 @@
"good": "Good",
"excellent": "Excellent",
"elite": "Elite",
"Training":"Training",
"Growth":"Growth",
"Compared with...":"Compared with...",
"your best":"your best",
"your last":"your last",
"best":"best",
"last":"last",
"volumen":"volumen",
"Get the Fastlane to your":"Get the Fastlane to your",
"Development":"Development",
"How can serve you this result?":"How can serve you this result?",
"Go":"Go",
"Result":"Result",
"Name too short":"Name too short",
"No, bring me there":"No, bring me there",
"You are about to add a new parallel test":"You are about to add a new parallel test",
"Your Primary Sport":"Your Primary Sport",
"and":"and",
"Sport":"Sport",
"Goal":"Goal",
"Training": "Training",
"Growth": "Growth",
"Compared with...": "Compared with...",
"your best": "your best",
"your last": "your last",
"best": "best",
"last": "last",
"volumen": "volumen",
"Get the Fastlane to your": "Get the Fastlane to your",
"Development": "Development",
"How can serve you this result?": "How can serve you this result?",
"Go": "Go",
"Result": "Result",
"Name too short": "Name too short",
"No, bring me there": "No, bring me there",
"You are about to add a new parallel test": "You are about to add a new parallel test",
"Your Primary Sport": "Your Primary Sport",
"and": "and",
"Sport": "Sport",
"Goal": "Goal",
"gain_muscle": "Gain Muscle",
"gain_strength": "Gain Strength",
"weight_loss":"Weight Loss",
"weight_loss": "Weight Loss",
"muscle_endurance": "Muscle Endurance",
"flexibility":"Flexibility",
"explosiveness":"Explosiveness",
"shape_forming":"Shape Forming",
"flexibility": "Flexibility",
"explosiveness": "Explosiveness",
"shape_forming": "Shape Forming",
"endurance": "Endurance",
"Set your primary goal":"Set your primary goal",
"Set your primary goal": "Set your primary goal",
"Endurance": "Endurance",
"Muscle Endurance": "Muscle Endurance",
"Flexibility":"Flexibility",
"Explosiveness":"Explosiveness",
"Shape Forming":"Shape Forming",
"Loss Weight":"Loss Weight",
"Skip":"Skip",
"Exception: Network error, try again later!":"Network error, try again later!",
"Flexibility": "Flexibility",
"Explosiveness": "Explosiveness",
"Shape Forming": "Shape Forming",
"Loss Weight": "Loss Weight",
"Skip": "Skip",
"Exception: Network error, try again later!": "Network error, try again later!",
"Exception: Exception: Network Error, please try again later": "Exception: Network Error, please try again later",
"Warning":"Warning",
"No Registration":"No Registration",
"You will skip the registration process.":"You will skip the registration process.",
"Please take a short tour in the app":"Please take a short tour in the app",
"No Login":"No Login",
"You will skip the login.":"You will skip the login.",
"The app functionalitity will be restricted, but please take a tour!":"The app functionalitity will be restricted, but please take a tour!",
"Activating the basic tutorial":"Activating the basic tutorial",
"Basic Tutorial":"Tutorial",
"Activate":"Activate",
"Try free for 3 days!":"Try it without risk for 3 days! In this period you can cancel any time without lasting your account.",
"View other alternatives":"View other alternatives",
"Please log in, because we can calculate the best suggestions for you":"Please log in, because we can calculate the best suggestions for you",
"My Active Training":"My Active Training",
"My Custom Plan":"My Custom Plan",
"Training Plans for Beginners":"Training Plans for Beginners",
"Training Plans for Home":"Training Plans for Home",
"Training Plans Advanced":"Training Plans Advanced",
"Training Plans for Women":"Training Plans for Women",
"Training Plans of Celebrities":"Training Plans of Celebrities",
"Training Plans for Gain Strength":"Training Plans for Gain Strength"
"Warning": "Warning",
"No Registration": "No Registration",
"You will skip the registration process.": "You will skip the registration process.",
"Please take a short tour in the app": "Please take a short tour in the app",
"No Login": "No Login",
"You will skip the login.": "You will skip the login.",
"The app functionalitity will be restricted, but please take a tour!": "The app functionalitity will be restricted, but please take a tour!",
"Activating the basic tutorial": "Activating the basic tutorial",
"Basic Tutorial": "Tutorial",
"Activate": "Activate",
"Try free for 3 days!": "Try it without risk for 3 days! In this period you can cancel any time without lasting your account.",
"View other alternatives": "View other alternatives",
"Please log in, because we can calculate the best suggestions for you": "Please log in, because we can calculate the best suggestions for you",
"My Active Training": "My Active Training",
"My Custom Plan": "My Custom Plan",
"Training Plans for Beginners": "Training Plans for Beginners",
"Training Plans for Home": "Training Plans for Home",
"Training Plans Advanced": "Training Plans Advanced",
"Training Plans for Women": "Training Plans for Women",
"Training Plans of Celebrities": "Training Plans of Celebrities",
"Training Plans for Gain Strength": "Training Plans for Gain Strength",
"The training is finished": "The training is finished",
"Do you want to restart, or select a new Training Plan?": "Do you want to restart, or select a new Training Plan?",
"New Training Plan": "New Training Plan",
"Restart": "Restart",
"Training Day": "Training Day",
"No Active Training Plan": "No Active Training Plan",
"Please select one in the Training menu, or create your custom plan": "Please select one in the Training menu, or create your custom plan",
"Continue your training": "Continue your training",
"Start your training": "Start your training",
"Why Test?": "Why Test?",
"This is your first exercise after at least 3 weeks.": "This is your first exercise after at least 3 weeks.",
"The first exercise will be a test. The following sets will be recalculated base on your test.": "The first exercise will be a test. The following sets will be recalculated base on your test.",
"This is the most optimal way for your development": "This is the most optimal way for your development",
"You want to skip really this exercise?": "You want to skip really this exercise?",
"You have an active Training Plan!": "You have an active Training Plan",
"Finish!": "Finish!",
"Resting time": "Resting time",
"Day": "Day",
"Reps": "Reps",
"Do you want to override it with": "Do you want to override it with",
"Calculated Weight": "Calculated Weight",
"The weight is based on your previuos tests - if they exist.": "The weight is based on your previuos tests - if they exist.",
"If it does not exist, your very first exercise will be a test.": "If it does not exist, your very first exercise will be a test."
}

View File

@ -14,9 +14,9 @@
"SignUp": "Regisztráció",
"SignUpLink": "Regisztráció",
"SignUp with Email": "Email Regisztráció",
"Exception: Please accept our data policy":"Kérlek fogadd el az adatvédelmi szabályzatunkat",
"Please accept our data protection policy.":"Kérlek fogadd el az adatvédelmi szabályzatunkat.",
"For more information please click on 'Privacy'":"További információkért kattints az 'Adatkezelés' linkre.",
"Exception: Please accept our data policy": "Kérlek fogadd el az adatvédelmi szabályzatunkat",
"Please accept our data protection policy.": "Kérlek fogadd el az adatvédelmi szabályzatunkat.",
"For more information please click on 'Privacy'": "További információkért kattints az 'Adatkezelés' linkre.",
"Privacy": "Adatkezelés",
"Change App Language": "Nyelvválasztás",
"English": "Angol",
@ -26,7 +26,6 @@
"Settings": "Beállítások",
"Profile": "Személyes adatok",
"Selected Language": "Választott nyelv",
"Please log in": "Kérlek jelentkezz be",
"Exception: Please log in": "Kérlek jelentkezz be",
"Exception: Customer does not exist or the password is wrong": "A felhasználónév nem létezik vagy a jelszó rossz.",
@ -37,17 +36,16 @@
"Exception: Facebook signup was not successful. Please try another method": "Facebook regisztráció sikertelen. Kérlek próbálj mással regisztrálni",
"Exception: Please type an email address": "Kérlek írj be egy email címet",
"Exception: Password too short": "A jelszó min. 9 karakterből álljon",
"Exception: You have a previous Facebook login operation in progress":"Az előző bejelentkezés még folyamatban van.",
"Exception: Facebook login cancelled":"Facebook bejelentkezés megszakítva ",
"Exception: Facebook login failed":"Facebook bejelentkezés sikertelen",
"Exception: The email address has been registered already":"Ezzel email címmel már regisztráltak",
"Exception: Exception: The email address has been registered already":"Ezzel email címmel már regisztráltak",
"Exception: Google Sign In failed":"Google bejelentkezés sikertelen",
"Exception: Apple Sign-In failed":"Apple bejelentkezés sikertelen",
"Exception: Apple Sign-In cancelled":"Apple bejelentkezés megszakítva",
"Exception: You have a previous Facebook login operation in progress": "Az előző bejelentkezés még folyamatban van.",
"Exception: Facebook login cancelled": "Facebook bejelentkezés megszakítva ",
"Exception: Facebook login failed": "Facebook bejelentkezés sikertelen",
"Exception: The email address has been registered already": "Ezzel email címmel már regisztráltak",
"Exception: Exception: The email address has been registered already": "Ezzel email címmel már regisztráltak",
"Exception: Google Sign In failed": "Google bejelentkezés sikertelen",
"Exception: Apple Sign-In failed": "Apple bejelentkezés sikertelen",
"Exception: Apple Sign-In cancelled": "Apple bejelentkezés megszakítva",
"Exception: Apple Sign In failure: email address is necessary": "Apple bejelentkezés sikertelen: email cím szükséges.",
"Exception: The account exists with different credential": "A felhasználói fiók már létezik más névvel",
"Please select an exercise": "Válassz ki egy gyakorlatot",
"There is an error: during registration:": "Hiba lépett fel a regisztráció során:",
"Exception: Customer exists": "Ez az email cím már regisztrálva van",
@ -81,8 +79,7 @@
"The number of the exercise done with": "Írd be, mennyivel csináltad a gyakorlatot",
"Please repeat with": "Kérlek ismételd",
"Execute the": "Hajtsd végre a(z)",
"set!":"sorozatot!",
"set!": "sorozatot!",
"Name": "Vezetéknév",
"Exercise": "Gyakorlat",
"Quantity": "Mennyiség",
@ -92,10 +89,8 @@
"Yes": "Igen",
"No": "Nem",
"with": "",
"Do you save this exercise with these parameters?":"Elmented a gyakorlatot?",
"Did you try the MAXIMUM what you can do? Are you sure we save the exercise with ONLY 12 repeats?":"Mindent beleadtál, ez a MAXIMUM, amit végre tudtál hajtani? Biztos vagy benne, hogy CSAK 12 ismétléssel mentsük el a gyakorlatot?",
"Do you save this exercise with these parameters?": "Elmented a gyakorlatot?",
"Did you try the MAXIMUM what you can do? Are you sure we save the exercise with ONLY 12 repeats?": "Mindent beleadtál, ez a MAXIMUM, amit végre tudtál hajtani? Biztos vagy benne, hogy CSAK 12 ismétléssel mentsük el a gyakorlatot?",
"repeat": "ismétlés",
"meter": "méter",
"percent": "százalék",
@ -103,11 +98,10 @@
"kilogram": "kilogramm",
"lbs": "lbs",
"second": "másodperc",
"Email": "Email",
"Password": "Jelszó",
"OR": "VAGY",
"Password (Leave empty if no change)":"Jelszó (üres, ha nincs változás)",
"Password (Leave empty if no change)": "Jelszó (üres, ha nincs változás)",
"First Name": "Keresztnév",
"Birth Year": "Születési év",
"Weight": "Tömeg",
@ -116,13 +110,12 @@
"Woman": "Nő",
"Next": "Tovább",
"Select a gender": "Válaszd ki a nemet",
"Set Your Primary Goal": "Mi az elsődleges célod?",
"Gain Muscle": "Izomépítés",
"Loose Weight": "Fogyás",
"Your Fitness State": "Milyen a fizikai állapotod?",
"Fitness level": "Fizikai állapot",
"Fitness Activity":"Fizikai aktivitás",
"Fitness Activity": "Fizikai aktivitás",
"Beginner": "Kezdő",
"I am beginner": "Kezdő / Újrakezdő vagyok",
"Intermediate": "Középhaladó",
@ -132,39 +125,30 @@
"Professional": "Professzionális",
"I am professional": "Professzionális sportoló vagyok",
"Your Body Type": "Milyen a testtípusod?",
"No item selected":"Nincs kiválasztott elem",
"No item selected": "Nincs kiválasztott elem",
"Ectomorph": "Ektomorf",
"Endomorph":"Endomorf",
"Mesomorph":"Mezomorf",
"Endomorph": "Endomorf",
"Mesomorph": "Mezomorf",
"Ecto-Mesomorph": "Ekto-Mesomorf",
"Meso-Endomorph":"Mezo-Endomorf",
"Ectomorph_desc": "<p>A Te testtípusod, ha:</p><ul><li>alapvetően vékony testalkat vagy, mint a hosszútávfutók</li><li>hosszú végtagok, keskenyebb vállak</li><li>nehezen tudsz izomtömeget növelni</li><li>Mellkas és a derék szinte egyforma szélességű</li><li>Könnyen elveszíted a felszedett izmot</li><li>Meglehetősen alacsony a testzsírszázalék jellemez</li></ul><p>Természetesen, mint a többi testtípusnál itt sem beszélhetünk 100%-os egyezésről, de fontos a választás a személyre szabottság érdekében. Előfordul, hogy egy ectomorph zsírfelesleggel is rendelkezik. Ekkor az ízületek vékonysága és az izomzat viselkedése a döntő szempont.</p>",
"Endomorph_desc":"<p>A te testtípusod, ha úgy érzed, hogy a testalkatod az ektomorf szöges ellentéte.</p><ul><li>Ha az erős megjelenésű testalkatod ellenére kevésbé érvényesülnek vizuálisan az izmok.</li><li>Ha nehezen szabadulsz meg a fölöslegtől</li><li>Nagyon könnyen erősödsz</li><li>Széles nagy térfogatú a bordakosár</li><li>Vastag erős ízületeid vannak</li><li>Ha a csípőben vagy erősebb</li></ul><p>Itt sem beszélhetünk 100%-os egyezésről, de fontos a személyre szabottság miatt. Előfordul, hogy egy endomorf nehezen különböztethető meg a mezomorftól. Ekkor vedd figyelembe a bordakosár méretét és a derekat. Oldalról egy mezomorf laposabb mellkassal, hassal rendelkezhet az eredendően „erős” tömöttebb endomorfhoz képest. Minden alma és körte forma ide sorolható.</p>",
"Mesomorph_desc":"<p>A testtípusod, ha</p><ul><li>Sportos testalkat vagy, mint egy sprinter, úszó vagy tornász</li><li>Széles kulcscsontok és vállak</li><li>Szimmetrikus felépítés</li><li>Keskeny csípő és sportos keskeny derék</li><li>alapvetően vékonyabb ízületek, de erős csontok jellemeznek</li><li>izmosabbak, mint az ektomorfok</li><li>Gyorsan izmosodsz</li><li>vastagabbak a csontok és az ízületek az ekromorfhoz képest</li><li>mellkas a derékhez képest széles</li><li>erősebb vádli és alkar</li></ul><p>Természetesen, mint a többi testtípusnál itt sem beszélhetünk 100%-os egyezésről, de fontos a személyre szabottság miatt. Előfordul, hogy egy mezomorf zsírfelesleggel is rendelkezik. Ekkor a csípőcsont/mellkas arány és az izomzat viselkedése a döntő szempont.</p>",
"Meso-Endomorph": "Mezo-Endomorf",
"Ectomorph_desc": "<p>A Te testtípusod, ha:</p><ul><li>alapvetően vékony testalkat vagy, mint a hosszútávfutók</li><li>hosszú végtagok, keskenyebb vállak</li><li>nehezen tudsz izomtömeget növelni</li><li>Mellkas és a derék szinte egyforma szélességű</li><li>Könnyen elveszíted a felszedett izmot</li><li>Meglehetősen alacsony a testzsírszázalék jellemez</li></ul><p>Természetesen, mint a többi testtípusnál itt sem beszélhetünk 100%-os egyezésről, de fontos a választás a személyre szabottság érdekében. Előfordul, hogy egy ectomorph zsírfelesleggel is rendelkezik. Ekkor az ízületek vékonysága és az izomzat viselkedése a döntő szempont.</p>",
"Endomorph_desc": "<p>A te testtípusod, ha úgy érzed, hogy a testalkatod az ektomorf szöges ellentéte.</p><ul><li>Ha az erős megjelenésű testalkatod ellenére kevésbé érvényesülnek vizuálisan az izmok.</li><li>Ha nehezen szabadulsz meg a fölöslegtől</li><li>Nagyon könnyen erősödsz</li><li>Széles nagy térfogatú a bordakosár</li><li>Vastag erős ízületeid vannak</li><li>Ha a csípőben vagy erősebb</li></ul><p>Itt sem beszélhetünk 100%-os egyezésről, de fontos a személyre szabottság miatt. Előfordul, hogy egy endomorf nehezen különböztethető meg a mezomorftól. Ekkor vedd figyelembe a bordakosár méretét és a derekat. Oldalról egy mezomorf laposabb mellkassal, hassal rendelkezhet az eredendően „erős” tömöttebb endomorfhoz képest. Minden alma és körte forma ide sorolható.</p>",
"Mesomorph_desc": "<p>A testtípusod, ha</p><ul><li>Sportos testalkat vagy, mint egy sprinter, úszó vagy tornász</li><li>Széles kulcscsontok és vállak</li><li>Szimmetrikus felépítés</li><li>Keskeny csípő és sportos keskeny derék</li><li>alapvetően vékonyabb ízületek, de erős csontok jellemeznek</li><li>izmosabbak, mint az ektomorfok</li><li>Gyorsan izmosodsz</li><li>vastagabbak a csontok és az ízületek az ekromorfhoz képest</li><li>mellkas a derékhez képest széles</li><li>erősebb vádli és alkar</li></ul><p>Természetesen, mint a többi testtípusnál itt sem beszélhetünk 100%-os egyezésről, de fontos a személyre szabottság miatt. Előfordul, hogy egy mezomorf zsírfelesleggel is rendelkezik. Ekkor a csípőcsont/mellkas arány és az izomzat viselkedése a döntő szempont.</p>",
"Description": "Leírás",
"Make your first test": "Végezd el az első tesztet",
"finished": "végrehajtva",
"Why do you need Exercise Control?": "Miért szükséges a tesztgyakorlat?",
"Your 1RM:":"Maxerőd (1RM):",
"Your Real 1RM:":"Ellenőrzött maxerő:",
"Check":"Ellenőrzés",
"My Development":"Fejlődésem",
"My Training Plan":"Edzéstervem",
"Your 1RM:": "Maxerőd (1RM):",
"Your Real 1RM:": "Ellenőrzött maxerő:",
"Check": "Ellenőrzés",
"My Development": "Fejlődésem",
"My Training Plan": "Edzéstervem",
"Please add an exercise plan": "Kérlek add meg az edzéstervet a gyakorlathoz",
"Serie": "Sorozat",
"Repeats": "Ismétlés",
"Save The Exercise To The Exercise Plan": "Gyakorlat mentése az edzéstervhez",
"The number of the serie done with":"Mennyi szériát csinálsz",
"The number of the repeats of one serie":"Hány ismétlést csinálsz egy gyakorlaton belül",
"The number of the serie done with": "Mennyi szériát csinálsz",
"The number of the repeats of one serie": "Hány ismétlést csinálsz egy gyakorlaton belül",
"1. Chest": "1. Mell",
"2. Biceps": "2. Bicepsz",
"3. Triceps": "3. Tricepsz",
@ -173,29 +157,24 @@
"6. Core": "6. Has",
"7. Thigh": "7. Comb",
"8. Calf": "8. Vádli",
"Execute My Selected Training Plan": "Edzésterv végrehajtása",
"Edit My Custom Plan": "Edzésterv létrehozása",
"Suggested Training Plan": "Javasolt edzésterv",
"My Special Plan": "Speciális edzésterv",
"Training Programs":"Edzés programok",
"My Trainee's Plan" : "Kliensem edzésterve",
"Training Programs": "Edzés programok",
"My Trainee's Plan": "Kliensem edzésterve",
"Execute My Trainee's Training Plan": "Kliensem edzéstervének végrehajtása",
"My Exercise Logs": "Edzésnaplóm",
"My Whole Body Development": "Testem fejlődése",
"Development Of Muscles": "Izomcsoportok fejlődése",
"Predictions": "Előrejelzések",
"My Trainee's Exercise Logs": "Kliensem edzésnaplőja",
"My Development By Muscle": "Izomcsoportok fejlődése",
"Here you see you development in the last period." : "A bevitt adatok alapján itt láthatod az izmaid fejlődését. Láthatod az össz megmozgatott súly, maxerő és a százalékos fejlődési diagramokat különböző időszaki bontásban.",
"Sum Of Mass":"Össztömeg",
"Here you see you development in the last period.": "A bevitt adatok alapján itt láthatod az izmaid fejlődését. Láthatod az össz megmozgatott súly, maxerő és a százalékos fejlődési diagramokat különböző időszaki bontásban.",
"Sum Of Mass": "Össztömeg",
"Percent": "Százalék",
"One Rep Max": "Maxerő",
"OneRepMax": "Maxerő",
"Detailed": "Részletes",
"Weekly": "Heti",
"Monthly": "Havi",
@ -203,13 +182,11 @@
"times!": "ismétléssel!",
"Please repeat with ": "Kérlek ismételd meg ",
"max times!": " max. számú ismétléssel!",
"Execute your active Exercise Plan!": "Hajtsd végre az aktív edzéstervedet",
"Select the muscle type and tap on the exercise. One the next page enter the weight and repeat.": "Válaszd ki az izomcsoporton belül a gyakorlatot, és a következő oldalon add meg a súlyt és az ismétlés számot.",
"Custom Exercise Plan": "Egyedi edzésterv",
"Select manually the exercises what you would like to have in your plan. At the end don't forget to save.": "Állítsd össze a kívánt edzésedet! Add meg a gyakorlatot, a kívánt sorozat, ismétlés és a súly mennyiségét. Ha nem vagy biztos bennük, tesztelj! Sorozatok után vidd be a valós adatokat! Jó edzést!",
"In this list you will find all your executed exercises grouped by the date.": "Ebben a listában találod az eddig végrehajtott gyakorlataid dátum szerint csoportosítva.",
"Persistence!": "Kitartás!",
"Greetings!": "Üdvözöllek!",
"The purpose is to measure you physical condition": "A cél a jelenlegi fizikai állapotod felmérése. Az első feladatod az összes izomcsoport tesztelése egy 'alap' gyakorlattal.",
@ -218,7 +195,7 @@
"Please continue your tests with a": "Kérlek folytasd tesztelést egy",
"I suggest begin your tests with a": "Azt javaslom, kezdd a teszteket egy 'mell' gyakorlattal",
"Nice! This is a good start": "Nagyon jó! Ez egy kitűnő start a teszthez",
"Go on!":"Gyerünk tovább!",
"Go on!": "Gyerünk tovább!",
"You are on track": "Jó úton haladsz",
"Not so much left": "Már nincs sok hátra",
"Almost!": "Majdnem a végén vagy!",
@ -229,186 +206,168 @@
"Back": "hát",
"Thigh": "comb",
"Calf": "vádli",
"Bring me there": "Vigyél oda",
"My Body Development": "Testem fejlődése",
"You see here your whole body development by muscle groups.": "Itt láthatod a tested fejlődését izomcsoportonként",
"Are you sure to logout?": "Biztos, hogy kijelentkezel?",
"hu_with": "-mal",
"Control Exercise:": "Tesztgyakorlat végrehajtása:",
"controlexercise_desc":"<h2>Miért csináld meg a tesztgyakorlatokat?</h2><p>Ha a leírtak szerint és szabályos végrehajtással végzed a tesztgyakorlatokat, akkor pontos képet ad az applikáció az izomerő és erőállóképesség állapotodról, ami alapján a későbbiekben testreszabottan tudod végezni a gyakorlatokat. </p><p>Ez mit jelent? Azt, hogy meghatározzuk számodra a célod eléréséhez megfelelő súlyt és a hozzátartozó ismétlésszámot, ami a siker kulcsa. Sőt! Az appon belül az egyéni edzésterv menüben össze is állíthatod magadnak a saját edzésnapodat.</p><p>Ne feledd! A teszt csak a jelen állapotodról ad visszaigazolást. Ha folyamatosan fejlődni szeretnél 3-6 hetente érdemes visszalátogatnod az 1RM vagy Erőállóképességi tesztekbe. Hajrá!</p>",
"Test":"Teszt",
"controlexercise_desc": "<h2>Miért csináld meg a tesztgyakorlatokat?</h2><p>Ha a leírtak szerint és szabályos végrehajtással végzed a tesztgyakorlatokat, akkor pontos képet ad az applikáció az izomerő és erőállóképesség állapotodról, ami alapján a későbbiekben testreszabottan tudod végezni a gyakorlatokat. </p><p>Ez mit jelent? Azt, hogy meghatározzuk számodra a célod eléréséhez megfelelő súlyt és a hozzátartozó ismétlésszámot, ami a siker kulcsa. Sőt! Az appon belül az egyéni edzésterv menüben össze is állíthatod magadnak a saját edzésnapodat.</p><p>Ne feledd! A teszt csak a jelen állapotodról ad visszaigazolást. Ha folyamatosan fejlődni szeretnél 3-6 hetente érdemes visszalátogatnod az 1RM vagy Erőállóképességi tesztekbe. Hajrá!</p>",
"Test": "Teszt",
"1st Control": "1. tesztgyakorlat",
"2nd Control": "2. tesztgyakorlat",
"3rd Control": "3. tesztgyakorlat",
"Summary of your test":"A teszt összefoglalása:",
"Summary of your test": "A teszt összefoglalása:",
"Are you sure to delete this exercise?": "Biztos, hogy törlöd a gyakorlatot?",
"I forgot the password":"Elfelejtett jelszó",
"I forgot the password": "Elfelejtett jelszó",
"Exception: Instance of 'NotFoundException'": "Ezzel az email címmel nem található felhasználó. Kérlek regisztálj vagy kérj jelszóemlékeztetőt",
"More »": "Részletek »",
"Done": "Kész",
"Height":"Magasság",
"Actual Height":"Magasság",
"Actual Weight":"Testtömeg",
"Bodyweight":"Testtömeg",
"Based on your weight and height your goal for BMI and weight:":"A jelenlegi adataid alapján kiszámoltuk Neked, hogy az ideális cél elérése érdekében az első lépést kell mihamarabb teljesítened. El tudod érni! Sok sikert!",
"Body Mass Index":"Testtömegindex",
"first step":"első lépés",
"goal":"cél",
"Basal Metabolic Rate":"Minimum energiaszükséglet",
"Resting metabolic rate is the rate at which your body burns energy when it is at complete rest.":"",
"Resting Metabolic Rate":"Alapanyagcsere",
"Based on your weight, height and activity your BMR value":"A megadott adataid és aktivitásod alapján megközelítőleg ennyi a napi kalóriaszükségleted.",
"Your Sizes":"Méreteid",
"Size Of Your":"Testméret:",
"Please type the following data:":"Kérlek írd be a következő adatot:",
"Height": "Magasság",
"Actual Height": "Magasság",
"Actual Weight": "Testtömeg",
"Bodyweight": "Testtömeg",
"Based on your weight and height your goal for BMI and weight:": "A jelenlegi adataid alapján kiszámoltuk Neked, hogy az ideális cél elérése érdekében az első lépést kell mihamarabb teljesítened. El tudod érni! Sok sikert!",
"Body Mass Index": "Testtömegindex",
"first step": "első lépés",
"goal": "cél",
"Basal Metabolic Rate": "Minimum energiaszükséglet",
"Resting metabolic rate is the rate at which your body burns energy when it is at complete rest.": "",
"Resting Metabolic Rate": "Alapanyagcsere",
"Based on your weight, height and activity your BMR value": "A megadott adataid és aktivitásod alapján megközelítőleg ennyi a napi kalóriaszükségleted.",
"Your Sizes": "Méreteid",
"Size Of Your": "Testméret:",
"Please type the following data:": "Kérlek írd be a következő adatot:",
"Cancel": "Mégsem",
"Available Devices":"Edzés eszközök",
"select your equipments by tapping":"válaszd ki az eszközeidet, kattints a képre",
"Available Equipments":"Elérhető eszközök",
"select your places by tapping":"kattints az edzéshelyszínre",
"Available Training Places":"Elérhető edzéshelyszínek",
"Please take a relative bigger weight and repeat 12-20 times and do your best! MAXIMIZE it!":"Válassz egy relatív nagyobb súlyt, amivel 12-20 közötti ismétlésre vagy képes, és adj bele mindent! MAXOLD KI!",
"Please repeat as much times as you can! MAXIMIZE it!":"Hajtsd végre a gyakorlatot, amennyiszer csak tudod! Ne állj meg, ha fáradt vagy, MAXOLD ki!",
"Please take a medium weight and repeat 20-30 times": "Válassz egy közepes súlyt, amivel maximum 20-30 közötti ismétlésre vagy képes",
"Equipment Filter":"Eszköz szűrő",
"Live-Server":"Live-Server",
"Test-Server":"Test-Server",
"All Exercises has been filtered out":"Az összes gyakorlatot kiszűrted",
"base":"alap",
"Hypertrophy":"Izomnövelés",
"Gain Strength":"Erőnövelés",
"repeats":"ismétlés",
"Rest time":"Pihenőidő",
"minutes":"perc",
"Suggestions based on your test":"Javaslatok a teszted alapján",
"Repeats volume":"Össz. ismétlés",
"Weight volume":"Össztömeg",
"Calorie":"Kalória",
"Max BPM":"Max pulzus",
"Min BPM":"Min pulzus",
"Average BPM":"Átl pulzus",
"Fatburn %":"Zsírégetés %",
"Health Data Summary":"Egészségadatok összefoglalás",
"reps":"ism.",
"Congratulation!":"Gratulálok!",
"You have achieved to first 100% test-round!":"Teljesítetted az első 100%-os tesztköröd!",
"Now you unlocked: Development By Muscles and the Suggested Trainings Plan":"Mostantól elérheted az 'Izomcsoportok fejlődése' és a 'Javasolt edzésterv' kategóriákat.",
"Available Devices": "Edzés eszközök",
"select your equipments by tapping": "válaszd ki az eszközeidet, kattints a képre",
"Available Equipments": "Elérhető eszközök",
"select your places by tapping": "kattints az edzéshelyszínre",
"Available Training Places": "Elérhető edzéshelyszínek",
"Please take a relative bigger weight and repeat 12-20 times and do your best! MAXIMIZE it!": "Válassz egy relatív nagyobb súlyt, amivel 12-20 közötti ismétlésre vagy képes, és adj bele mindent! MAXOLD KI!",
"Please repeat as much times as you can! MAXIMIZE it!": "Hajtsd végre a gyakorlatot, amennyiszer csak tudod! Ne állj meg, ha fáradt vagy, MAXOLD ki!",
"Please take a medium weight and repeat 20-30 times": "Válassz egy közepes súlyt, amivel maximum 20-30 közötti ismétlésre vagy képes",
"Equipment Filter": "Eszköz szűrő",
"Live-Server": "Live-Server",
"Test-Server": "Test-Server",
"All Exercises has been filtered out": "Az összes gyakorlatot kiszűrted",
"base": "alap",
"Hypertrophy": "Izomnövelés",
"Gain Strength": "Erőnövelés",
"repeats": "ismétlés",
"Rest time": "Pihenőidő",
"minutes": "perc",
"Suggestions based on your test": "Javaslatok a teszted alapján",
"Repeats volume": "Össz. ismétlés",
"Weight volume": "Össztömeg",
"Calorie": "Kalória",
"Max BPM": "Max pulzus",
"Min BPM": "Min pulzus",
"Average BPM": "Átl pulzus",
"Fatburn %": "Zsírégetés %",
"Health Data Summary": "Egészségadatok összefoglalás",
"reps": "ism.",
"Congratulation!": "Gratulálok!",
"You have achieved to first 100% test-round!": "Teljesítetted az első 100%-os tesztköröd!",
"Now you unlocked: Development By Muscles and the Suggested Trainings Plan": "Mostantól elérheted az 'Izomcsoportok fejlődése' és a 'Javasolt edzésterv' kategóriákat.",
"The": "A",
"the first":"az első",
"the second":"a második",
"the third":"a harmadik",
"Go Premium":"Válts Prémiumra",
"Unleash your potential with WorkoutTest Premium!":"Bontakoztasd ki az erősségeidet WorkoutTest Prémiummal!",
"feature is reachable after you finished":"funkció elérhető számodra, miután teljesítetted",
"100% test circles":"100%-os teszt-köröd",
"Keep testing":"Folytasd a tesztelést",
"Enjoy also this premium fetaure to show all old evaluation data of your successful exercises.":"Élvezd ezt a prémium funkciót is, amely megjeleníti a korábbi gyakorlatok teljes kiértékelését",
"Please define your Exercise Plan":"Kérlek készíts edzéstervet!",
"Go to: 'Training Plan' - 'Edit My Custom Plan'":"Menj a 'Edzéstervem' - 'Egyéni edzésterv' menübe",
"Jump there »":"Vigyél oda »",
"Exception: Purchase was not successful":"A vásárlás sikertelen volt",
"Exception: Purchase was cancelled":"A vásárlás megszakadt",
"the first": "az első",
"the second": "a második",
"the third": "a harmadik",
"Go Premium": "Válts Prémiumra",
"Unleash your potential with WorkoutTest Premium!": "Bontakoztasd ki az erősségeidet WorkoutTest Prémiummal!",
"feature is reachable after you finished": "funkció elérhető számodra, miután teljesítetted",
"100% test circles": "100%-os teszt-köröd",
"Keep testing": "Folytasd a tesztelést",
"Enjoy also this premium fetaure to show all old evaluation data of your successful exercises.": "Élvezd ezt a prémium funkciót is, amely megjeleníti a korábbi gyakorlatok teljes kiértékelését",
"Please define your Exercise Plan": "Kérlek készíts edzéstervet!",
"Go to: 'Training Plan' - 'Edit My Custom Plan'": "Menj a 'Edzéstervem' - 'Egyéni edzésterv' menübe",
"Jump there »": "Vigyél oda »",
"Exception: Purchase was not successful": "A vásárlás sikertelen volt",
"Exception: Purchase was cancelled": "A vásárlás megszakadt",
"Successful Purchase": "Sikeres vásárlás!",
"Now you can use the premium features of WorkoutTest!":"Most már eléred a WorkoutTest prémium tartalmait.",
"Progressindicator for the tests":"Hol tartasz a tesztek végrehajtásában?",
"Progressindicator_desc":"<p>Az előrehaladás jelző megmutatja, hogy hány százalékon állsz a tesztek végrehajtásában.</p><h2>Mikor éred el a 100%-os tesztkört?</h2><br/><p>Ha <strong>minden</strong> izomcsoportnál legalább egy <strong>alapgyakorlatot</strong> teljesítesz.<p>Az alapgyakorlatokat a menüponton narancssárgya <strong>alap</strong> pecséttel jelöltük</p>",
"Unleash Your Development Now!":"Indítsd el a fejlődésed most!",
"Learn about your development, enjoy AI-driven predictions of all of your skills and bodyparts.":"Kövesd nyomon a fejlődésed, élvezd a mesterséges intelligenciával támogatott javaslatokat és előrejelzéseket.",
"Subscription Conditions":"Előfizetési feltételek",
"Payment will be charged to your account. Subscription automatically renews unless auto-renew is turned off at least 24 hours before the end of the current period":"A számládat megterheljük az adott összeggel. Az előfizetés automatikusan meghosszabodik, hacsak nem kapcsolod ki az automatikus megújítást legkésőbb 24 órával a meghosszabbítás előtt.",
"Account will be charged for renewal within 24 hours prior to the end of the current period":"Az előfizetési periódus végén a számládat megterheljuk 24 órával a lejárat előtt.",
"Montly":"Havi",
"Annual":"Éves",
"Predictions with Artificial Intelligence":"Mesterséges Intelligencia előrejelzések",
"14% discount":"14% kedvezmény",
"2 months free":"2 hónap ingyen",
"Development programs":"Fejlesztési programok",
"Suggestions based on your actual status":"Intelligens javaslatok az állapotod alapján",
"Special customized training plans":"Speciális testreszabott edzéstervek",
"Now you can use the premium features of WorkoutTest!": "Most már eléred a WorkoutTest prémium tartalmait.",
"Progressindicator for the tests": "Hol tartasz a tesztek végrehajtásában?",
"Progressindicator_desc": "<p>Az előrehaladás jelző megmutatja, hogy hány százalékon állsz a tesztek végrehajtásában.</p><h2>Mikor éred el a 100%-os tesztkört?</h2><br/><p>Ha <strong>minden</strong> izomcsoportnál legalább egy <strong>alapgyakorlatot</strong> teljesítesz.<p>Az alapgyakorlatokat a menüponton narancssárgya <strong>alap</strong> pecséttel jelöltük</p>",
"Unleash Your Development Now!": "Indítsd el a fejlődésed most!",
"Learn about your development, enjoy AI-driven predictions of all of your skills and bodyparts.": "Kövesd nyomon a fejlődésed, élvezd a mesterséges intelligenciával támogatott javaslatokat és előrejelzéseket.",
"Subscription Conditions": "Előfizetési feltételek",
"Payment will be charged to your account. Subscription automatically renews unless auto-renew is turned off at least 24 hours before the end of the current period": "A számládat megterheljük az adott összeggel. Az előfizetés automatikusan meghosszabodik, hacsak nem kapcsolod ki az automatikus megújítást legkésőbb 24 órával a meghosszabbítás előtt.",
"Account will be charged for renewal within 24 hours prior to the end of the current period": "Az előfizetési periódus végén a számládat megterheljuk 24 órával a lejárat előtt.",
"Montly": "Havi",
"Annual": "Éves",
"Predictions with Artificial Intelligence": "Mesterséges Intelligencia előrejelzések",
"14% discount": "14% kedvezmény",
"2 months free": "2 hónap ingyen",
"Development programs": "Fejlesztési programok",
"Suggestions based on your actual status": "Intelligens javaslatok az állapotod alapján",
"Special customized training plans": "Speciális testreszabott edzéstervek",
"Step": "Lépés",
"Or type the time manually:":"Vagy jelöld ki az időt kézzel",
"sec":"mp",
"min":"perc",
"Edit Profile":"Profil szerkesztése",
"Activity":"Fizikai állapot",
"Body Type":"Testtípus",
"Goal":"Cél",
"Or type the time manually:": "Vagy jelöld ki az időt kézzel",
"sec": "mp",
"min": "perc",
"Edit Profile": "Profil szerkesztése",
"Activity": "Fizikai állapot",
"Body Type": "Testtípus",
"Goal": "Cél",
"gain_muscle": "Izomépítés",
"weight_loss":"Fogyás",
"Set your goal":"Mi a célod?",
"Set your fitness level":"Milyen a fizikai állapotod?",
"Set your body type":"Milyen a testtípusod?",
"These equipments and devices are available":"Ezek az eszközök állnak a rendelkezésedre",
"Successful Registration":"Sikeres regisztráció",
"Now we would like to know you better to lift the experience of the app.":"Most meg szeretnénk téged jobban ismerni, hogy az applikáció jobban illeszkedjen hozzád.",
"Please go through the pages, it will take couple of minutes!":"Kérlek menj át a következő oldalakon, néhány percet vesz csak igénybe!",
"Body Type Analyser":"Testtípus analizátor",
"How likely is it true about you?":"Mennyire igaz rád az állítás?",
"Very unlikely":"Biztos nem",
"Maybe":"Talán",
"Very likely":"Biztosan",
"« Back":"« Vissza",
"1. Basicly I am skinny and bonny":"1. Alapvetően vékony, csontos testalkat vagyok",
"2. question":"2. Hosszú végtagok, keskeny vállak jellemzőek rám",
"3. question":"3. Nehezen tudok izmot növelni",
"4. question":"4. Mellkasom, derekam közel egyforma szélességű",
"5. question":"5. Pálcika volt a becenevem az oviban",
"6. question":"6. Könnyen elveszítem a felszedett izmot",
"7. question":"7. Tudtommal alacsony a testzsírom",
"8. question":"8. Alapvetően sportos, atletikus testalkat vagyok",
"9. question":"9. Széles kulcscsontom és vállam van",
"10. question":"10. Keskeny a csípőm és sportos a derekam",
"11. question":"11. Gyorsan izmosodok",
"12. question":"12. Szélesebb a mellkasom a derekamnál",
"13. question":"13. Akár lehetnék én a Dávid szobor",
"14. question":"14. Erős vádli és alkar jellemez",
"15. question":"15. Széles bordakosaram van",
"16. question":"16. Vastag, széles ízületeim vannak",
"17. question":"17. Erős a csontozatom",
"18. question":"18. Zsírosabb, de izmos vagyok",
"19. question":"19. Szélesebb a csípőm a mellkasomnál",
"20. question":"20. Hordó is lehetne a becenevem",
"21. question":"21. Nehezen fogyok, könnyebben hízok",
"22. question":"22. Erős, vaskos testalkat vagyok",
"Your Bodytype result":"Testtípus eredményed",
"Change the weight to":"Súly változtatása",
"Search Exercises...":"Gyakorlat keresése...",
"No exercise found":"Nincs ilyen gyakorlat",
"Edit Your Training Test Set":"Válaszd ki a gyakorlatokat",
"Start training":"Edzés kezdése",
"Enjoy the exercises, good luck with the testing!":"Élvezd a gyakorlatokat, sok sikert a teszteléshez!",
"Please continue with the next exercise in the queue:":"Kérlek folytasd a következő gyakorlattal:",
"Or, you can redifine this exercise queue in the Compact Test menu":"Vagy változtatsd meg a gyakorlatokat a Tesztközpontban",
"you are able to do 12-20 repeats with":"amivel képes vagy 12-20 ismétlésre",
"You have an active Test Set!":"Van egy aktiv tesztköröd!",
"Do you want to override it?":"Felülírod?",
"Press OK to continue":"Nyomd meg az OK-t a folytatáshoz",
"Continue":"Folytatsd",
" your ":": ",
"\nyour plan is available for 24 hours":"\na teszt 24 óráig aktív",
"Start":"Kezdd el",
"Compact Test":"Kompakt teszt",
"Custom Test":"Egyedi teszt",
"weight_loss": "Fogyás",
"Set your goal": "Mi a célod?",
"Set your fitness level": "Milyen a fizikai állapotod?",
"Set your body type": "Milyen a testtípusod?",
"These equipments and devices are available": "Ezek az eszközök állnak a rendelkezésedre",
"Successful Registration": "Sikeres regisztráció",
"Now we would like to know you better to lift the experience of the app.": "Most meg szeretnénk téged jobban ismerni, hogy az applikáció jobban illeszkedjen hozzád.",
"Please go through the pages, it will take couple of minutes!": "Kérlek menj át a következő oldalakon, néhány percet vesz csak igénybe!",
"Body Type Analyser": "Testtípus analizátor",
"How likely is it true about you?": "Mennyire igaz rád az állítás?",
"Very unlikely": "Biztos nem",
"Maybe": "Talán",
"Very likely": "Biztosan",
"« Back": "« Vissza",
"1. Basicly I am skinny and bonny": "1. Alapvetően vékony, csontos testalkat vagyok",
"2. question": "2. Hosszú végtagok, keskeny vállak jellemzőek rám",
"3. question": "3. Nehezen tudok izmot növelni",
"4. question": "4. Mellkasom, derekam közel egyforma szélességű",
"5. question": "5. Pálcika volt a becenevem az oviban",
"6. question": "6. Könnyen elveszítem a felszedett izmot",
"7. question": "7. Tudtommal alacsony a testzsírom",
"8. question": "8. Alapvetően sportos, atletikus testalkat vagyok",
"9. question": "9. Széles kulcscsontom és vállam van",
"10. question": "10. Keskeny a csípőm és sportos a derekam",
"11. question": "11. Gyorsan izmosodok",
"12. question": "12. Szélesebb a mellkasom a derekamnál",
"13. question": "13. Akár lehetnék én a Dávid szobor",
"14. question": "14. Erős vádli és alkar jellemez",
"15. question": "15. Széles bordakosaram van",
"16. question": "16. Vastag, széles ízületeim vannak",
"17. question": "17. Erős a csontozatom",
"18. question": "18. Zsírosabb, de izmos vagyok",
"19. question": "19. Szélesebb a csípőm a mellkasomnál",
"20. question": "20. Hordó is lehetne a becenevem",
"21. question": "21. Nehezen fogyok, könnyebben hízok",
"22. question": "22. Erős, vaskos testalkat vagyok",
"Your Bodytype result": "Testtípus eredményed",
"Change the weight to": "Súly változtatása",
"Search Exercises...": "Gyakorlat keresése...",
"No exercise found": "Nincs ilyen gyakorlat",
"Edit Your Training Test Set": "Válaszd ki a gyakorlatokat",
"Start training": "Edzés kezdése",
"Enjoy the exercises, good luck with the testing!": "Élvezd a gyakorlatokat, sok sikert a teszteléshez!",
"Please continue with the next exercise in the queue:": "Kérlek folytasd a következő gyakorlattal:",
"Or, you can redifine this exercise queue in the Compact Test menu": "Vagy változtatsd meg a gyakorlatokat a Tesztközpontban",
"you are able to do 12-20 repeats with": "amivel képes vagy 12-20 ismétlésre",
"You have an active Test Set!": "Van egy aktiv tesztköröd!",
"Do you want to override it?": "Felülírod?",
"Press OK to continue": "Nyomd meg az OK-t a folytatáshoz",
"Continue": "Folytatsd",
" your ": ": ",
"\nyour plan is available for 24 hours": "\na teszt 24 óráig aktív",
"Start": "Kezdd el",
"Compact Test": "Kompakt teszt",
"Custom Test": "Egyedi teszt",
"Set": "Széria",
"Add this exercise to execute it paralell":"Adj hozzá egy gyakorlatot a párhuzamos végrehajtáshoz",
"Add this exercise to execute it paralell": "Adj hozzá egy gyakorlatot a párhuzamos végrehajtáshoz",
"very_poor": "Nagyon gyenge",
"poor": "Gyenge",
"below_average": "Átlag alatti",
@ -417,66 +376,81 @@
"good": "Jó",
"excellent": "Kitűnő",
"elite": "Elit kategória",
"Training":"Tréning",
"Growth":"Fejlődésem",
"Compared with...":"Összehasonlítva...",
"your best":"a legjobb",
"your last":"az utolsó",
"best":"a legjobb",
"last":"az utolsó",
"volumen":"volumennel",
"How can serve you this result?":"Hogyan segít ez az eredmény téged?",
"Get the Fastlane to your":"Kapd el a gyorsítósávot a optimális",
"Development":"Fejlődésedhez",
"Go":"Érdekel",
"Result":"Értékelés",
"Name too short":"A név túl rövid",
"No, bring me there":"Nem, vigyél oda",
"You are about to add a new parallel test":"Egy új gyakorlatot készülsz párhuzamosan végrehajtani",
"Your Primary Sport":"Elsődleges sportág",
"and":"és",
"Sport":"sport",
"Training": "Tréning",
"Growth": "Fejlődésem",
"Compared with...": "Összehasonlítva...",
"your best": "a legjobb",
"your last": "az utolsó",
"best": "a legjobb",
"last": "az utolsó",
"volumen": "volumennel",
"How can serve you this result?": "Hogyan segít ez az eredmény téged?",
"Get the Fastlane to your": "Kapd el a gyorsítósávot a optimális",
"Development": "Fejlődésedhez",
"Go": "Érdekel",
"Result": "Értékelés",
"Name too short": "A név túl rövid",
"No, bring me there": "Nem, vigyél oda",
"You are about to add a new parallel test": "Egy új gyakorlatot készülsz párhuzamosan végrehajtani",
"Your Primary Sport": "Elsődleges sportág",
"and": "és",
"Sport": "sport",
"gain_strength": "Erőnövelés",
"muscle_endurance": "Erő állóképesség",
"flexibility":"Rugalmasság",
"explosiveness":"Robbanékonyság",
"shape_forming":"Alakformálás",
"flexibility": "Rugalmasság",
"explosiveness": "Robbanékonyság",
"shape_forming": "Alakformálás",
"endurance": "Állóképesség",
"Muscle Endurance": "Erő állóképesség",
"Flexibility":"Rugalmasság",
"Explosiveness":"Robbanékonyság",
"Shape Forming":"Alakformálás",
"Loss Weight":"Fogyás",
"Skip":"Kihagyom",
"Exception: Network error, try again later!":"Hálózati hiba, próbálkozz később!",
"Flexibility": "Rugalmasság",
"Explosiveness": "Robbanékonyság",
"Shape Forming": "Alakformálás",
"Loss Weight": "Fogyás",
"Skip": "Kihagyom",
"Exception: Network error, try again later!": "Hálózati hiba, próbálkozz később!",
"Exception: Exception: Network Error, please try again later": "Hálózati hiba, próbálkozz később!",
"Warning":"Figyelmeztetés",
"No Registration":"Regisztráció kimaradt",
"You will skip the registration process.":"Átugrod a regisztrációs folyamatot.",
"Please take a short tour in the app":"Kérlek tégy egy rövid túrát az applikációban",
"No Login":"Bejelentkezés kimaradt",
"You will skip the login.":"Átugrod a bejelentkezést.",
"The app functionalitity will be restricted, but please take a tour!":"Az applikációt korlátozottan tudod így használni, de tégy egy túrát!",
"Activating the basic tutorial":"Bemutató aktiválása",
"Basic Tutorial":"Tutorial",
"Activate":"Aktiválás",
"Try free for 3 days!":"Próbáld ki kockázat nélkül 3 napig! Ebben az időszakban bármikor lemondhatod, anélkül, hogy megterhelnénk a számládat.",
"View other alternatives":"Megnézek egy másik lehetőséget",
"Please log in, because we can calculate the best suggestions for you":"Kérlek jelentkezz be, mert csak így tudjuk neked a legjobb gyakorlatokat kalkulálni",
"My Active Training":"Aktív edzésem",
"My Custom Plan":"Egyéni edzésterv",
"Training Plans for Beginners":"Kezdő edzésprogramok",
"Training Plans for Home":"Otthoni edzésprogramok",
"Training Plans Advanced":"Haladó edzésprogramok",
"Training Plans for Women":"Edzésprogramok nőknek",
"Training Plans of Celebrities":"Celebek edzésprogramjai",
"Training Plans for Gain Strength":"Erőnövelő edzésprogramok"
"Warning": "Figyelmeztetés",
"No Registration": "Regisztráció kimaradt",
"You will skip the registration process.": "Átugrod a regisztrációs folyamatot.",
"Please take a short tour in the app": "Kérlek tégy egy rövid túrát az applikációban",
"No Login": "Bejelentkezés kimaradt",
"You will skip the login.": "Átugrod a bejelentkezést.",
"The app functionalitity will be restricted, but please take a tour!": "Az applikációt korlátozottan tudod így használni, de tégy egy túrát!",
"Activating the basic tutorial": "Bemutató aktiválása",
"Basic Tutorial": "Tutorial",
"Activate": "Aktiválás",
"Try free for 3 days!": "Próbáld ki kockázat nélkül 3 napig! Ebben az időszakban bármikor lemondhatod, anélkül, hogy megterhelnénk a számládat.",
"View other alternatives": "Megnézek egy másik lehetőséget",
"Please log in, because we can calculate the best suggestions for you": "Kérlek jelentkezz be, mert csak így tudjuk neked a legjobb gyakorlatokat kalkulálni",
"My Active Training": "Aktív edzésem",
"My Custom Plan": "Egyéni edzésterv",
"Training Plans for Beginners": "Kezdő edzésprogramok",
"Training Plans for Home": "Otthoni edzésprogramok",
"Training Plans Advanced": "Haladó edzésprogramok",
"Training Plans for Women": "Edzésprogramok nőknek",
"Training Plans of Celebrities": "Celebek edzésprogramjai",
"Training Plans for Gain Strength": "Erőnövelő edzésprogramok",
"The training is finished": "Ezt az edzéstervet végrehajtottad.",
"Do you want to restart, or select a new Training Plan?": "Újra akarod indítani, vagy inkább egy másikat választasz?",
"New Training Plan": "Másik edzésterv",
"Restart": "Újraindítom",
"Training Day": "Edzésnap",
"No Active Training Plan": "Nincs aktív edzésterv",
"Please select one in the Training menu, or create your custom plan": "Kérlek válassz egyet a Tréning menüben, vagy hozd létre a saját egyéni edzésedet",
"Continue your training": "Folytasd az edzést",
"Start your training": "Kezdd el az edzést",
"Why Test?": "Miért teszt?",
"This is your first exercise after at least 3 weeks.": "Ez az első gyakorlatod legalább 3 hete",
"The first exercise will be a test. The following sets will be recalculated base on your test.": "A legelső gyakorlatod egy teszt lesz. Az utána következők számait újrakalkuláljuk a teszted alapján",
"This is the most optimal way for your development": "Ez a legoptimálisabb út a fejlődésedben",
"You want to skip really this exercise?": "Biztos, hogy átugrod ezt a gyakorlatot?",
"You have an active Training Plan": "Van egy aktív edzésterved",
"Finish!": "Vége!",
"Resting time": "Pihenőidő",
"Day": "Nap",
"Reps": "Ism.",
"Do you want to override it with": "Ezt az edzéstervet akarod ezentúl használni?",
"Calculated Weight": "Kalkulált súly",
"The weight is based on your previuos tests - if they exist.": "A súlyt kikalkuláltuk az előző teszted alapján - ha létezik.",
"If it does not exist, your very first exercise will be a test.": "Ha nem létezik 3 hétnél korábbi teszt, akkor a legelső gyakorlatod egy teszt lesz."
}

View File

@ -388,7 +388,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = SFJJBDCU6Z;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@ -531,7 +531,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = SFJJBDCU6Z;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@ -566,7 +566,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = SFJJBDCU6Z;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (

View File

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/exercise_plan_detail.dart';
import 'package:aitrainer_app/model/model_change.dart';
import 'package:aitrainer_app/model/workout_menu_tree.dart';
@ -29,6 +30,7 @@ class ExercisePlanBloc extends Bloc<ExercisePlanEvent, ExercisePlanState> {
menuTreeRepository.sortByMuscleType();
menuTreeRepository.sortedTree.forEach((key, value) {
print("menutree $key");
List<WorkoutMenuTree> listWorkoutTree = value;
listWorkoutTree.forEach((workoutTree) {
workoutTree.selected = false;
@ -48,9 +50,13 @@ class ExercisePlanBloc extends Bloc<ExercisePlanEvent, ExercisePlanState> {
Stream<ExercisePlanState> mapEventToState(ExercisePlanEvent event) async* {
try {
if (event is ExercisePlanLoad) {
if (Cache().userLoggedIn == null || Cache().userLoggedIn!.customerId == null) {
throw Exception("Please log in");
}
yield ExercisePlanLoading();
Track().track(TrackingEvent.my_custom_exercise_plan);
customerId = Cache().userLoggedIn!.customerId!;
await this.getData();
Track().track(TrackingEvent.my_custom_exercise_plan);
yield ExercisePlanReady();
}

View File

@ -6,11 +6,15 @@ import 'package:aitrainer_app/model/customer_training_plan.dart';
import 'package:aitrainer_app/model/customer_training_plan_details.dart';
import 'package:aitrainer_app/model/exercise.dart';
import 'package:aitrainer_app/model/exercise_plan_detail.dart';
import 'package:aitrainer_app/model/exercise_type.dart';
import 'package:aitrainer_app/model/workout_menu_tree.dart';
import 'package:aitrainer_app/repository/training_plan_repository.dart';
import 'package:aitrainer_app/service/exercise_service.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/util/enums.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
part 'training_plan_event.dart';
part 'training_plan_state.dart';
@ -21,18 +25,34 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
TrainingPlanBloc({required this.trainingPlanRepository, required this.menuBloc}) : super(TrainingPlanInitial());
CustomerTrainingPlan? _myPlan;
CustomerTrainingPlanDetails? _myDetail;
bool started = false;
final List<String> dayNames = [];
bool restarting = false;
bool celebrating = false;
int activeDayIndex = 0;
CustomerTrainingPlan? getMyPlan() => this._myPlan;
setMyPlan(CustomerTrainingPlan? myPlan) => this._myPlan = myPlan;
CustomerTrainingPlanDetails? getMyDetail() => this._myDetail;
setMyDetail(CustomerTrainingPlanDetails? value) => this._myDetail = value;
@override
Stream<TrainingPlanState> mapEventToState(TrainingPlanEvent event) async* {
try {
if (event is TrainingPlanActivate) {
yield TrainingPlanLoading();
_myPlan = await trainingPlanRepository.activateTrainingPlan(event.trainingPlanId);
_myPlan!.type = CustomerTrainingPlanType.template;
menuBloc.menuTreeRepository.sortedTree.forEach((name, list) {
final List<WorkoutMenuTree> menuList = list as List<WorkoutMenuTree>;
menuList.forEach((element) {
element.exerciseType!.trainingPlanState = ExerciseTypeTrainingPlanState.none;
});
});
this.activateDays();
Cache().myTrainingPlan = _myPlan;
await Cache().saveMyTrainingPlan();
@ -47,6 +67,12 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
event.detail.repeats = event.repeats;
yield TrainingPlanReady();
} else if (event is TrainingPlanSetChange) {
yield TrainingPlanLoading();
event.detail.set = event.set;
yield TrainingPlanReady();
} else if (event is TrainingPlanSaveExercise) {
yield TrainingPlanLoading();
@ -74,12 +100,76 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
Cache().myTrainingPlan = _myPlan;
await Cache().saveMyTrainingPlan();
yield TrainingPlanReady();
if (isDayDone()) {
this.add(TrainingPlanFinishDay());
} else {
yield TrainingPlanReady();
}
} else if (event is TrainingPlanSkipExercise) {
yield TrainingPlanLoading();
print("Skipping ${event.detail.exerciseTypeId}");
event.detail.state = ExercisePlanDetailState.skipped;
Cache().myTrainingPlan = _myPlan;
await Cache().saveMyTrainingPlan();
if (isDayDone()) {
this.add(TrainingPlanFinishDay());
} else {
yield TrainingPlanReady();
}
} else if (event is TrainingPlanFinishDay) {
yield TrainingPlanLoading();
celebrating = true;
yield TrainingPlanDayFinished();
} else if (event is TrainingPlanGoToRestart) {
yield TrainingPlanLoading();
restarting = true;
yield TrainingPlanDayReadyToRestart();
} else if (event is TrainingPlanAddExerciseType) {
if (_myDetail == null) {
throw Exception("Create new Detail");
}
yield TrainingPlanLoading();
_myDetail!.exerciseType!.trainingPlanState = ExerciseTypeTrainingPlanState.added;
_myPlan!.details.add(this._myDetail!);
yield TrainingPlanReady();
} else if (event is TrainingPlanDeleteExerciseType) {
if (_myPlan == null || _myPlan!.details.isEmpty) {
throw Exception("No MyPlan");
}
yield TrainingPlanLoading();
CustomerTrainingPlanDetails? remove;
for (var detail in _myPlan!.details) {
if (event.exerciseType.exerciseTypeId == detail.exerciseTypeId) {
remove = detail;
break;
}
}
if (remove != null) {
_myPlan!.details.remove(remove);
}
event.exerciseType.trainingPlanState = ExerciseTypeTrainingPlanState.none;
yield TrainingPlanReady();
} else if (event is TrainingPlanCustomAddLoad) {
yield TrainingPlanLoading();
addNewPlan();
_myDetail = CustomerTrainingPlanDetails();
_myDetail!.exerciseType = event.exerciseType;
_myDetail!.exerciseTypeId = event.exerciseType.exerciseTypeId;
_myDetail!.repeats = 12;
_myDetail!.weight = 30;
_myDetail!.set = 3;
_myDetail!.parallel = false;
_myDetail!.day = "";
_myDetail!.restingTime = 2;
_myDetail!.state = ExercisePlanDetailState.start;
if (_myDetail!.exerciseType!.unitQuantityUnit != null) {
_myDetail = trainingPlanRepository.getCalculatedWeightRepeats(event.exerciseType.exerciseTypeId, _myDetail!);
} else {
_myDetail!.weight = 0;
}
yield TrainingPlanReady();
}
} on Exception catch (e) {
@ -87,10 +177,51 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
}
}
void addNewPlan() {
if (_myPlan == null) {
_myPlan = CustomerTrainingPlan();
} else {
if (!_myPlan!.type.equalsTo(CustomerTrainingPlanType.custom)) {
_myPlan!.details.clear();
}
}
_myPlan!.trainingPlanId = 0;
_myPlan!.name = "Custom";
_myPlan!.customerId = Cache().userLoggedIn == null ? Cache().userLoggedIn!.customerId : 0;
_myPlan!.type = CustomerTrainingPlanType.custom;
restart();
print("New custom plan: $_myPlan");
}
void restart() {
if (_myPlan == null) {
return;
}
for (var day in dayNames) {
_myPlan!.days[day]!.clear();
}
_myPlan!.details.forEach((element) {
element.state = ExercisePlanDetailState.start;
element.exercises.clear();
});
dayNames.clear();
Cache().myTrainingPlan = _myPlan;
Cache().saveMyTrainingPlan();
restarting = false;
print("Restarting finished");
}
void activateDays() {
if (_myPlan == null) {
return;
}
if (isDone100Percent()) {
this.add(TrainingPlanGoToRestart());
}
dayNames.clear();
_myPlan!.days.clear();
String dayName = ".";
@ -113,6 +244,7 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
_myPlan!.days[""] = [];
_myPlan!.days[""]!.addAll(_myPlan!.details);
}
getActiveDayIndex();
}
CustomerTrainingPlanDetails? getTrainingPlanDetail(int trainingPlanDetailsId) {
@ -177,6 +309,7 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
}
}
print("Next detail $next");
return next;
}
@ -192,6 +325,18 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
}
}
bool isDayDone() {
bool isDone = true;
final String day = dayNames[activeDayIndex];
for (var detail in _myPlan!.days[day]!) {
if (!detail.state.equalsTo(ExercisePlanDetailState.finished) && !detail.state.equalsTo(ExercisePlanDetailState.skipped)) {
isDone = false;
}
}
print("Is Day '$day' done: $isDone");
return isDone;
}
double getOffset() {
double offset = 5;
if (_myPlan == null) {
@ -199,7 +344,8 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
}
int indexInProgress = 0;
int indexInStart = 0;
for (var detail in _myPlan!.details) {
final String day = dayNames[this.activeDayIndex];
for (var detail in _myPlan!.days[day]!) {
if (detail.state == ExercisePlanDetailState.inProgress) {
break;
}
@ -213,4 +359,126 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
offset = index * 80;
return offset;
}
bool isDone100Percent() {
bool done = true;
if (_myPlan == null || _myPlan!.details.isEmpty) {
return false;
}
_myPlan!.details.forEach((element) {
if (!element.state.equalsTo(ExercisePlanDetailState.finished) && !element.state.equalsTo(ExercisePlanDetailState.skipped)) {
done = false;
}
});
return done;
}
int getActiveDayIndex() {
if (restarting) {
return 0;
}
if (_myPlan == null || _myPlan!.details.isEmpty) {
throw Exception("No defined Training Plan");
}
if (dayNames.isEmpty || dayNames.length == 1) {
return 0;
}
activeDayIndex = 0;
for (var day in dayNames) {
if (_myPlan!.days[day] == null) {
throw Exception("Wrong activated day: $day does not exist");
}
bool isDone = true;
_myPlan!.days[day]!.forEach((element) {
if (!element.state.equalsTo(ExercisePlanDetailState.finished) && !element.state.equalsTo(ExercisePlanDetailState.skipped)) {
isDone = false;
}
});
if (!isDone) {
break;
}
activeDayIndex++;
}
print("Active Day Index: $activeDayIndex");
if (activeDayIndex >= dayNames.length) {
activeDayIndex = 0;
this.add(TrainingPlanGoToRestart());
}
return activeDayIndex;
}
String getCustomAddSummary() {
String summary = "";
if (_myDetail == null || _myDetail!.set == null || _myDetail!.repeats == null) {
return summary;
}
summary = getMyDetail()!.set!.toStringAsFixed(0) + " x " + getMyDetail()!.repeats!.toStringAsFixed(0);
return summary;
}
String getExerciseName(Locale locale) {
String exerciseName = "";
if (_myDetail == null || _myDetail!.exerciseType == null) {
return exerciseName;
}
exerciseName =
AppLanguage().appLocal == Locale("en") ? getMyDetail()!.exerciseType!.name : getMyDetail()!.exerciseType!.nameTranslation;
return exerciseName;
}
String getWeightByExerciseType(ExerciseType exerciseType) {
double weight = 0;
if (_myPlan == null || _myPlan!.details.isEmpty) {
return weight.toStringAsFixed(0);
}
for (var detail in _myPlan!.details) {
if (exerciseType.exerciseTypeId == detail.exerciseTypeId) {
weight = detail.weight!;
break;
}
}
int decimal = weight % weight.round() == 0 ? 0 : 1;
return weight.toStringAsFixed(decimal);
}
String getSetByExerciseType(ExerciseType exerciseType) {
int value = 0;
if (_myPlan == null || _myPlan!.details.isEmpty) {
return value.toStringAsFixed(0);
}
for (var detail in _myPlan!.details) {
if (exerciseType.exerciseTypeId == detail.exerciseTypeId) {
value = detail.set!;
break;
}
}
return value.toStringAsFixed(0);
}
String getRepeatsByExerciseType(ExerciseType exerciseType) {
int value = 0;
if (_myPlan == null || _myPlan!.details.isEmpty) {
return value.toStringAsFixed(0);
}
for (var detail in _myPlan!.details) {
if (exerciseType.exerciseTypeId == detail.exerciseTypeId) {
value = detail.repeats!;
break;
}
}
return value.toStringAsFixed(0);
}
}

View File

@ -37,6 +37,15 @@ class TrainingPlanRepeatsChange extends TrainingPlanEvent {
List<Object> get props => [repeats, detail];
}
class TrainingPlanSetChange extends TrainingPlanEvent {
final CustomerTrainingPlanDetails detail;
final int set;
const TrainingPlanSetChange({required this.set, required this.detail});
@override
List<Object> get props => [set, detail];
}
class TrainingPlanSaveExercise extends TrainingPlanEvent {
final CustomerTrainingPlanDetails detail;
const TrainingPlanSaveExercise({required this.detail});
@ -45,8 +54,16 @@ class TrainingPlanSaveExercise extends TrainingPlanEvent {
List<Object> get props => [detail];
}
class TrainingPlanFinishTraining extends TrainingPlanEvent {
const TrainingPlanFinishTraining();
class TrainingPlanFinishDay extends TrainingPlanEvent {
const TrainingPlanFinishDay();
}
class TrainingPlanRestart extends TrainingPlanEvent {
const TrainingPlanRestart();
}
class TrainingPlanGoToRestart extends TrainingPlanEvent {
const TrainingPlanGoToRestart();
}
class TrainingPlanSkipExercise extends TrainingPlanEvent {
@ -56,3 +73,23 @@ class TrainingPlanSkipExercise extends TrainingPlanEvent {
@override
List<Object> get props => [detail];
}
class TrainingPlanAddExerciseType extends TrainingPlanEvent {
const TrainingPlanAddExerciseType();
}
class TrainingPlanDeleteExerciseType extends TrainingPlanEvent {
final ExerciseType exerciseType;
const TrainingPlanDeleteExerciseType({required this.exerciseType});
@override
List<Object> get props => [exerciseType];
}
class TrainingPlanCustomAddLoad extends TrainingPlanEvent {
final ExerciseType exerciseType;
const TrainingPlanCustomAddLoad({required this.exerciseType});
@override
List<Object> get props => [exerciseType];
}

View File

@ -23,6 +23,14 @@ class TrainingPlanFinished extends TrainingPlanState {
const TrainingPlanFinished();
}
class TrainingPlanDayFinished extends TrainingPlanState {
const TrainingPlanDayFinished();
}
class TrainingPlanDayReadyToRestart extends TrainingPlanState {
const TrainingPlanDayReadyToRestart();
}
class TrainingPlanError extends TrainingPlanState {
final String message;
const TrainingPlanError({required this.message});

View File

@ -26,7 +26,9 @@ import 'package:aitrainer_app/view/exercise_plan_custom_detail_add_page.dart';
import 'package:aitrainer_app/view/faq_page.dart';
import 'package:aitrainer_app/view/login.dart';
import 'package:aitrainer_app/view/exercise_new_page.dart';
import 'package:aitrainer_app/view/my_training_plans_page.dart';
import 'package:aitrainer_app/view/training_plan_custom.dart';
import 'package:aitrainer_app/view/training_plan_custom_add.dart';
import 'package:aitrainer_app/view/training_plans_page.dart';
import 'package:aitrainer_app/view/mydevelopment_body_page.dart';
import 'package:aitrainer_app/view/mydevelopment_muscle_page.dart';
import 'package:aitrainer_app/view/mydevelopment_page.dart';
@ -60,7 +62,6 @@ import 'package:sentry_flutter/sentry_flutter.dart';
import 'bloc/account/account_bloc.dart';
import 'bloc/body_development/body_development_bloc.dart';
import 'bloc/development_by_muscle/development_by_muscle_bloc.dart';
import 'bloc/exercise_execute_plan/exercise_execute_plan_bloc.dart';
import 'bloc/exercise_plan/exercise_plan_bloc.dart';
import 'bloc/menu/menu_bloc.dart';
import 'bloc/session/session_bloc.dart';
@ -168,9 +169,6 @@ Future<Null> main() async {
BlocProvider<ExercisePlanBloc>(
create: (BuildContext context) => ExercisePlanBloc(menuTreeRepository: menuTreeRepository),
),
BlocProvider<ExerciseExecutePlanBloc>(
create: (BuildContext context) => ExerciseExecutePlanBloc(menuTreeRepository: menuTreeRepository),
),
BlocProvider<DevelopmentByMuscleBloc>(
create: (BuildContext context) => DevelopmentByMuscleBloc(workoutTreeRepository: menuTreeRepository),
),
@ -273,6 +271,8 @@ class WorkoutTestApp extends StatelessWidget {
'testSetControl': (context) => TestSetControl(),
'faqPage': (context) => FaqPage(),
'myTrainingPlans': (context) => MyTrainingPlans(),
'myTrainingPlanCustom': (context) => TrainingPlanCustomPage(),
'myTrainingPlanCustomAdd': (context) => TrainingPlanCustomAddPage(),
'myTrainingPlanActivate': (context) => TrainingPlanActivatePage(),
'myTrainingPlanExecute': (context) => TrainingPlanExecutePage(),
'myTrainingPlanExercise': (context) => TrainingPlanExercise(),

View File

@ -4,6 +4,14 @@ import 'package:intl/intl.dart';
import 'package:aitrainer_app/model/customer_training_plan_details.dart';
enum CustomerTrainingPlanType { custom, template, none }
extension CustomerTrainingPlanTypeExt on CustomerTrainingPlanType {
String toStr() => this.toString().split(".").last;
bool equalsTo(CustomerTrainingPlanType type) => this.toString() == type.toString();
bool equalsStringTo(String type) => this.toStr() == type;
}
class CustomerTrainingPlan {
int? customerTrainingPlanId;
int? customerId;
@ -14,6 +22,8 @@ class CustomerTrainingPlan {
String? name;
CustomerTrainingPlanType type = CustomerTrainingPlanType.none;
CustomerTrainingPlan();
List<CustomerTrainingPlanDetails> details = [];

View File

@ -1,5 +1,6 @@
import 'package:aitrainer_app/model/exercise_ability.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/util/enums.dart';
import 'package:flutter/material.dart';
class ExerciseType {
@ -48,6 +49,10 @@ class ExerciseType {
/// ability
ExerciseAbility? ability;
/// TrainingPlanState - whether the exercise_type exists in the
/// custom training plan
ExerciseTypeTrainingPlanState trainingPlanState = ExerciseTypeTrainingPlanState.none;
ExerciseType({required this.name, required this.description});
ExerciseType.fromJson(Map json) {

View File

@ -299,10 +299,7 @@ class WorkoutTreeRepository with Logging {
sortedTree = SplayTreeMap<String, List<WorkoutMenuTree>>();
tree.forEach((key, value) {
WorkoutMenuTree workoutTree = value;
if (!workoutTree.nameEnglish.contains('Muscle Build') &&
!workoutTree.nameEnglish.contains('Strength') &&
workoutTree.is1RM &&
workoutTree.exerciseTypeId == 0) {
if (!workoutTree.internalName.contains('one_rep_max') && workoutTree.is1RM && workoutTree.exerciseTypeId == 0) {
String treeName = getAntagonistSort(workoutTree.nameEnglish) + ". " + workoutTree.name;
//print("TreeName $treeName ${workoutTree.name}");
sortedTree[treeName] = this.getBranchList(workoutTree.id);

View File

@ -88,3 +88,11 @@ extension EvaluationTextExt on EvaluationText {
bool equalsTo(EvaluationText eval) => this.toString() == eval.toString();
bool equalsStringTo(String eval) => this.toStr() == eval;
}
enum ExerciseTypeTrainingPlanState { none, added, executed }
extension ExerciseTypeTrainingPlanStateExt on ExerciseTypeTrainingPlanState {
String toStr() => this.toString().split(".").last;
bool equalsTo(ExerciseTypeTrainingPlanState state) => this.toString() == state.toString();
bool equalsStringTo(String state) => this.toStr() == state;
}

View File

@ -241,11 +241,11 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
useRootNavigator: true,
context: context,
builder: (_) => CupertinoAlertDialog(
title: Text(t("You have an active Training Plan!")),
title: Text(t("You have an active Training Plan")),
content: Column(children: [
Divider(),
Text(
t("Do you want to override it with "),
t("Do you want to override it with"),
style: (TextStyle(color: Colors.blue)),
),
Text(
@ -318,7 +318,7 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
padding: EdgeInsets.only(left: 8.0),
alignment: Alignment.centerLeft,
child: Text(
'Exercise',
t('Exercise'),
textAlign: TextAlign.start,
overflow: TextOverflow.ellipsis,
))),
@ -330,7 +330,7 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
padding: EdgeInsets.symmetric(horizontal: 8.0),
alignment: Alignment.centerLeft,
child: Text(
'Exercise',
t('Exercise'),
textAlign: TextAlign.start,
overflow: TextOverflow.ellipsis,
))),
@ -342,7 +342,7 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
padding: EdgeInsets.symmetric(horizontal: 2.0),
alignment: Alignment.centerLeft,
child: Text(
'Set',
t('Set'),
overflow: TextOverflow.ellipsis,
))),
GridTextColumn(
@ -353,7 +353,7 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
padding: EdgeInsets.symmetric(horizontal: 2.0),
alignment: Alignment.centerLeft,
child: Text(
'Reps',
t('Reps'),
overflow: TextOverflow.ellipsis,
))),
GridTextColumn(
@ -364,7 +364,7 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
padding: EdgeInsets.symmetric(horizontal: 2.0),
alignment: Alignment.centerLeft,
child: Text(
'Weight',
t('Weight'),
overflow: TextOverflow.ellipsis,
))),
GridTextColumn(
@ -375,7 +375,7 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans {
padding: EdgeInsets.symmetric(horizontal: 8.0),
alignment: Alignment.centerLeft,
child: Text(
'Day',
t('Day'),
overflow: TextOverflow.ellipsis,
))),
],

View File

@ -0,0 +1,372 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/model/customer_training_plan.dart';
import 'package:aitrainer_app/model/exercise_type.dart';
import 'package:aitrainer_app/model/workout_menu_tree.dart';
import 'package:aitrainer_app/library/tree_view.dart';
import 'package:aitrainer_app/util/enums.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/menu_image.dart';
import 'package:aitrainer_app/widgets/treeview_parent_widget.dart';
import 'package:ezanimation/ezanimation.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
import 'package:timeline_tile/timeline_tile.dart';
// ignore: must_be_immutable
class TrainingPlanCustomPage extends StatefulWidget {
@override
_ExercisePlanCustomPage createState() => _ExercisePlanCustomPage();
}
class _ExercisePlanCustomPage extends State<TrainingPlanCustomPage> with Trans {
TrainingPlanBloc? bloc;
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
setContext(context);
bloc = BlocProvider.of<TrainingPlanBloc>(context);
bloc!.menuBloc.menuTreeRepository.sortByMuscleType();
return Scaffold(
key: _scaffoldKey,
appBar: AppBarNav(depth: 1),
body: Container(
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('asset/image/WT_black_background.jpg'),
fit: BoxFit.cover,
alignment: Alignment.center,
),
),
child: BlocConsumer<TrainingPlanBloc, TrainingPlanState>(listener: (context, state) {
if (state is TrainingPlanError) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(
state.message,
),
backgroundColor: Colors.orange,
));
}
}, builder: (context, state) {
return ModalProgressHUD(
child: exerciseWidget(bloc!),
inAsyncCall: state is TrainingPlanLoading,
opacity: 0.5,
color: Colors.black54,
progressIndicator: CircularProgressIndicator(),
);
})),
bottomNavigationBar: BottomNavigator(bottomNavIndex: 2),
floatingActionButton: FloatingActionButton.extended(
onPressed: () => Navigator.of(context).popAndPushNamed('myTrainingPlanExecute'),
backgroundColor: Colors.orange[800],
icon: Icon(CustomIcon.weight_hanging),
label: Text(
t("Start") + "!",
style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 16),
),
),
);
}
Widget exerciseWidget(TrainingPlanBloc bloc) {
return TreeView(
startExpanded: false,
children: _getTreeChildren(bloc),
);
}
List<Widget> _getTreeChildren(TrainingPlanBloc bloc) {
List<Widget> exerciseTypes = [];
Card explanation = Card(
color: Colors.white60,
child: Container(
padding: EdgeInsets.only(left: 10, right: 5, top: 12, bottom: 8),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Row(
children: [
Icon(
Icons.info,
color: Colors.orangeAccent,
),
Text(" "),
Text(
t("Custom Exercise Plan"),
style: GoogleFonts.archivoBlack(fontSize: 20),
),
],
),
Divider(
color: Colors.transparent,
),
Text(
t("Select manually the exercises what you would like to have in your plan. At the end don't forget to save."),
style: GoogleFonts.inter(fontSize: 12, fontWeight: FontWeight.normal),
),
],
)));
exerciseTypes.add(explanation);
bloc.menuBloc.menuTreeRepository.sortedTree.forEach((name, list) {
exerciseTypes.add(Container(
margin: const EdgeInsets.only(left: 4.0),
child: TreeViewChild(
startExpanded: false,
parent: TreeviewParentWidget(text: name),
children: getTiles(list, bloc),
)));
});
return exerciseTypes;
}
List<Widget> getTiles(List<WorkoutMenuTree> list, TrainingPlanBloc bloc) {
List<Widget> tiles = [];
tiles.addAll(getExerciseTiles(bloc, list));
return tiles;
}
List<Widget> getExerciseTiles(TrainingPlanBloc bloc, List<WorkoutMenuTree> listWorkoutTree) {
List<Widget> tiles = [];
listWorkoutTree.forEach((element) {
tiles.add(GestureDetector(
onTap: () => {},
child: ExerciseTile(
bloc: bloc,
exerciseType: element.exerciseType!,
)));
});
return tiles;
}
}
class ExerciseTile extends StatefulWidget {
final TrainingPlanBloc bloc;
final ExerciseType exerciseType;
ExerciseTile({required this.bloc, required this.exerciseType});
@override
_ExerciseTileState createState() => _ExerciseTileState();
}
class _ExerciseTileState extends State<ExerciseTile> with Trans {
final EzAnimation animation = EzAnimation(1.0, 30.0, Duration(seconds: 3), reverseCurve: Curves.easeIn);
@override
void initState() {
animation.start();
animation.addStatusListener((status) {
if (status == AnimationStatus.completed) {}
});
super.initState();
}
@override
bool didUpdateWidget(ExerciseTile oldWidget) {
super.didUpdateWidget(oldWidget);
Future.delayed(Duration(milliseconds: 400)).then((value) => animation.start());
return true;
}
void activateCustomPlan() {
widget.bloc.add(TrainingPlanCustomAddLoad(exerciseType: widget.exerciseType));
Navigator.of(context).popAndPushNamed("myTrainingPlanCustomAdd");
}
Widget getIndicator() {
if (widget.exerciseType.trainingPlanState.equalsTo(ExerciseTypeTrainingPlanState.none)) {
return GestureDetector(
onTap: () {
if (widget.bloc.getMyPlan() != null && !widget.bloc.getMyPlan()!.type.equalsTo(CustomerTrainingPlanType.custom)) {
showCupertinoDialog(
useRootNavigator: true,
context: context,
builder: (_) => CupertinoAlertDialog(
title: Text(t("You have an active Training Plan")),
content: Column(children: [
Divider(),
Text(
t("Do you want to override it?"),
style: (TextStyle(color: Colors.blue)),
),
]),
actions: [
TextButton(
child: Text(t("No")),
onPressed: () => Navigator.pop(context),
),
TextButton(
child: Text(t("Yes")),
onPressed: () => activateCustomPlan(),
)
],
));
} else {
activateCustomPlan();
}
},
child: ClipRRect(
borderRadius: BorderRadius.circular(24.0),
child: Container(
color: Colors.blue,
child: Icon(
CustomIcon.plus_1,
size: 28,
color: Colors.white,
))));
} else if (widget.exerciseType.trainingPlanState.equalsTo(ExerciseTypeTrainingPlanState.added)) {
return GestureDetector(
onTap: () => widget.bloc.add(TrainingPlanDeleteExerciseType(exerciseType: widget.exerciseType)),
child: ClipRRect(
borderRadius: BorderRadius.circular(24.0),
child: Container(
padding: EdgeInsets.only(left: 8, bottom: 3),
color: Colors.red[400],
child: Text("X",
style: GoogleFonts.archivoBlack(
fontSize: 30,
color: Colors.white,
)))));
} else {
return ClipRRect(
borderRadius: BorderRadius.circular(24.0),
child: Container(
color: Colors.blue,
child: Icon(
CustomIcon.down,
size: 28,
color: Colors.white,
)));
}
}
@override
Widget build(BuildContext context) {
bool added = widget.exerciseType.trainingPlanState.equalsTo(ExerciseTypeTrainingPlanState.added);
setContext(context);
return Container(
color: Colors.transparent,
child: TimelineTile(
alignment: TimelineAlign.manual,
lineXY: 0.1,
beforeLineStyle: const LineStyle(
color: Color(0xffb4f500),
thickness: 6,
),
afterLineStyle: const LineStyle(
color: Color(0xffb4f500),
thickness: 6,
),
indicatorStyle: IndicatorStyle(
width: 40,
height: 40,
indicator: getIndicator(),
),
endChild: Container(
padding: EdgeInsets.only(left: 10),
child: Row(children: [
Container(
width: 120,
height: 80,
child: MenuImage(
imageName: widget.bloc.getActualImageName(widget.exerciseType.exerciseTypeId),
workoutTreeId: widget.bloc.getActualWorkoutTreeId(widget.exerciseType.exerciseTypeId)!,
),
),
SizedBox(
width: 10,
),
Expanded(
child: RichText(
text: TextSpan(
style: GoogleFonts.inter(
fontSize: 14,
fontWeight: FontWeight.bold,
color: added ? Colors.white : Colors.grey,
),
children: [
TextSpan(
text: widget.exerciseType.nameTranslation,
style: GoogleFonts.inter(
fontSize: 14,
fontWeight: FontWeight.bold,
color: added ? Colors.orange[500] : Colors.white,
shadows: <Shadow>[
Shadow(
offset: Offset(5.0, 5.0),
blurRadius: 12.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 12.0,
color: Colors.black54,
),
],
)),
widget.exerciseType.unitQuantityUnit != null
? TextSpan(
text: "\n",
)
: TextSpan(),
widget.exerciseType.unitQuantityUnit != null
? TextSpan(
text: t(widget.exerciseType.unitQuantityUnit!) + ": ",
style: GoogleFonts.inter(
fontSize: 12, color: added ? Colors.yellow[400] : Colors.grey, fontWeight: FontWeight.bold))
: TextSpan(),
widget.exerciseType.unitQuantityUnit != null
? TextSpan(
text: added ? widget.bloc.getWeightByExerciseType(widget.exerciseType) : "?",
style: GoogleFonts.inter(
fontSize: 12,
))
: TextSpan(),
TextSpan(
text: "\n",
),
TextSpan(
text: t(widget.exerciseType.unit) + ": ",
style:
GoogleFonts.inter(fontSize: 12, color: added ? Colors.yellow[400] : Colors.grey, fontWeight: FontWeight.bold)),
TextSpan(
text: added ? widget.bloc.getRepeatsByExerciseType(widget.exerciseType) : "?",
style: GoogleFonts.inter(
fontSize: 12,
)),
TextSpan(
text: "\n",
),
TextSpan(
text: t("Set") + ": ",
style:
GoogleFonts.inter(fontSize: 12, color: added ? Colors.yellow[400] : Colors.grey, fontWeight: FontWeight.bold)),
TextSpan(
text: added ? widget.bloc.getSetByExerciseType(widget.exerciseType) : "?",
style: GoogleFonts.inter(
fontSize: 12,
)),
]),
)),
]),
),
),
);
}
}

View File

@ -0,0 +1,259 @@
import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
import 'package:keyboard_actions/keyboard_actions_config.dart';
import 'package:keyboard_actions/keyboard_actions_item.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
class TrainingPlanCustomAddPage extends StatefulWidget {
@override
_ExercisePlanDetailAddPage createState() => _ExercisePlanDetailAddPage();
}
class _ExercisePlanDetailAddPage extends State<TrainingPlanCustomAddPage> with Trans {
final FocusNode _nodeText1 = FocusNode();
final FocusNode _nodeText2 = FocusNode();
final FocusNode _nodeText3 = FocusNode();
KeyboardActionsConfig _buildConfig(BuildContext context) {
return KeyboardActionsConfig(
keyboardActionsPlatform: KeyboardActionsPlatform.ALL,
keyboardBarColor: Colors.grey[200],
nextFocus: true,
actions: [
KeyboardActionsItem(focusNode: _nodeText2, toolbarButtons: [
(node) {
return GestureDetector(
onTap: () => node.unfocus(),
child: Container(
padding: EdgeInsets.all(8.0),
color: Colors.orange[500],
child: Text(
t("Done"),
style: TextStyle(color: Colors.white),
),
),
);
}
]),
KeyboardActionsItem(
focusNode: _nodeText1,
toolbarButtons: [
//button 2
(node) {
return GestureDetector(
onTap: () => node.unfocus(),
child: Container(
color: Colors.orange,
padding: EdgeInsets.all(8.0),
child: Text(
t("Done"),
style: TextStyle(color: Colors.white),
),
),
);
}
],
),
KeyboardActionsItem(
focusNode: _nodeText3,
toolbarButtons: [
//button 2
(node) {
return GestureDetector(
onTap: () => node.unfocus(),
child: Container(
color: Colors.orange,
padding: EdgeInsets.all(8.0),
child: Text(
t("Done"),
style: TextStyle(color: Colors.white),
),
),
);
}
],
),
],
);
}
@override
Widget build(BuildContext context) {
setContext(context);
return BlocConsumer<TrainingPlanBloc, TrainingPlanState>(
listener: (context, state) {
if (state is TrainingPlanError) {
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white))));
}
},
builder: (context, state) {
// ignore: close_sinks
final bloc = BlocProvider.of<TrainingPlanBloc>(context);
return ModalProgressHUD(
child: getForm(bloc),
inAsyncCall: state is TrainingPlanLoading,
opacity: 0.5,
color: Colors.black54,
progressIndicator: CircularProgressIndicator(),
);
},
);
}
Widget getForm(TrainingPlanBloc bloc) {
String exerciseName = "";
exerciseName = bloc.getExerciseName(AppLanguage().appLocal);
final bool weightVisible = bloc.getMyDetail()!.exerciseType!.unitQuantityUnit != null;
String summary = bloc.getCustomAddSummary();
if (weightVisible && bloc.getMyDetail()!.weight != null && bloc.getMyDetail()!.weight! > 0) {
summary += " x " + bloc.getMyDetail()!.weight!.toStringAsFixed(1) + " kg";
}
final String unit = bloc.getMyDetail()!.exerciseType!.unit;
return Form(
child: Scaffold(
resizeToAvoidBottomInset: true,
appBar: AppBarMin(back: true),
body: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('asset/image/WT_black_background.jpg'),
fit: BoxFit.fill,
alignment: Alignment.center,
),
),
child: KeyboardActions(
config: _buildConfig(context),
child: Container(
child: SingleChildScrollView(
padding: const EdgeInsets.only(top: 25, left: 95, right: 95),
scrollDirection: Axis.vertical,
child: Column(mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[
Text(t('Save The Exercise To The Training Plan'),
textAlign: TextAlign.center,
style: GoogleFonts.inter(
fontSize: 14,
color: Colors.white,
)),
Text(
exerciseName,
textAlign: TextAlign.center,
style: GoogleFonts.archivoBlack(fontSize: 18, color: Colors.yellow[200]),
overflow: TextOverflow.fade,
maxLines: 3,
softWrap: true,
),
Divider(
color: Colors.transparent,
height: 30,
),
TextFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 25, top: 5, bottom: 5),
labelText: t('Serie'),
labelStyle: GoogleFonts.inter(fontSize: 20, color: Colors.yellow[50], decorationColor: Colors.black12),
fillColor: Colors.white24,
filled: true,
border: OutlineInputBorder(
gapPadding: 8.0,
borderRadius: BorderRadius.circular(12.0),
borderSide: BorderSide(color: Colors.black26, width: 0.4),
),
),
initialValue: bloc.getMyDetail()!.set!.toStringAsFixed(0),
focusNode: _nodeText1,
keyboardType: TextInputType.number,
style: GoogleFonts.archivoBlack(fontSize: 60, color: Colors.yellow[200]),
onChanged: (value) => {bloc.add(TrainingPlanSetChange(detail: bloc.getMyDetail()!, set: int.parse(value)))}),
Divider(),
TextFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 25, top: 5, bottom: 5),
labelText: t(unit),
fillColor: Colors.white24,
labelStyle: GoogleFonts.inter(fontSize: 20, color: Colors.yellow[50]),
filled: true,
border: OutlineInputBorder(
gapPadding: 4.0,
borderRadius: BorderRadius.circular(12.0),
borderSide: BorderSide(color: Colors.green[50]!, width: 0.4),
),
),
focusNode: _nodeText2,
initialValue: bloc.getMyDetail()!.repeats!.toStringAsFixed(0),
keyboardType: TextInputType.number,
style: GoogleFonts.archivoBlack(fontSize: 60, color: Colors.yellow[200]),
onChanged: (value) => bloc.add(TrainingPlanRepeatsChange(detail: bloc.getMyDetail()!, repeats: int.parse(value))),
),
Divider(),
weightVisible
? TextFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 25, top: 5, bottom: 5),
labelText: t('Weight'),
fillColor: Colors.white24,
labelStyle: GoogleFonts.inter(fontSize: 20, color: Colors.yellow[50]),
filled: true,
border: OutlineInputBorder(
gapPadding: 2.0,
borderRadius: BorderRadius.circular(12.0),
borderSide: BorderSide(color: Colors.green[50]!, width: 0.4),
),
),
focusNode: _nodeText3,
initialValue: bloc.getMyDetail()!.weight!.toStringAsFixed(1),
keyboardType: TextInputType.numberWithOptions(decimal: true),
style: GoogleFonts.archivoBlack(fontSize: 60, color: Colors.yellow[200]),
onChanged: (value) => {
if (value.isNotEmpty)
{
value = value.replaceFirst(",", "."),
value = value.replaceAll(RegExp(r'[^0-9.]'), ""),
bloc.add(TrainingPlanWeightChange(detail: bloc.getMyDetail()!, weight: double.parse(value))),
}
})
: Offstage(),
Divider(),
Text(
summary,
style: TextStyle(fontSize: 24, fontWeight: FontWeight.normal, color: Colors.yellow[50]),
),
Divider(),
Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
TextButton(
onPressed: () => {
bloc.add(TrainingPlanAddExerciseType()),
Navigator.of(context).popAndPushNamed("myTrainingPlanCustom"),
},
child: Stack(
alignment: Alignment.center,
children: [
Image.asset('asset/icon/gomb_zold_b-1.png', width: 140, height: 60),
Text(
t("Save"),
style: TextStyle(fontSize: 16, color: Colors.white),
),
],
)),
],
),
]),
)))),
));
}
}

View File

@ -9,6 +9,7 @@ import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:aitrainer_app/widgets/menu_image.dart';
import 'package:aitrainer_app/widgets/victory_widget.dart';
import 'package:extended_tabs/extended_tabs.dart';
import 'package:ezanimation/ezanimation.dart';
import 'package:flutter/cupertino.dart';
@ -48,7 +49,44 @@ class _TrainingPlanExecutePageState extends State<TrainingPlanExecutePage> with
if (state is TrainingPlanError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white))));
} else if (state is TrainingPlanFinished) {}
} else if (state is TrainingPlanDayFinished) {
showDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return Victory(
victory: true,
);
});
bloc!.celebrating = false;
} else if (state is TrainingPlanDayReadyToRestart) {
if (!bloc!.celebrating) {
showCupertinoDialog(
useRootNavigator: true,
context: context,
builder: (_) => CupertinoAlertDialog(
title: Text(t("The training is finished")),
content: Column(children: [Divider(), Text(t("Do you want to restart, or select a new Training Plan?"))]),
actions: [
TextButton(
child: Text(t("New Training Plan"), textAlign: TextAlign.center),
onPressed: () => {
Navigator.pop(context),
Navigator.of(context).popAndPushNamed('myTrainingPlans'),
bloc!.restarting = false,
}),
TextButton(
child: Text(t("Restart")),
onPressed: () {
bloc!.restart();
Navigator.pop(context);
Navigator.of(context).popAndPushNamed('home');
},
)
],
));
}
}
}, builder: (context, state) {
return ModalProgressHUD(
child: ExerciseTabs(bloc: bloc!),
@ -66,7 +104,7 @@ class _TrainingPlanExecutePageState extends State<TrainingPlanExecutePage> with
backgroundColor: Colors.orange[800],
icon: Icon(CustomIcon.weight_hanging),
label: Text(
t("Training!"),
t("Training") + "!",
style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 16),
),
),
@ -88,7 +126,7 @@ class _ExerciseTabs extends State<ExerciseTabs> with TickerProviderStateMixin {
void initState() {
super.initState();
tabController = TabController(length: widget.bloc.dayNames.length, vsync: this);
tabController.animateTo(0, duration: Duration(milliseconds: 300));
tabController.animateTo(widget.bloc.activeDayIndex, duration: Duration(milliseconds: 300));
}
@override
@ -107,6 +145,7 @@ class _ExerciseTabs extends State<ExerciseTabs> with TickerProviderStateMixin {
ExtendedTabBar(
tabs: getTabNames(),
controller: tabController,
onTap: (index) => bloc.activeDayIndex = index,
),
Expanded(
child: ExtendedTabBarView(
@ -257,7 +296,6 @@ class _ExerciseListState extends State<ExerciseList> with Trans {
} else {
startText = bloc.isStarted() ? t("Continue your training") : t("Start your training");
explainingText = bloc.getMyPlan()!.name != null ? bloc.getMyPlan()!.name! : "";
print(" *** Plan NAME ${bloc.getMyPlan()!.name}");
}
return TimelineTile(
@ -393,7 +431,6 @@ class _ExerciseListState extends State<ExerciseList> with Trans {
bloc.getMyPlan()!.days[widget.dayName] != null &&
bloc.getMyPlan()!.days[widget.dayName]!.isNotEmpty) {
bloc.getMyPlan()!.days[widget.dayName]!.forEach((element) {
//bloc.getMyPlan()!.details.forEach((element) {
tiles.add(GestureDetector(
onTap: () => bloc.getNext() != null ? executeExercise(bloc, bloc.getNext()!, context) : Navigator.of(context).pushNamed('home'),
child: ExerciseTile(
@ -670,7 +707,7 @@ class _ExerciseTileState extends State<ExerciseTile> with Trans {
style: GoogleFonts.inter(fontSize: 12, color: done ? Colors.grey[100] : Colors.white, fontWeight: FontWeight.bold)),
]),
)),
done
/* done
? AnimatedBuilder(
animation: animation,
builder: (context, snapshot) {
@ -682,7 +719,7 @@ class _ExerciseTileState extends State<ExerciseTile> with Trans {
Text("Result", style: GoogleFonts.inter(fontSize: 10, color: Colors.white)),
]);
})
: Offstage(),
: Offstage(), */
isTest
? AnimatedBuilder(
animation: animation,

View File

@ -52,6 +52,7 @@ class MyTrainingPlans extends StatelessWidget with Trans, Logging {
} else if (state is TrainingPlanFinished) {
Navigator.of(context).pop();
final TrainingPlanBloc bloc = BlocProvider.of<TrainingPlanBloc>(context);
bloc.setMyPlan(Cache().myTrainingPlan);
Navigator.of(context).pushNamed("myTrainingPlanExecute", arguments: bloc);
}
},
@ -76,7 +77,8 @@ class MyTrainingPlans extends StatelessWidget with Trans, Logging {
delegate: SliverChildListDelegate([
getTrainingPlan(t("My Active Training"), "asset/image/exercise_plan_execute.jpg", "",
color: Colors.yellow[400]!, route: "myTrainingPlanExecute"),
getTrainingPlan(t("My Custom Plan"), "asset/image/exercise_plan_custom.jpg", ""),
getTrainingPlan(t("My Custom Plan"), "asset/image/exercise_plan_custom.jpg", "",
color: Colors.green[100]!, route: "myTrainingPlanCustom"),
getTrainingPlan(t("Training Plans for Beginners"), "asset/menu/training_plans_q_beginner.jpg", "beginner"),
getTrainingPlan(t("Training Plans for Home"), "asset/menu/training_plans_q_home.jpg", "home"),
getTrainingPlan(t("Training Plans Advanced"), "asset/menu/training_plans_q_advanced.jpg", "advanced"),
@ -104,7 +106,7 @@ class MyTrainingPlans extends StatelessWidget with Trans, Logging {
textAlignment: Alignment.topLeft,
text: name,
style: GoogleFonts.robotoMono(
textStyle: TextStyle(fontSize: 14, color: color, fontWeight: FontWeight.bold, backgroundColor: Colors.black54.withOpacity(0.4))),
textStyle: TextStyle(fontSize: 12, color: color, fontWeight: FontWeight.bold, backgroundColor: Colors.black54.withOpacity(0.4))),
image: imageUrl,
left: 5,
textColor: color,
@ -113,7 +115,11 @@ class MyTrainingPlans extends StatelessWidget with Trans, Logging {
if (route == "myTrainingPlanActivate") {
HashMap<String, dynamic> args = HashMap();
args['parentName'] = parentName;
Navigator.of(context).pushNamed("myTrainingPlanActivate", arguments: args);
Navigator.of(context).pushNamed(route, arguments: args);
} else if (route == "myTrainingPlanExecute") {
final TrainingPlanBloc bloc = BlocProvider.of<TrainingPlanBloc>(context);
bloc.setMyPlan(Cache().myTrainingPlan);
Navigator.of(context).pushNamed(route);
} else {
Navigator.of(context).pushNamed(route);
}

View File

@ -103,7 +103,7 @@ class _AppBarNav extends State<AppBarNav> with SingleTickerProviderStateMixin, C
}
else if (widget.depth != null)
{
if (widget.depth == 0) {Navigator.of(context).pushNamed('home')} else {Navigator.of(context).pop()}
if (widget.depth == 0) {Navigator.of(context).popAndPushNamed('home')} else {Navigator.of(context).pop()}
}
},
));

View File

@ -77,32 +77,27 @@ class _NawDrawerWidget extends State<BottomNavigator> with Trans, Logging {
widget.bottomNavIndex = index;
switch (index) {
case 0:
Navigator.of(context).pop();
Track().track(TrackingEvent.home);
Navigator.of(context).pushNamed('home');
Navigator.of(context).popAndPushNamed('home');
break;
case 1:
Navigator.of(context).pop();
Track().track(TrackingEvent.my_development);
Navigator.of(context).pushNamed('myDevelopment');
Navigator.of(context).popAndPushNamed('myDevelopment');
break;
case 2:
Navigator.of(context).pop();
Track().track(TrackingEvent.my_exerciseplan);
Navigator.of(context).pushNamed('myTrainingPlans');
Navigator.of(context).popAndPushNamed('myTrainingPlans');
break;
case 3:
Navigator.of(context).pop();
Track().track(TrackingEvent.account);
Navigator.of(context).pushNamed('account');
Navigator.of(context).popAndPushNamed('account');
break;
case 4:
Navigator.of(context).pop();
Track().track(TrackingEvent.settings);
Navigator.of(context).pushNamed('settings');
Navigator.of(context).popAndPushNamed('settings');
break;
}

View File

@ -94,7 +94,7 @@ class ImageButton extends StatelessWidget {
child: Text(text,
maxLines: 2,
style: GoogleFonts.archivoBlack(
fontSize: 16,
fontSize: 15,
color: textColor,
shadows: <Shadow>[
Shadow(

View File

@ -309,7 +309,7 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
} else {
Track().track(TrackingEvent.search, eventValue: value.exerciseType!.name);
menuBloc.ability = ExerciseAbility.oneRepMax;
Navigator.of(context).pushNamed('exerciseNewPage', arguments: value.exerciseType);
Navigator.of(context).popAndPushNamed('exerciseNewPage', arguments: value.exerciseType);
}
},
),
@ -328,7 +328,7 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
if (Cache().myTrainingPlan != null) {
final TrainingPlanBloc bloc = BlocProvider.of<TrainingPlanBloc>(context);
bloc.setMyPlan(Cache().myTrainingPlan);
Navigator.of(context).pushNamed("myTrainingPlanExecute");
Navigator.of(context).popAndPushNamed("myTrainingPlanExecute");
}
},
onCancel: () => {
@ -348,11 +348,11 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
);
}))
: Offstage(),
activeExercisePlan
/* activeExercisePlan
? SizedBox(
width: 10,
)
: Offstage(),
: Offstage(), */
Cache().activeExercisePlan != null
? GestureDetector(
onTap: () => showDialog(
@ -367,7 +367,7 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
Navigator.of(context).pop(),
if (Cache().activeExercisePlan != null)
{
Navigator.of(context).pushNamed("testSetExecute"),
Navigator.of(context).popAndPushNamed("testSetExecute"),
}
},
onCancel: () => {
@ -399,7 +399,6 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
void menuClick(WorkoutMenuTree workoutTree, MenuBloc menuBloc) {
if (tutorialBloc.isActive) {
final String checkText = workoutTree.nameEnglish;
print("Click: tutorial is active $checkText");
if (!tutorialBloc.checkAction(checkText)) {
return;
}
@ -412,7 +411,6 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
Navigator.of(context).pushNamed('testSetEdit', arguments: args);
} else if (menuBloc.ability != null && ExerciseAbility.training.equalsTo(menuBloc.ability!) && workoutTree.parent != 0) {
HashMap<String, dynamic> args = HashMap();
print("menu ${workoutTree.internalName}");
args['parentName'] = workoutTree.internalName;
Navigator.of(context).pushNamed("myTrainingPlanActivate", arguments: args);
}