diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 2b438212ad3f4..8496681b7c2cb 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1777,6 +1777,9 @@ While in Incognito, sites can't use cookies to see your browsing activity across
       <message name="IDS_IOS_PARTIAL_TRANSLATE_ACTION_TRANSLATE_FULL_PAGE" desc="The action button to translate the full page (Title Case).">
         Translate Full Page
       </message>
+      <message name="IDS_IOS_PARTIAL_TRANSLATE_EDIT_MENU_ENTRY" desc="Action displayed in Edit Menu to trigger Partial Translate. As an action, it should be an infinitive verb, but should also respect the 'Google Translate' branding. Possible variations are 'Google Translate' or 'Translate with Google' are acceptable to meet those criteria [MAX_LENGTH=25em].">
+        Google Translate
+      </message>
       <message name="IDS_IOS_PARTIAL_TRANSLATE_ERROR_GENERIC" desc="Error message when when the process failed (unknown reason).">
         Partial translation failed.
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARTIAL_TRANSLATE_EDIT_MENU_ENTRY.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARTIAL_TRANSLATE_EDIT_MENU_ENTRY.png.sha1
new file mode 100644
index 0000000000000..f2d8f327109f3
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARTIAL_TRANSLATE_EDIT_MENU_ENTRY.png.sha1
@@ -0,0 +1 @@
+71ce1af2b892c6c849ff7d0236616d7acd959458
\ No newline at end of file
diff --git a/ios/chrome/browser/ui/browser_container/BUILD.gn b/ios/chrome/browser/ui/browser_container/BUILD.gn
index 2e153b247886b..bee64caf34499 100644
--- a/ios/chrome/browser/ui/browser_container/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_container/BUILD.gn
@@ -63,6 +63,7 @@ source_set("ui") {
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/link_to_text",
+    "//ios/chrome/browser/ui/partial_translate",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common/ui/util",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/browser_container/browser_container_coordinator.mm b/ios/chrome/browser/ui/browser_container/browser_container_coordinator.mm
index 16b225d18ce11..b411e9fd06c3a 100644
--- a/ios/chrome/browser/ui/browser_container/browser_container_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_container/browser_container_coordinator.mm
@@ -106,6 +106,8 @@
     id<BrowserCoordinatorCommands> handler =
         HandlerForProtocol(dispatcher, BrowserCoordinatorCommands);
     self.partialTranslateMediator.browserHandler = handler;
+    self.browserEditMenuHandler.partialTranslateDelegate =
+        self.partialTranslateMediator;
   }
 
   [self.webContentAreaOverlayContainerCoordinator start];
diff --git a/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.h b/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.h
index 9e2880560fc1c..99db7e904f83a 100644
--- a/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.h
+++ b/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.h
@@ -8,6 +8,7 @@
 #import <UIKit/UIKit.h>
 
 @protocol LinkToTextDelegate;
+@protocol PartialTranslateDelegate;
 
 // A handler for the Browser edit menu.
 // This class is in charge of customising the menu and executing the commands.
@@ -15,6 +16,10 @@
 // The delegate to handle link to text button selection.
 @property(nonatomic, weak) id<LinkToTextDelegate> linkToTextDelegate;
 
