From d5deaf48a9e01d667de88a488f601cdd5999e27b Mon Sep 17 00:00:00 2001 From: bossanyit Date: Wed, 2 Jun 2021 17:25:35 +0200 Subject: [PATCH] WT1.1.8+3 custom plan and training plan fixes --- android/app/build.gradle | 2 +- asset/menu/lateral_raises.jpg | Bin 0 -> 74111 bytes .../menu/wide_grip_front_lateral_pulldown.jpg | Bin 0 -> 105565 bytes i18n/en.json | 533 ++++++++---------- i18n/hu.json | 526 ++++++++--------- ios/Runner.xcodeproj/project.pbxproj | 6 +- .../exercise_plan/exercise_plan_bloc.dart | 8 +- .../training_plan/training_plan_bloc.dart | 272 ++++++++- .../training_plan/training_plan_event.dart | 41 +- .../training_plan/training_plan_state.dart | 8 + lib/main.dart | 10 +- lib/model/customer_training_plan.dart | 10 + lib/model/exercise_type.dart | 5 + lib/repository/workout_tree_repository.dart | 5 +- lib/util/enums.dart | 8 + lib/view/training_plan_activate_page.dart | 16 +- lib/view/training_plan_custom.dart | 372 ++++++++++++ lib/view/training_plan_custom_add.dart | 259 +++++++++ lib/view/training_plan_execute_page.dart | 51 +- ...ans_page.dart => training_plans_page.dart} | 12 +- lib/widgets/app_bar.dart | 2 +- lib/widgets/bottom_nav.dart | 15 +- lib/widgets/image_button.dart | 2 +- lib/widgets/menu_page_widget.dart | 12 +- 24 files changed, 1561 insertions(+), 614 deletions(-) create mode 100644 asset/menu/lateral_raises.jpg create mode 100644 asset/menu/wide_grip_front_lateral_pulldown.jpg create mode 100644 lib/view/training_plan_custom.dart create mode 100644 lib/view/training_plan_custom_add.dart rename lib/view/{my_training_plans_page.dart => training_plans_page.dart} (90%) diff --git a/android/app/build.gradle b/android/app/build.gradle index eb7b488..711670d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -45,7 +45,7 @@ android { defaultConfig { applicationId "com.aitrainer.aitrainer_app" - minSdkVersion 18 + minSdkVersion 20 targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/asset/menu/lateral_raises.jpg b/asset/menu/lateral_raises.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8bece3021c5b118ae7a17c953d5c6236ad0f149c GIT binary patch literal 74111 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 z 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 EA7KM{*#H0l literal 0 HcmV?d00001 diff --git a/i18n/en.json b/i18n/en.json index a0ee8f3..84b92b7 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -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": "

Ectomorph is your body type if:

  • You have basically a thin physique like a long-distance runner
  • Long limbs and narrow shoulders are typical of you
  • You have difficulties to build muscles
  • If your chest and waist are almost the same width
  • You lose muscle easily
  • You have a relatively low body fat percentage


We can’t 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.

", - "Endomorph_desc":"

This is your body type if you feel that your physique is the sharp opposite of ectomorph and:

  • Despite of your strong-looking physique, your muscles are less visually outlined
  • Getting rid of excess fat is difficult for you
  • You get stronger very easily
  • Your rib cage is wide and large
  • You have thick and strong joints
  • If your hips are wide and strong

We can’t 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.

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.

", - "Mesomorph_desc":"

This is your body type if:

  • You have an athletic physique like a sprinter, swimmer or gymnast
  • Wide clavicles and shoulders are typical of you
  • Your body is symmetrical
  • You have narrow hips and sporty, narrow waist
  • You have basically thinner joints but strong bones
  • Mesomorphs are more muscular than ectomorphs
  • You get muscular quickly
  • A mesomorph person has thicker bones and joints than an ectomorph
  • Your chest is wide compared to your waist
  • You have stronger calves and forearms than an ectomorph

We can’t 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.

", - - + "Endomorph_desc": "

This is your body type if you feel that your physique is the sharp opposite of ectomorph and:

  • Despite of your strong-looking physique, your muscles are less visually outlined
  • Getting rid of excess fat is difficult for you
  • You get stronger very easily
  • Your rib cage is wide and large
  • You have thick and strong joints
  • If your hips are wide and strong

We can’t 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.

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.

", + "Mesomorph_desc": "

This is your body type if:

  • You have an athletic physique like a sprinter, swimmer or gymnast
  • Wide clavicles and shoulders are typical of you
  • Your body is symmetrical
  • You have narrow hips and sporty, narrow waist
  • You have basically thinner joints but strong bones
  • Mesomorphs are more muscular than ectomorphs
  • You get muscular quickly
  • A mesomorph person has thicker bones and joints than an ectomorph
  • Your chest is wide compared to your waist
  • You have stronger calves and forearms than an ectomorph

We can’t 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.

", "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":"

Why is a test exercise necessary?


Why do we recommend completing them?

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.

Based on this, you can perform the exercises in a customized way later.

What does it mean?

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!

Furthermore, you can also create your own training day in the custom training plan menu within the app.

Don’t 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.

C’mon go for it!

", - "Summary of your test":"Summary of your test", - "Test":"Test", + "controlexercise_desc": "

Why is a test exercise necessary?


Why do we recommend completing them?

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.

Based on this, you can perform the exercises in a customized way later.

What does it mean?

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!

Furthermore, you can also create your own training day in the custom training plan menu within the app.

Don’t 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.

C’mon go for it!

", + "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": "

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!

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!

What is 1RM?

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.

", - "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":"

It shows which muscle group test did your achieved already.

When do you reach the 100% test round?


If you have sucessfully tested one of the base exercises of each muscle group

", - - "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": "

It shows which muscle group test did your achieved already.

When do you reach the 100% test round?


If you have sucessfully tested one of the base exercises of each muscle group

", + "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." } \ No newline at end of file diff --git a/i18n/hu.json b/i18n/hu.json index b82ba8b..ec76d92 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -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": "

A Te testtípusod, ha:

  • alapvetően vékony testalkat vagy, mint a hosszútávfutók
  • hosszú végtagok, keskenyebb vállak
  • nehezen tudsz izomtömeget növelni
  • Mellkas és a derék szinte egyforma szélességű
  • Könnyen elveszíted a felszedett izmot
  • Meglehetősen alacsony a testzsírszázalék jellemez

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.

", - "Endomorph_desc":"

A te testtípusod, ha úgy érzed, hogy a testalkatod az ektomorf szöges ellentéte.

  • Ha az erős megjelenésű testalkatod ellenére kevésbé érvényesülnek vizuálisan az izmok.
  • Ha nehezen szabadulsz meg a fölöslegtől
  • Nagyon könnyen erősödsz
  • Széles nagy térfogatú a bordakosár
  • Vastag erős ízületeid vannak
  • Ha a csípőben vagy erősebb

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ó.

", - "Mesomorph_desc":"

A testtípusod, ha

  • Sportos testalkat vagy, mint egy sprinter, úszó vagy tornász
  • Széles kulcscsontok és vállak
  • Szimmetrikus felépítés
  • Keskeny csípő és sportos keskeny derék
  • alapvetően vékonyabb ízületek, de erős csontok jellemeznek
  • izmosabbak, mint az ektomorfok
  • Gyorsan izmosodsz
  • vastagabbak a csontok és az ízületek az ekromorfhoz képest
  • mellkas a derékhez képest széles
  • erősebb vádli és alkar

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.

", - + "Meso-Endomorph": "Mezo-Endomorf", + "Ectomorph_desc": "

A Te testtípusod, ha:

  • alapvetően vékony testalkat vagy, mint a hosszútávfutók
  • hosszú végtagok, keskenyebb vállak
  • nehezen tudsz izomtömeget növelni
  • Mellkas és a derék szinte egyforma szélességű
  • Könnyen elveszíted a felszedett izmot
  • Meglehetősen alacsony a testzsírszázalék jellemez

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.

", + "Endomorph_desc": "

A te testtípusod, ha úgy érzed, hogy a testalkatod az ektomorf szöges ellentéte.

  • Ha az erős megjelenésű testalkatod ellenére kevésbé érvényesülnek vizuálisan az izmok.
  • Ha nehezen szabadulsz meg a fölöslegtől
  • Nagyon könnyen erősödsz
  • Széles nagy térfogatú a bordakosár
  • Vastag erős ízületeid vannak
  • Ha a csípőben vagy erősebb

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ó.

", + "Mesomorph_desc": "

A testtípusod, ha

  • Sportos testalkat vagy, mint egy sprinter, úszó vagy tornász
  • Széles kulcscsontok és vállak
  • Szimmetrikus felépítés
  • Keskeny csípő és sportos keskeny derék
  • alapvetően vékonyabb ízületek, de erős csontok jellemeznek
  • izmosabbak, mint az ektomorfok
  • Gyorsan izmosodsz
  • vastagabbak a csontok és az ízületek az ekromorfhoz képest
  • mellkas a derékhez képest széles
  • erősebb vádli és alkar

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.

", "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":"

Miért csináld meg a tesztgyakorlatokat?

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.

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.

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á!

", - - "Test":"Teszt", + "controlexercise_desc": "

Miért csináld meg a tesztgyakorlatokat?

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.

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.

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á!

", + "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":"

Az előrehaladás jelző megmutatja, hogy hány százalékon állsz a tesztek végrehajtásában.

Mikor éred el a 100%-os tesztkört?


Ha minden izomcsoportnál legalább egy alapgyakorlatot teljesítesz.

Az alapgyakorlatokat a menüponton narancssárgya alap pecséttel jelöltük

", - - "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": "

Az előrehaladás jelző megmutatja, hogy hány százalékon állsz a tesztek végrehajtásában.

Mikor éred el a 100%-os tesztkört?


Ha minden izomcsoportnál legalább egy alapgyakorlatot teljesítesz.

Az alapgyakorlatokat a menüponton narancssárgya alap pecséttel jelöltük

", + "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." } \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index b8acaf4..93efb97 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -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 = ( diff --git a/lib/bloc/exercise_plan/exercise_plan_bloc.dart b/lib/bloc/exercise_plan/exercise_plan_bloc.dart index f0d64ff..2a75e99 100644 --- a/lib/bloc/exercise_plan/exercise_plan_bloc.dart +++ b/lib/bloc/exercise_plan/exercise_plan_bloc.dart @@ -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 { menuTreeRepository.sortByMuscleType(); menuTreeRepository.sortedTree.forEach((key, value) { + print("menutree $key"); List listWorkoutTree = value; listWorkoutTree.forEach((workoutTree) { workoutTree.selected = false; @@ -48,9 +50,13 @@ class ExercisePlanBloc extends Bloc { Stream 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(); } diff --git a/lib/bloc/training_plan/training_plan_bloc.dart b/lib/bloc/training_plan/training_plan_bloc.dart index b3eb374..d2a537c 100644 --- a/lib/bloc/training_plan/training_plan_bloc.dart +++ b/lib/bloc/training_plan/training_plan_bloc.dart @@ -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 { TrainingPlanBloc({required this.trainingPlanRepository, required this.menuBloc}) : super(TrainingPlanInitial()); CustomerTrainingPlan? _myPlan; + CustomerTrainingPlanDetails? _myDetail; + bool started = false; final List 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 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 menuList = list as List; + menuList.forEach((element) { + element.exerciseType!.trainingPlanState = ExerciseTypeTrainingPlanState.none; + }); + }); this.activateDays(); Cache().myTrainingPlan = _myPlan; await Cache().saveMyTrainingPlan(); @@ -47,6 +67,12 @@ class TrainingPlanBloc extends Bloc { 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 { 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 { } } + 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 { _myPlan!.days[""] = []; _myPlan!.days[""]!.addAll(_myPlan!.details); } + getActiveDayIndex(); } CustomerTrainingPlanDetails? getTrainingPlanDetail(int trainingPlanDetailsId) { @@ -177,6 +309,7 @@ class TrainingPlanBloc extends Bloc { } } print("Next detail $next"); + return next; } @@ -192,6 +325,18 @@ class TrainingPlanBloc extends Bloc { } } + 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 { } 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 { 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); + } } diff --git a/lib/bloc/training_plan/training_plan_event.dart b/lib/bloc/training_plan/training_plan_event.dart index 7547119..673f976 100644 --- a/lib/bloc/training_plan/training_plan_event.dart +++ b/lib/bloc/training_plan/training_plan_event.dart @@ -37,6 +37,15 @@ class TrainingPlanRepeatsChange extends TrainingPlanEvent { List get props => [repeats, detail]; } +class TrainingPlanSetChange extends TrainingPlanEvent { + final CustomerTrainingPlanDetails detail; + final int set; + const TrainingPlanSetChange({required this.set, required this.detail}); + + @override + List 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 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 get props => [detail]; } + +class TrainingPlanAddExerciseType extends TrainingPlanEvent { + const TrainingPlanAddExerciseType(); +} + +class TrainingPlanDeleteExerciseType extends TrainingPlanEvent { + final ExerciseType exerciseType; + const TrainingPlanDeleteExerciseType({required this.exerciseType}); + + @override + List get props => [exerciseType]; +} + +class TrainingPlanCustomAddLoad extends TrainingPlanEvent { + final ExerciseType exerciseType; + const TrainingPlanCustomAddLoad({required this.exerciseType}); + + @override + List get props => [exerciseType]; +} diff --git a/lib/bloc/training_plan/training_plan_state.dart b/lib/bloc/training_plan/training_plan_state.dart index 9d30710..4479945 100644 --- a/lib/bloc/training_plan/training_plan_state.dart +++ b/lib/bloc/training_plan/training_plan_state.dart @@ -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}); diff --git a/lib/main.dart b/lib/main.dart index faabc77..95e7f14 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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 main() async { BlocProvider( create: (BuildContext context) => ExercisePlanBloc(menuTreeRepository: menuTreeRepository), ), - BlocProvider( - create: (BuildContext context) => ExerciseExecutePlanBloc(menuTreeRepository: menuTreeRepository), - ), BlocProvider( 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(), diff --git a/lib/model/customer_training_plan.dart b/lib/model/customer_training_plan.dart index 4a12a46..8dca970 100644 --- a/lib/model/customer_training_plan.dart +++ b/lib/model/customer_training_plan.dart @@ -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 details = []; diff --git a/lib/model/exercise_type.dart b/lib/model/exercise_type.dart index d17079d..3e5480e 100644 --- a/lib/model/exercise_type.dart +++ b/lib/model/exercise_type.dart @@ -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) { diff --git a/lib/repository/workout_tree_repository.dart b/lib/repository/workout_tree_repository.dart index c722f40..27076d9 100644 --- a/lib/repository/workout_tree_repository.dart +++ b/lib/repository/workout_tree_repository.dart @@ -299,10 +299,7 @@ class WorkoutTreeRepository with Logging { sortedTree = SplayTreeMap>(); 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); diff --git a/lib/util/enums.dart b/lib/util/enums.dart index 167dc99..7d156d6 100644 --- a/lib/util/enums.dart +++ b/lib/util/enums.dart @@ -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; +} diff --git a/lib/view/training_plan_activate_page.dart b/lib/view/training_plan_activate_page.dart index abc7413..c5de826 100644 --- a/lib/view/training_plan_activate_page.dart +++ b/lib/view/training_plan_activate_page.dart @@ -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, ))), ], diff --git a/lib/view/training_plan_custom.dart b/lib/view/training_plan_custom.dart new file mode 100644 index 0000000..af2d877 --- /dev/null +++ b/lib/view/training_plan_custom.dart @@ -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 with Trans { + TrainingPlanBloc? bloc; + final GlobalKey _scaffoldKey = new GlobalKey(); + + @override + Widget build(BuildContext context) { + setContext(context); + bloc = BlocProvider.of(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(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 _getTreeChildren(TrainingPlanBloc bloc) { + List 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 getTiles(List list, TrainingPlanBloc bloc) { + List tiles = []; + tiles.addAll(getExerciseTiles(bloc, list)); + return tiles; + } + + List getExerciseTiles(TrainingPlanBloc bloc, List listWorkoutTree) { + List 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 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( + 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, + )), + ]), + )), + ]), + ), + ), + ); + } +} diff --git a/lib/view/training_plan_custom_add.dart b/lib/view/training_plan_custom_add.dart new file mode 100644 index 0000000..b0b96da --- /dev/null +++ b/lib/view/training_plan_custom_add.dart @@ -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 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( + 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(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: [ + 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), + ), + ], + )), + ], + ), + ]), + )))), + )); + } +} diff --git a/lib/view/training_plan_execute_page.dart b/lib/view/training_plan_execute_page.dart index 05829eb..e9102ce 100644 --- a/lib/view/training_plan_execute_page.dart +++ b/lib/view/training_plan_execute_page.dart @@ -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 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 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 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 with TickerProviderStateMixin { ExtendedTabBar( tabs: getTabNames(), controller: tabController, + onTap: (index) => bloc.activeDayIndex = index, ), Expanded( child: ExtendedTabBarView( @@ -257,7 +296,6 @@ class _ExerciseListState extends State 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 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 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 with Trans { Text("Result", style: GoogleFonts.inter(fontSize: 10, color: Colors.white)), ]); }) - : Offstage(), + : Offstage(), */ isTest ? AnimatedBuilder( animation: animation, diff --git a/lib/view/my_training_plans_page.dart b/lib/view/training_plans_page.dart similarity index 90% rename from lib/view/my_training_plans_page.dart rename to lib/view/training_plans_page.dart index 44814e1..f6a24bc 100644 --- a/lib/view/my_training_plans_page.dart +++ b/lib/view/training_plans_page.dart @@ -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(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 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(context); + bloc.setMyPlan(Cache().myTrainingPlan); + Navigator.of(context).pushNamed(route); } else { Navigator.of(context).pushNamed(route); } diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index 3692690..482ce6d 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -103,7 +103,7 @@ class _AppBarNav extends State 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()} } }, )); diff --git a/lib/widgets/bottom_nav.dart b/lib/widgets/bottom_nav.dart index 8617cd6..f6612d6 100644 --- a/lib/widgets/bottom_nav.dart +++ b/lib/widgets/bottom_nav.dart @@ -77,32 +77,27 @@ class _NawDrawerWidget extends State 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; } diff --git a/lib/widgets/image_button.dart b/lib/widgets/image_button.dart index 86e6b32..c935bf2 100644 --- a/lib/widgets/image_button.dart +++ b/lib/widgets/image_button.dart @@ -94,7 +94,7 @@ class ImageButton extends StatelessWidget { child: Text(text, maxLines: 2, style: GoogleFonts.archivoBlack( - fontSize: 16, + fontSize: 15, color: textColor, shadows: [ Shadow( diff --git a/lib/widgets/menu_page_widget.dart b/lib/widgets/menu_page_widget.dart index 4b144d4..2d08b1b 100644 --- a/lib/widgets/menu_page_widget.dart +++ b/lib/widgets/menu_page_widget.dart @@ -309,7 +309,7 @@ class _MenuPageWidgetState extends State 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 with Trans, Logging { if (Cache().myTrainingPlan != null) { final TrainingPlanBloc bloc = BlocProvider.of(context); bloc.setMyPlan(Cache().myTrainingPlan); - Navigator.of(context).pushNamed("myTrainingPlanExecute"); + Navigator.of(context).popAndPushNamed("myTrainingPlanExecute"); } }, onCancel: () => { @@ -348,11 +348,11 @@ class _MenuPageWidgetState extends State 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 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 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 with Trans, Logging { Navigator.of(context).pushNamed('testSetEdit', arguments: args); } else if (menuBloc.ability != null && ExerciseAbility.training.equalsTo(menuBloc.ability!) && workoutTree.parent != 0) { HashMap args = HashMap(); - print("menu ${workoutTree.internalName}"); args['parentName'] = workoutTree.internalName; Navigator.of(context).pushNamed("myTrainingPlanActivate", arguments: args); }