+// The delegate to handle Partial Translate button selection.
+@property(nonatomic, weak) id<PartialTranslateDelegate>
+    partialTranslateDelegate;
+
 // Will be called by `BrowserContainerViewController buildMenuWithBuilder:`
 // to customize its edit menu.
 - (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder;
diff --git a/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.mm b/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.mm
index 72233aedc53ba..f9b607a865736 100644
--- a/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.mm
+++ b/ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.mm
@@ -5,7 +5,9 @@
 #import "ios/chrome/browser/ui/browser_container/browser_edit_menu_handler.h"
 
 #import "base/feature_list.h"
-#import "ios/chrome/browser/ui/link_to_text/link_to_text_mediator.h"
+#import "base/mac/foundation_util.h"
+#import "ios/chrome/browser/ui/link_to_text/link_to_text_delegate.h"
+#import "ios/chrome/browser/ui/partial_translate/partial_translate_delegate.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/grit/ios_strings.h"
@@ -16,11 +18,24 @@
 #endif
 
 @interface BrowserEditMenuHandler ()
+
+// A cache for the first responder that is reset on the next runloop.
+@property(nonatomic, weak) UIResponder* firstResponder;
+
 @end
 
-@implementation BrowserEditMenuHandler
+@implementation BrowserEditMenuHandler {
+  // Keep the original translate command to display partial translate in the
+  // same conditions.
+  UICommand* _originalTranslateCommand;
+}
 
 - (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder {
+  [self addLinkToText:builder];
+  [self addPartialTranslate:builder];
+}
+
+- (void)addLinkToText:(id<UIMenuBuilder>)builder {
   if (!base::FeatureList::IsEnabled(kIOSCustomBrowserEditMenu)) {
     return;
   }
@@ -39,30 +54,132 @@
   [builder insertChildMenu:linkToTextMenu atEndOfMenuForIdentifier:UIMenuRoot];
 }
 
+- (void)addPartialTranslate:(id<UIMenuBuilder>)builder {
+  if (!base::FeatureList::IsEnabled(kIOSEditMenuPartialTranslate)) {
+    return;
+  }
+  NSString* title =
+      l10n_util::GetNSString(IDS_IOS_PARTIAL_TRANSLATE_EDIT_MENU_ENTRY);
+  NSString* partialTranslateId = @"chromecommand.partialTranslate";
+  UICommand* partialTranslateCommand =
+      [UICommand commandWithTitle:title
+                            image:nil
+                           action:@selector(chromePartialTranslate:)
+                     propertyList:partialTranslateId];
+
+  // Translate command is in the lookup menu.
+  // Retrieve the menu so it can be replaced with partial translate.
+  UIMenu* lookupMenu = [builder menuForIdentifier:UIMenuLookup];
+  NSArray* children = lookupMenu.children;
+  NSInteger translateIndex = -1;
+  for (NSUInteger index = 0; index < children.count; index++) {
+    UIMenuElement* element = children[index];
+    // Translate is a command.
+    if (![element isKindOfClass:[UICommand class]]) {
+      continue;
+    }
+    UICommand* command = base::mac::ObjCCast<UICommand>(element);
+    if (command.action != NSSelectorFromString(@"_translate:")) {
+      continue;
+    }
+    _originalTranslateCommand = command;
+    translateIndex = index;
+    break;
+  }
+
+  if (translateIndex == -1) {
+    // Translate command not found. Fallback adding the partial translate before
+    // the lookup menu.
+    // TODO(crbug.com/1417639): Catch this so it can be fixed.
+    UIMenu* partialTranslateMenu =
+        [UIMenu menuWithTitle:title
+                        image:nil
+                   identifier:partialTranslateId
+                      options:UIMenuOptionsDisplayInline
+                     children:@[ partialTranslateCommand ]];
+    [builder insertSiblingMenu:partialTranslateMenu
+        beforeMenuForIdentifier:UIMenuLookup];
+    return;
+  }
+
+  // Rebuild the lookup menu with partial translate
+  NSMutableArray* newChildren = [NSMutableArray arrayWithArray:children];
+  newChildren[translateIndex] = partialTranslateCommand;
+  UIMenu* newPartialTranslate = [UIMenu menuWithTitle:lookupMenu.title
+                                                image:lookupMenu.image
+                                           identifier:lookupMenu.identifier
+                                              options:lookupMenu.options
+                                             children:newChildren];
+
+  [builder replaceMenuForIdentifier:UIMenuLookup withMenu:newPartialTranslate];
+}
+
 - (void)addEditMenuEntries {
   if (base::FeatureList::IsEnabled(kIOSCustomBrowserEditMenu)) {
     return;
   }
-  if (!base::FeatureList::IsEnabled(kSharedHighlightingIOS)) {
-    return;
+  if (base::FeatureList::IsEnabled(kSharedHighlightingIOS)) {
+    NSString* title = l10n_util::GetNSString(IDS_IOS_SHARE_LINK_TO_TEXT);
+    UIMenuItem* menuItem =
+        [[UIMenuItem alloc] initWithTitle:title action:@selector(linkToText:)];
+    RegisterEditMenuItem(menuItem);
+  }
+  if (base::FeatureList::IsEnabled(kIOSEditMenuPartialTranslate)) {
+    NSString* title =
+        l10n_util::GetNSString(IDS_IOS_PARTIAL_TRANSLATE_EDIT_MENU_ENTRY);
+    UIMenuItem* menuItem =
+        [[UIMenuItem alloc] initWithTitle:title
+                                   action:@selector(chromePartialTranslate:)];
+    RegisterEditMenuItem(menuItem);
   }
-  NSString* title = l10n_util::GetNSString(IDS_IOS_SHARE_LINK_TO_TEXT);
-  UIMenuItem* menuItem =
-      [[UIMenuItem alloc] initWithTitle:title action:@selector(linkToText:)];
-  RegisterEditMenuItem(menuItem);
 }
 
 - (BOOL)canPerformChromeAction:(SEL)action withSender:(id)sender {
   if (action == @selector(linkToText:)) {
     return [self.linkToTextDelegate shouldOfferLinkToText];
   }
+  if (action == @selector(chromePartialTranslate:)) {
+    BOOL canHandlePartialTranslate =
+        [self.partialTranslateDelegate canHandlePartialTranslateSelection];
+    if (canHandlePartialTranslate && [self firstResponder] &&
+        _originalTranslateCommand) {
+      return [[self firstResponder]
+          canPerformAction:_originalTranslateCommand.action
+                withSender:_originalTranslateCommand];
+    }
+    return canHandlePartialTranslate;
+  }
   return NO;
 }
 
+#pragma mark - LinkToTextDelegate methods
+
 - (void)linkToText:(UIMenuItem*)item {
   DCHECK(base::FeatureList::IsEnabled(kSharedHighlightingIOS));
   DCHECK(self.linkToTextDelegate);
   [self.linkToTextDelegate handleLinkToTextSelection];
 }
 
+#pragma mark - PartialTranslateDelegate methods
+
+- (void)chromePartialTranslate:(UIMenuItem*)item {
+  DCHECK(base::FeatureList::IsEnabled(kIOSEditMenuPartialTranslate));
+  DCHECK(self.partialTranslateDelegate);
+  [self.partialTranslateDelegate handlePartialTranslateSelection];
+}
+
+#pragma mark - private methods
+
+- (UIResponder*)firstResponder {
+  if (_firstResponder) {
+    return _firstResponder;
+  }
+  _firstResponder = GetFirstResponder();
+  __weak BrowserEditMenuHandler* weakSelf = self;
+  dispatch_async(dispatch_get_main_queue(), ^{
+    weakSelf.firstResponder = nil;
+  });
+  return _firstResponder;
+}
+
 @end
diff --git a/ios/chrome/browser/ui/partial_translate/partial_translate_delegate.h b/ios/chrome/browser/ui/partial_translate/partial_translate_delegate.h
index daea3b7653dca..b3e4deabe5554 100644
--- a/ios/chrome/browser/ui/partial_translate/partial_translate_delegate.h
+++ b/ios/chrome/browser/ui/partial_translate/partial_translate_delegate.h
@@ -11,6 +11,9 @@
 // Handles the link to text menu item selection.
 - (void)handlePartialTranslateSelection;
 
+// Returns whether a partial translate can be handled.
+- (BOOL)canHandlePartialTranslateSelection;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_PARTIAL_TRANSLATE_PARTIAL_TRANSLATE_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm b/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm
index f0e0fe674b49e..0db0566b99932 100644
--- a/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm
+++ b/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm
@@ -71,6 +71,17 @@
   }));
 }
 
+- (BOOL)canHandlePartialTranslateSelection {
+  DCHECK(base::FeatureList::IsEnabled(kSharedHighlightingIOS));
+  // TODO(crbug.com/1417238): add metrics
+  WebSelectionTabHelper* tabHelper = [self webSelectionTabHelper];
+  if (!tabHelper) {
+    return NO;
+  }
+  return tabHelper->CanRetrieveSelectedText() &&
+         PartialTranslateLimitMaxCharacters() > 0u;
+}
+
 - (void)switchToFullTranslateWithMessage:(NSString*)message {
   // TODO(crbug.com/1417238): add metrics
   if (!self.alertDelegate) {